如何发送/接收消息通过web套接字在windows phone 8使用类ClientWebSocket



这个web套接字是我的同事用javascript写的。我设法联系上了。首先,我必须使用测试帐户登录应用程序。我必须通过json发送电子邮件和密码。我已经安装了Json。Net包使用NuGet.

我在研究中发现的一些代码是这样的,但我不明白如何使用该段发送我的数据。

var buffer = new byte[1024];
var segment = new ArraySegment<byte>(buffer);
webSocket.SendAsync(segment, WebSocketMessageType.Text, true, CancellationToken.None);
当然,我可以使用对象
User user=new User();
user.Email="bla@bla.com";
user.Password="pass";
string json = JsonConvert.SerializeObject(user);

但是它将没有任何用处,因为SendAsync方法只接受段上的字节类型。

所有我想要的是发送数据,如果登录成功,我应该收到关于用户的其他数据(Json格式)。

作为旁注,我对web套接字很陌生,我使用ASP的http协议。. NET WEB API 2.

我不知道Windows Phone 8,但通过你粘贴的代码,它似乎与常规的。net ClientWebSocket相似,所以这里你有一些例子:

public static Task SendString(ClientWebSocket ws, String data, CancellationToken cancellation)
{
    var encoded = Encoding.UTF8.GetBytes(data);
    var buffer = new ArraySegment<Byte>(encoded, 0, encoded.Length);
    return ws.SendAsync(buffer, WebSocketMessageType.Text, true, cancellation);
}
public static async Task<String> ReadString(ClientWebSocket ws)
{
    ArraySegment<Byte> buffer = new ArraySegment<byte>(new Byte[8192]);
    WebSocketReceiveResult result = null;
    using (var ms = new MemoryStream())
    {
        do
        {
            result = await ws.ReceiveAsync(buffer, CancellationToken.None);
            ms.Write(buffer.Array, buffer.Offset, result.Count);
        }
        while (!result.EndOfMessage);
        ms.Seek(0, SeekOrigin.Begin);
        using (var reader = new StreamReader(ms, Encoding.UTF8))
            return reader.ReadToEnd();
    }
}

如果WP8中没有编译或不存在,只需找到一个等效的

@vtortola是一个工作示例,如果您的数据来自多个分段消息,但如果所有数据来自单个消息,您不需要所有这些流来读取消息,您只需要这样做:

public static async Task<String> ReadString(ClientWebSocket socket)
{
    var reciveBuffer = new byte[32000]; 
        
    var result = await socket.ReceiveAsync(new ArraySegment<byte>(reciveBuffer), CancellationToken.None);
    if (result.MessageType == WebSocketMessageType.Close)
    {
         await socket.CloseAsync(WebSocketCloseStatus.NormalClosure, string.Empty, CancellationToken.None);
    }            
    
    return Encoding.ASCII.GetString(reciveBuffer , 0,  result.Count);
}

如果你的信息被分割成多个片段,或者你不知道你的信息是如何发送的,那么你必须使用@vtortola

如果你想继续接收消息,你可以做一会儿,并调用ReadString内部,像这样:

while (socket.State == WebSocketState.Open)
{
    var msg = ReadString(socket)
    
    //do something with your message...
}

相关内容

  • 没有找到相关文章

最新更新