【问题标题】:connect javascript client to python websocket server将javascript客户端连接到python websocket服务器
【发布时间】:2018-02-01 00:31:51
【问题描述】:

我有这个工作的 python websocket 服务器:

#!/usr/bin/env python
from socket import *

HOST = ''
PORT = 8080
BUFSIZ = 1024
ADDR = (HOST, PORT)

tcpSerSock = socket(AF_INET, SOCK_STREAM)
tcpSerSock.bind(ADDR)
tcpSerSock.listen(5)

def loop():
    while True:
        print 'Waiting for connection...'
        tcpCliSock, addr = tcpSerSock.accept()
        print '...connected from :', addr
        while True:
            data = tcpCliSock.recv(BUFSIZ)
            if not data:
                break
            else:
                print 'data: ',data
        tcpSerSock.close()

try:
    loop()
except KeyboardInterrupt:
    tcpSerSock.close()

当我从 python 客户端连接时,即使我关闭客户端服务器崩溃,它也能正常工作:

Waiting for connection...
Traceback (most recent call last):
  File "ledServer.py", line 27, in <module>
    loop()
  File "ledServer.py", line 16, in loop
    tcpCliSock, addr = tcpSerSock.accept()
  File "/usr/lib/python2.7/socket.py", line 202, in accept
    sock, addr = self._sock.accept()
  File "/usr/lib/python2.7/socket.py", line 170, in _dummy
    raise error(EBADF, 'Bad file descriptor')
socket.error: [Errno 9] Bad file descriptor

无论如何,当我运行这个 javascript 客户端时:

window.onload = function(){
    ws = new WebSocket('ws://192.168.25.7:8080'); 
    ws.onmessage = function(event){document.write("message received"); alert(event.data); ws.close();} 
    ws.onopen = function(){document.write("open");} 
    ws.onclose = function(){document.write("close");}
    ws.onerror = function(){document.write("error");}
}

我在服务器上得到这个:

...connected from : ('192.168.25.25', 53747)
data:  GET / HTTP/1.1
Host: 192.168.25.7:8080
Connection: Upgrade
Pragma: no-cache
Cache-Control: no-cache
Upgrade: websocket
Origin: file://
Sec-WebSocket-Version: 13
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36
Accept-Encoding: gzip, deflate
Accept-Language: it-IT,it;q=0.9,en-US;q=0.8,en;q=0.7,tr;q=0.6,nl;q=0.5
Sec-WebSocket-Key: pH4kNOzz1MYyi+oXmaFCcA==
Sec-WebSocket-Extensions: permessage-deflate; client_max_window_bits

但是即使服务器说它已连接,在客户端上的 onopen 功能也没有执行,Chrome 说 websocket 状态是“待定”,如果我尝试向服务器发送消息,我会得到:

Uncaught DOMException: Failed to execute 'send' on 'WebSocket': Still in CONNECTING state.

我做错了什么?

【问题讨论】:

    标签: javascript python websocket


    【解决方案1】:

    Python socket 模块与 websockets 没有任何关系。

    WebSocket 和 HTTP 一样,是在底层传输之上实现的协议。您的代码所做的是设置一个侦听端口 8080 的 TCP 服务器。Websockets 是其上的一层,就像 HTTP 一样。您可以看到浏览器尝试与您的服务器握手,但它放弃了,因为您的服务器没有正确响应。

    websocket 协议有些复杂,您可能需要一个库来为您处理它。一个例子是websockets module

    #!/usr/bin/env python
    
    import asyncio
    import websockets
    
    async def echo(websocket, path):
        async for message in websocket:
            await websocket.send(message)
    
    asyncio.get_event_loop().run_until_complete(
        websockets.serve(echo, 'localhost', 8765))
    asyncio.get_event_loop().run_forever()
    

    【讨论】:

    • 谢谢,我试试,是否可以使用javascript连接到这个TCP服务器?如果是,socket 与 websocket 的优缺点?
    • 好的,那么其他的库,比如 tornado 呢?哪个是最简单/最好的?
    • @Miky: asyncio 适合我。全部尝试一下,看看你最喜欢哪一个。没有一个单一的异步库是最好的。
    猜你喜欢
    • 1970-01-01
    • 2020-09-13
    • 1970-01-01
    • 2020-08-17
    • 2022-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-11
    相关资源
    最近更新 更多