客户端可以立即连接和断开连接,而不会出现错误消息?

时间:2019-02-24 18:00:10

标签: python websocket twisted

扭曲和实验的新手。我正在尝试使用twisted.application和protocols.basic.LineReceiver为消息传递系统设置一个简单的Websocket。

问题:扭曲的应用程序连接了客户端,并在(?)之后立即断开了连接。

客户端尝试连接时记录日志:

  

浏览器支持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'< / p>      

2019-02-24T17:49:24 + 0000 [stdout#info]收到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]收到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,Upgrade'

     

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'Upgrade: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和M​​acOs上运行。有人知道我在做错什么以致无法保持连接状态吗?

1 个答案:

答案 0 :(得分:1)

您正在运行普通的TCP回显服务器。它接受TCP连接,并在发送任何内容时回显它们。

您正在运行WebSocket客户端。它打开一个TCP连接,并开始对服务器说WebSocket协议(从基于HTTP的握手开始)。它期望WebSocket协议对此握手做出响应。

TCP回显服务器将客户端的WebSocket握手数据发送回给它。这不是正确的WebSocket握手响应。 WebSocket客户端得出结论(正确)该服务器不是WebSocket服务器,并断开连接。

看一下类似https://crossbar.io/autobahn/的库,这些库适合使用WebSockets。您甚至可以在文档https://github.com/crossbario/autobahn-python/tree/9d65b508cc108730b4b6a74ba35afe0fa1d5ffca/examples/twisted/websocket/echo

中找到示例WebSocket回显服务器。