Obecnie szukam możliwości użycia websockets do komunikacji między klientem/agentem a serwerem i postanowiłem spojrzeć na C# w tym celu. Chociaż pracowałem wcześniej z Websockets i C#, po raz pierwszy używam ich razem. Pierwsza próba używany następujący przewodnik: http://www.codeproject.com/Articles/618032/Using-WebSocket-in-NET-PartUżywanie C# ClientWebSocket ze strumieniami
public static void Main(string[] args)
{
Task t = Echo();
t.Wait();
}
private static async Task Echo()
{
using (ClientWebSocket ws = new ClientWebSocket())
{
Uri serverUri = new Uri("ws://localhost:49889/");
await ws.ConnectAsync(serverUri, CancellationToken.None);
while (ws.State == WebSocketState.Open)
{
Console.Write("Input message ('exit' to exit): ");
string msg = Console.ReadLine();
if (msg == "exit")
{
break;
}
ArraySegment<byte> bytesToSend = new ArraySegment<byte>(Encoding.UTF8.GetBytes(msg));
await ws.SendAsync(bytesToSend, WebSocketMessageType.Text, true, CancellationToken.None);
ArraySegment<byte> bytesReceived = new ArraySegment<byte>(new byte[1024]);
WebSocketReceiveResult result = await ws.ReceiveAsync(bytesReceived, CancellationToken.None);
Console.WriteLine(Encoding.UTF8.GetString(bytesReceived.Array, 0, result.Count));
}
}
}
Mimo to wydaje się działać zgodnie z oczekiwaniami, zastanawiałem się, czy jest jakiś sposób mogę korzystać z wbudowanych w potokach/czytelników w .NET z ClientWebSocket?
Wydaje mi się dziwne, że Microsoft ma bogaty, dobrze znany zestaw klas strumienia i czytnika, ale następnie decyduje się na wdrożenie ClientWebSocket z możliwością odczytu bloków bajtów, które muszą być obsługiwane ręcznie.
Powiedzmy, że chciałem przenieść xml, łatwo byłoby mi po prostu opakować strumień gniazd w XmlTextReader, ale nie jest to oczywiste w ClientWebSocket.
Rozpocznij używanie SignalR –