Я пытаюсь реализовать сервер веб-сокетов C#, но это дает мне несколько проблем. Я запускаю веб-сервер (ASP.NET) для размещения страницы с помощью javascript, а сервер веб-сокетов реализован как консольное приложение C#.Сервер веб-сервера: функция onopen в веб-сокете никогда не называется
Я могу обнаружить попытку подключения от клиента (chrome работает javascript), а также получить подтверждение от клиента. Но клиент, похоже, не принимает рукопожатие, которое я отправляю обратно (функция onopen
в веб-сокете никогда не вызывается).
Я читал The Web Socket protocol, и я не вижу, что я делаю неправильно. Heres немного кода сервера:
Socket listener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.IP);
IPEndPoint ep = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 8181);
listener.Bind(ep);
listener.Listen(100);
Console.WriteLine("Wainting for connection...");
Socket socketForClient = listener.Accept();
if (socketForClient.Connected)
{
Console.WriteLine("Client connected");
NetworkStream networkStream = new NetworkStream(socketForClient);
System.IO.StreamWriter streamWriter = new System.IO.StreamWriter(networkStream);
System.IO.StreamReader streamReader = new System.IO.StreamReader(networkStream);
//read handshake from client:
Console.WriteLine("HANDSHAKING...");
char[] shake = new char[255];
streamReader.Read(shake, 0, 255);
string handshake =
"HTTP/1.1 101 Web Socket Protocol Handshake\r\n" +
"Upgrade: WebSocket\r\n" +
"Connection: Upgrade\r\n" +
"WebSocket-Origin: http://localhost:8080\r\n" +
"WebSocket-Location: ws://localhost:8181\r\n" +
"\r\n";
streamWriter.Write(handshake);
streamWriter.Flush();
Я бегу на веб-сервер на порту 8080 и сервером веб-сокетов на порт 8181, как на моем локальном хосте.
Я попытался отправить рукопожатие в разных кодировках (ASCII, байты и шестнадцатеричные), но это, похоже, не имеет значения. Соединение никогда не устанавливается полностью. Javascript выглядит следующим образом:
var ws;
var host = 'ws://localhost:8181';
debug("Connecting to " + host + " ...");
try {
ws = new WebSocket(host);
} catch (err) {
debug(err, 'error');
}
ws.onopen = function() {
debug("connected...", 'success');
};
ws.onclose = function() {
debug("Socket closed!", 'error');
};
ws.onmessage = function (evt) {
debug('response: ' + evt, 'response');
};
Я предполагаю, что ошибка лежит в C# сервер, как хром посылает информацию, как и должно быть, но, как сказал функция onopen
никогда не вызывается.
Итак, мой вопрос вкратце: Неужели кто-то из вас когда-либо совершил это - и если да, то как вы это сделали? И по причине: вы видите какие-либо явные ошибки в коде (надеюсь, что не стоит много спрашивать)
Вы можете захотеть использовать Fleck, доступный на NuGet: http://nuget.org/packages/Fleck/ –