Пользовательский сервер Websocket не работает с Firefox, но работает с Chrome - PullRequest
0 голосов
/ 11 июня 2019

Я пишу пользовательский сервер Websocket, используя c #. Я написал некоторый код, согласно этому руководству Mozilla. Теперь я успешно получаю рукопожатие и получаю сообщения от моего клиента, и все это работает на Chrome, но когда я пытаюсь отправить сообщение с сервера на FireFox, я получаю консольную ошибку "Соединение с ws: // localhost: 80 было прервано во время загрузки страницы ". Я отправляю закодированное сообщение, используя alghorithm с этой страницы и на стороне клиента точно то же самое с websocket echo test . Вы можете найти весь проект на GitHub

Я пытался отправить не кодирующие байты и заново открывать соединение веб-маркета каждый раз, когда я отправляю сообщение).

Как видите, сервер автоматически отправляет клиенту сообщение "Hello". Функция процесса (новый поток для каждого клиента):

public void Process()
        {           
            try
            {
                Stream = _client.GetStream();
                HandShake();
                while (true)
                {                  
                  while (_client.Available < 3)
                  {

                  }

                  Byte[] bytes = new Byte[_client.Available];
                  Stream.Read(bytes, 0, bytes.Length);
                  var message = GetMessage(bytes);
                    if (_webSocketConverter.IsClosing(bytes[0]))
                  {       

                      break;
                  }

                   message = GetMessage(bytes);
                  SendMessageFromServer("Hello");         

                }                
            }
            catch (Exception ex)
            {
                throw ex;
                Console.ForegroundColor = ConsoleColor.Red;
                Console.WriteLine(ex.Message);
                Console.ResetColor();               
            }
            finally
            {
                _server.RemoveConnection(this._userInfo.Id);
                Console.WriteLine("Client {0} disconnected from the server", this._userInfo.Id);
                Close();
            }
        }

Функция SendMessage (EncodeMessage - алгоритм по ссылке выше, прекрасно работает с Chrome)

private void SendMessageFromServer(string message)
        {
            Byte[] messageByte = _webSocketConverter.EncodeMessage(message);            
            Stream.Write(messageByte);
        }

Похоже, проблема с сервером, потому что websocket.org/echo работает с firefox.

Ответы [ 2 ]

0 голосов
/ 15 июня 2019

Спасибо всем за ответы. Найдена проблема! Это была моя функция кодирования (wesocketconverter.cs). Я инициализировал форматированный массив как raw array.length + 10. Итак, я получил 8 дополнительных пустых байтов. Chrome справляется с этим, когда лишние байты равны, а Firefox нет. Рано или поздно он перестанет работать на Chrome.

0 голосов
/ 13 июня 2019

Возможное решение может быть связано с заголовком Firefox Connection.

Сравнение запросов на подключение WebSocket в Chrome и Firefox обнаруживает тот факт, что заголовок Connection в Firefox равен "keep-alive, Upgrade" вместо * 1006.* (в Chrome).

Возможным решением будет проверка на наличие Upgrade (без учета регистра) в заголовке, а не проверка на полное равенство заголовков.

Полный запрос WebSocket в Chrome (на моей машине) выглядел следующим образом:

Read: GET /HTTP/1.1
Host: localhost:3000
Connection: Upgrade
Pragma: no-cache
Cache-Control: no-cache
Upgrade: websocket
Origin: http://localhost:3000
Sec-WebSocket-Version: 13
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.90 Safari/537.36
Accept-Encoding: gzip, deflate, br
Accept-Language: en-US,en;q=0.9
Sec-WebSocket-Key: NmFGZCcMdiNlXoW/R+F0lw==
Sec-WebSocket-Extensions: permessage-deflate; client_max_window_bits

В то время как полный запрос WebSocket в Firefox читал:

GET / HTTP/1.1
Host: localhost:3000
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.14; rv:67.0) Gecko/20100101 Firefox/67.0
Accept: */*
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Sec-WebSocket-Version: 13
Origin: http://localhost:3000
Sec-WebSocket-Extensions: permessage-deflate
Sec-WebSocket-Key: QU6J0KFZjDA/OgVSATpYDg==
Connection: keep-alive, Upgrade
Pragma: no-cache
Cache-Control: no-cache
Upgrade: websocket
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...