客户端立即连接和断开连接而没有错误消息?

Posted

技术标签:

【中文标题】客户端立即连接和断开连接而没有错误消息?【英文标题】:Client connects and disconnects instantly with no error message? 【发布时间】:2019-02-24 18:00:09 【问题描述】:

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

问题: 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#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 和 MacO。有谁知道我做错了什么无法保持连接?

【问题讨论】:

【参考方案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 回显服务器

【讨论】:

好的,我使用高速公路让它工作,出于某种原因,我认为 LineReceiver 协议将是一个 WebSocket,仍然理解这一切。非常感谢!

以上是关于客户端立即连接和断开连接而没有错误消息?的主要内容,如果未能解决你的问题,请参考以下文章

Websocket PHP:从客户端发送到服务器的立即断开连接和奇怪的消息字符串

Java CORBA 客户端立即断开连接

boost::asio 完全断开连接

连接后立即断开Websocket

PHPWebsocket 客户端立即断开连接

客户端断开连接时套接字服务器崩溃