我有这个工作的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.
我做错了什么?
答案 0 :(得分:3)
Python socket
模块与websockets没有任何关系。
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()