Клиент подключается и отключается мгновенно без сообщения об ошибке? - PullRequest
0 голосов
/ 24 февраля 2019

плохо знакомы с экспериментами.Я пытаюсь настроить простой веб-сокет для системы обмена сообщениями, используя twisted.application и protocol.basic.LineReceiver.

Проблема: Twisted приложение подключается к клиенту и отключает егосразу после (?)

Журналы клиента при попытке подключения:

WebSocket поддерживается вашим браузером!

Firefox не можетустановить соединение с сервером по адресу ws: //127.0.0.1: 1025 /.

Соединение закрыто ...

Сервер регистрирует, когда клиент пытается подключиться:

2019-02-24T17:49: 24 + 0000 [stdout # info] Получил нового клиента!

2019-02-24T17: 49: 24 + 0000 [stdout # info] получил b'GET / HTTP / 1.1 '

2019-02-24T17: 49: 24 + 0000 [stdout # info] получено b'Host: 127.0.0.1:1025'

2019-02-24T17: 49: 24 + 0000 [stdout # info]Получено b'User-Agent: Mozilla / 5.0 (Macintosh; Intel Mac OS X 10.14; rv: 67.0) Gecko / 20100101 Firefox / 67.0 '

2019-02-24T17: 49: 24 + 0000 [stdout #информация] получено b'Accept: / '

2019-02-24T17: 49: 24 + 0000 [stdout # info] получено b'Accept-Language: en-US, en;q = 0,5 '

2019-02-24T17: 49: 24 + 0000 [stdout # info] получено b'Accept-Encoding: gzip, deflate'

2019-02-24T17: 49: 24 + 0000 [stdout # info] получено b'Sec-WebSocket-Version: 13 '

2019-02-24T17: 49: 24 + 0000 [stdout # info] получено b'Origin: null'

2019-02-24T17: 49: 24 + 0000 [stdout # info] полученыed b'Sec-WebSocket-Extensions: permessage-deflate '

2019-02-24T17: 49: 24 + 0000 [stdout # info] получен b'Sec-WebSocket-Key: / gN0KPBQZTU498eQBdTV2Q =='

2019-02-24T17: 49: 24 + 0000 [stdout # info] получено b'DNT: 1 '

2019-02-24T17: 49: 24 + 0000 [stdout # info]получено b'Connection: keep-alive, обновление '

2019-02-24T17: 49: 24 + 0000 [stdout # info] получено b'Pragma: no-cache'

2019-02-24T17: 49: 24 + 0000 [stdout # info] получено b'Cache-Control: no-cache '

2019-02-24T17: 49: 24 + 0000 [stdout # info] получено b'Обновление: websocket '

2019-02-24T17: 49: 24 + 0000 [stdout # info] получено b' '

2019-02-24T17: 49: 24 + 0000 [stdout #info] Потерян клиент!

Код сервера:

"""The most basic chat protocol possible.

run me with twistd -y chatserver.py, and then connect with multiple
telnet clients to port 1025
"""
from __future__ import print_function

from twisted.application import service, internet
from twisted.internet import protocol, reactor
from twisted.protocols import basic


class MyChat(basic.LineReceiver):
    def connectionMade(self):
        print("Got new client!")
        self.factory.clients.append(self)

    def connectionLost(self, reason):
        print("Lost a client!")
        self.factory.clients.remove(self)

    def lineReceived(self, line):
        print("received", repr(line))
        for c in self.factory.clients:
            c.message(line)

    def message(self, message):
        self.transport.write(message + b'\n')


factory = protocol.ServerFactory()
factory.protocol = MyChat
factory.clients = []

application = service.Application("chatserver")
internet.TCPServer(1025, factory).setServiceParent(application)

Запуск с twistd -y chatserver.py

Простой клиенткод: (Этот код хорошо работал при подключении к pywebsocket , работающему локально)

<script>
    console.log("started");
    window.chat = {};
    //Instantiate a websocket client connected to our server
    chat.ws = new WebSocket("ws://127.0.0.1:1025");

    chat.ws.onopen = function () {
        console.log("Connected to chat.")
    };

    chat.ws.onclose = function () {
        console.log('Connection closed');
    };
</script>

Я использую Twisted 18.9.0, python 3.7.1 и MacOs.Кто-нибудь знает, что я делаю неправильно, чтобы не поддерживать соединение?

1 Ответ

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

Вы используете обычный эхо-сервер TCP.Он принимает TCP-соединения и возвращает им все, что они отправляют.

Вы используете клиент WebSocket.Он открывает TCP-соединение и начинает передавать протокол WebSocket (начиная с рукопожатия на основе HTTP) серверу.Он ожидает ответа протокола WebSocket на это рукопожатие.

эхо-сервер TCP отправляет обратно данные рукопожатия WebSocket клиента.Это неправильный ответ на рукопожатие WebSocket.Клиент WebSocket делает вывод (правильно), что сервер не является сервером WebSocket, и отключается.

Посмотрите на что-то вроде https://crossbar.io/autobahn/ для библиотек, ориентированных на работу с WebSockets.Вы даже можете найти пример эхо-сервера WebSocket в документации, https://github.com/crossbario/autobahn-python/tree/9d65b508cc108730b4b6a74ba35afe0fa1d5ffca/examples/twisted/websocket/echo

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...