Как отправлять / получать сообщения через веб-сокет в Windows phone 8 с помощью класса ClientWebSocket?

#c#-4.0 #windows-phone-8 #websocket

#c #-4.0 #windows-phone-8 #websocket

Вопрос:

Веб-сокет написан на javascript моим коллегой. Мне удалось подключиться. Прежде всего, я должен войти в приложение, используя тестовую учетную запись. Я должен отправить адрес электронной почты и пароль через json. Я установил Json.Сетевой пакет с использованием 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) о пользователе.

В качестве примечания, я новичок в веб-сокетах, я использовал протоколы http из ASP.NET ВЕБ-API 2.

Ответ №1:

Я понятия не имею о 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, просто найдите эквивалент.

Комментарии:

1. Спасибо за ваш ответ! Тем временем я разобрался (я написал webSockcetObject.Send(JSONObject) и все). Я попытался удалить вопрос … но он появляется на сайте, вероятно, stackoverflow webapplication использует мягкое удаление. В любом случае ваше решение правильное, и я бы проголосовал за ваш ответ, но у меня недостаточно репутации. Лучшее, что я могу сделать, это одобрить его и сказать спасибо! 🙂

Ответ №2:

@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...
}