Сервер Websocket: функция onopen на веб-сокете никогда не вызывается

Я пытаюсь реализовать веб-сервер сокета C#, но его предоставление мне несколько проблем. Я выполняю веб-сервер (ASP.NET) для хостинга страницы с JavaScript, и веб-сервер сокета реализован как консольное приложение C#.

Я могу обнаружить попытку подключения от клиента (хром, запускающий JavaScript) и также получить квитирование от клиента. Но клиент, кажется, не принимает квитирование, которое я передаю обратно ( onopen функция на веб-сокете никогда не вызывается).

Я читал веб-Сокетный протокол, и я не вижу то, что я делаю неправильно. Вот является немного серверным кодом:

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, оба на моем localhost.

Я попытался отправить квитирование в различной кодировке (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 функция никогда не вызывается.

Так мой вопрос короче говоря: какой-либо из Вас когда-либо выполнял это - и если да, как Вы делали это? И причины: Вы видите, какие-либо очевидные ошибки в коде (надейтесь, что это не очень для выяснения),

61
задан Robert Harvey 7 November 2013 в 18:28
поделиться

1 ответ

>> uri = URI.parse("http://www.google.com")
=> #<URI::HTTP:0x1014ca458 URL:http://www.google.com>
>> uri.scheme
=> "http"
>> uri = URI.parse("https://mail.google.com")
=> #<URI::HTTPS:0x1014c2e60 URL:https://mail.google.com>
>> uri.scheme
=> "https"

Чтобы проверить схему URI по простой последовательности «https».

-121--1734829-

Строка - это последовательность символов. Это обычное употребление слова, и оно датирует все пути 1488 годом.

последовательность (n.)

O.E. последовательность «линия, шнур, нить», от P.Gmc.* strangiz (ср. O.N. strengr, Dan. последовательность, M.Du. strenge, Du. streng, O.H.G. strang, Ger. Strang "верёвка, шнур"), от основания * strang- "таут, жёсткий", от основания PIE * strenk- "тугой, узкий; туго тянуть, скручивать "(см. деформацию). Постепенно ограничивается ранней M.E. линиями, которые меньше веревки. Ощущение «ряда объектов, расположенных в линию» впервые записано 1488. [...]

http://www.etymonline.com/index.php?term=string

-121--4349490-

Вероятно, это проблема кодирования. Вот работающий сервер C #, который я написал:

class Program
{
    static void Main(string[] args)
    {
        var listener = new TcpListener(IPAddress.Loopback, 8181);
        listener.Start();
        using (var client = listener.AcceptTcpClient())
        using (var stream = client.GetStream())
        using (var reader = new StreamReader(stream))
        using (var writer = new StreamWriter(stream))
        {
            writer.WriteLine("HTTP/1.1 101 Web Socket Protocol Handshake");
            writer.WriteLine("Upgrade: WebSocket");
            writer.WriteLine("Connection: Upgrade");
            writer.WriteLine("WebSocket-Origin: http://localhost:8080");
            writer.WriteLine("WebSocket-Location: ws://localhost:8181/websession");
            writer.WriteLine("");
        }
        listener.Stop();
    }
}

и соответствующий клиент, размещенный на localhost: 8080 :

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
  <head>
    <script type="text/javascript">
      var socket = new WebSocket('ws://localhost:8181/websession');
      socket.onopen = function() {
        alert('handshake successfully established. May send data now...');
      };
      socket.onclose = function() {
        alert('connection closed');
      };
    </script>
  </head>
  <body>
  </body>
</html>

В этом примере устанавливается только квитирование. Необходимо изменить параметры сервера, чтобы продолжить прием данных после установления рукопожатия.

47
ответ дан 24 November 2019 в 17:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: