Не может принимать сокет соединения на сервере - PullRequest
0 голосов
/ 18 февраля 2019

Я создал .NET Console App, в котором я хочу принять client веб-сокеты (я использую расширение Chrome - Simple Web Socket Client).Когда я пытаюсь отправить сообщения подключенным клиентам, я получаю эту ошибку в браузере:

    WebSocket connection to 'ws://localhost:8600/' failed: 
    Error during WebSocket handshake: net::ERR_INVALID_HTTP_RESPONSE
    CLOSED: ws://localhost:8600

Сервер

class Program
    {
        static async Task Main(string[] args)
        {
            CancellationTokenSource src = new CancellationTokenSource();

            Console.WriteLine("starting server...");
            Task server = Task.Run(async () =>
            {
                Socket serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                var point = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 8600);

                serverSocket.Bind(point);
                Console.WriteLine("Listening on localhost:8600" );
                serverSocket.Listen(6);
                var client = await serverSocket.AcceptAsync();
                Task clientTask = Task.Run(async () =>
                {
                    while (true)
                    {
                        await client.SendAsync(Encoding.UTF8.GetBytes("Date is" + DateTime.Now.ToString()), SocketFlags.None);
                        await Task.Delay(5000);
                    }
                },src.Token);

            }, src.Token);
            while (true)
            {
                if (Console.ReadKey().Key == ConsoleKey.A)
                {
                    src.Cancel();
                    break;
                }
            }
        }
    }

Из Simple Web Socket Client (Chromeрасширение) я пытаюсь подключиться к: ws://localhost:8600

PS Я не уверен в том, чтобы передавать один и тот же токен во всех задачах, но кроме этого я не знаю, почему он остается с этой ошибкой.

1 Ответ

0 голосов
/ 18 февраля 2019

Код вашего сервера вообще не реализует протоколы HTTP или WebSocket .

Сеанс WebSocket начинает свою жизнь как сеанс HTTP где клиент отправляет запрос HTTP с просьбой обновить сервер к протоколу WebSocket , а ответ сервера HTTP затем указывает, было ли это обновление успешнымили нет, прежде чем можно будет обмениваться сообщениями WebSocket.

Ваш сервер просто открывает обычный обычный порт TCP и затем отправляет произвольные строковые данные, как только клиент подключается.Вы вообще не используете протоколы HTTP или WebSocket .Поэтому, конечно, клиент WebSocket сообщит о сбое при установлении сеанса WebSocket.Ваш сервер не отправляет обратно действительный HTTP-ответ об обновлении (как говорит клиентская ошибка).

Вместо непосредственного использования класса Socket попробуйте использовать HttpListener и HttpListenerWebSocketContext классы вместо.Например:

Как работать с System.Net.WebSockets без ASP.NET?

...