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