Я новичок в Websockets и ищу рабочие примеры с помощью консольного приложения WS и c #. Я столкнулся с этим , но у меня уже есть проблема. Кажется, что соединение закрывается, когда сервер отправляет сообщение клиенту. Я не уверен, но я думаю, что рукопожатие в порядке. Вот код:

Сервер:

using System; using System.Net.Sockets; using System.Net; using System.Security.Cryptography; using System.Threading; namespace ConsoleApplication1 { class Program { static Socket serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.IP); static private string guid = "258EAFA5-E914-47DA-95CA-C5AB0DC85B11"; static void Main(string[] args) { serverSocket.Bind(new IPEndPoint(IPAddress.Any, 8080)); serverSocket.Listen(128); serverSocket.BeginAccept(null, 0, OnAccept, null); Console.Read(); } private static void OnAccept(IAsyncResult result) { byte[] buffer = new byte[1024]; try { Socket client = null; string headerResponse = ""; if (serverSocket != null {amp}amp;{amp}amp; serverSocket.IsBound) { client = serverSocket.EndAccept(result); var i = client.Receive(buffer); headerResponse = (System.Text.Encoding.UTF8.GetString(buffer)).Substring(0, i); // write received data to the console Console.WriteLine(headerResponse); Console.WriteLine("====================="); } if (client != null) { /* Handshaking and managing ClientSocket */ var key = headerResponse.Replace("ey:", "`") .Split('`')[1] // dGhlIHNhbXBsZSBub25jZQ== rn ....... .Replace("r", "").Split('n')[0] // dGhlIHNhbXBsZSBub25jZQ== .Trim(); // key should now equal dGhlIHNhbXBsZSBub25jZQ== var test1 = AcceptKey(ref key); var newLine = "rn"; var response = "HTTP/1.1 101 Switching Protocols"   newLine   "Upgrade: websocket"   newLine   "Connection: Upgrade"   newLine   "Sec-WebSocket-Accept: "   test1   newLine   newLine //  "Sec-WebSocket-Protocol: chat, superchat"   newLine //  "Sec-WebSocket-Version: 13"   newLine ; // which one should I use? none of them fires the onopen method client.Send(System.Text.Encoding.UTF8.GetBytes(response)); var i = client.Receive(buffer); // wait for client to send a message // once the message is received decode it in different formats Console.WriteLine(Convert.ToBase64String(buffer).Substring(0, i)); Console.WriteLine("====================="); Console.WriteLine("nnPress enter to send data to client"); Console.Read(); var subA = SubArray{amp}lt;byte{amp}gt;(buffer, 0, i); client.Send(subA); Console.Read(); Thread.Sleep(10000);//wait for message to be send } } catch (SocketException exception) { throw exception; } finally { if (serverSocket != null {amp}amp;{amp}amp; serverSocket.IsBound) { serverSocket.BeginAccept(null, 0, OnAccept, null); } } } public static T[] SubArray{amp}lt;T{amp}gt;(T[] data, int index, int length) { T[] result = new T[length]; Array.Copy(data, index, result, 0, length); return result; } private static string AcceptKey(ref string key) { string longKey = key   guid; byte[] hashBytes = ComputeHash(longKey); return Convert.ToBase64String(hashBytes); } static SHA1 sha1 = SHA1CryptoServiceProvider.Create(); private static byte[] ComputeHash(string str) { return sha1.ComputeHash(System.Text.Encoding.ASCII.GetBytes(str)); } } } 

клент:

 {amp}lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"{amp}gt; {amp}lt;html xmlns="http://www.w3.org/1999/xhtml"{amp}gt; {amp}lt;head{amp}gt; {amp}lt;script type="text/javascript"{amp}gt; function connect() { var ws = new WebSocket("ws://localhost:8080/service"); ws.onopen = function () { alert("About to send data"); ws.send("Hello World"); // I WANT TO SEND THIS MESSAGE TO THE SERVER!!!!!!!! alert("Message sent!"); }; ws.onmessage = function (evt) { alert("About to receive data"); var received_msg = evt.data; alert("Message received = " received_msg); }; ws.onclose = function () { // websocket is closed. alert("Connection is closed..."); }; }; {amp}lt;/script{amp}gt; {amp}lt;/head{amp}gt; {amp}lt;body style="font-size:xx-large" {amp}gt; {amp}lt;div{amp}gt; {amp}lt;a href="#" onclick="connect()"{amp}gt;Click here to start{amp}lt;/a{amp}gt;{amp}lt;/div{amp}gt; {amp}lt;/body{amp}gt; {amp}lt;/html{amp}gt; 

Вот запрос на соединение и сообщение от клиента: введите описание изображения здесь

Любая помощь будет оценена.

Вы не можете просто «повторить» буфер, который вы получили. В RFC говорится, что кадры от клиента к серверу должны быть замаскированы. Это не говорит, что сообщения от сервера клиенту не должны, но по крайней мере для Chrome это не должно. Следовательно, если вы хотите отобразить данные, вы должны декодировать (снять маску) кадр и создать новый. Полезная нагрузка должна быть за байтом XOR’ом с ключом маски.

Или просто отправьте данные следующим образом:

 byte[] send = new byte[3   2]; send[0] = 0x81; // last frame, text send[1] = 3; // not masked, length 3 send[2] = 0x41; send[3] = 0x42; send[4] = 0x43; nwStream.Write(send, 0, send.Length); // nwStream = client.GetStream(), client is a TcpClient 

Джеффсон прав. Но следует отметить, что в разделе 5.1 RFC 6455 упоминается;

… Сервер НЕ ДОЛЖЕН маскировать любые кадры, которые он отправляет клиенту. Клиент ДОЛЖЕН закрыть соединение, если обнаружит замаскированный кадр.