大家好,我正在尝试使用python作为后端来构建我的简单Websocket聊天,但是由于recv方法在握手后无法获取任何数据并阻塞线程,我无法一直保持连接状态。因此,主要问题是握手后如何保持连接(线程)有效。我使用mozilla浏览器进行测试。
服务器:
#!/usr/bin/python3
import socket
import sys
import threading
PORT = 9883
class ChatServer(threading.Thread):
def __init__(self, port, host='localhost'):
threading.Thread.__init__(self)
self.port = port
self.host = host
self.server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.server
self.users = {} # current connections
try:
self.server.bind((self.host, self.port))
except socket.error:
print('Bind failed %s' % (socket.error))
sys.exit()
self.server.listen(10)
def run_thread(self, conn, addr):
print('Client connected with ' + addr[0] + ':' + str(addr[1]))
while True:
data = conn.recv(1024)
reply = b'OK...' + data
print(reply)
conn.sendall(reply)
conn.close() # Close
def run(self):
print('Waiting for connections on port %s' % (self.port))
# We need to run a loop and create a new thread for each connection
while True:
conn, addr = self.server.accept()
self.users[addr] = conn
threading.Thread(target=self.run_thread, args=(conn, addr)).start()
server = ChatServer(PORT, "127.0.0.1")
server.run()
客户:
socket = new WebSocket("ws://127.0.0.1:9883");
socket.send("TEST");
在客户端上执行代码后,服务器日志上的消息:
Waiting for connections on port 9884
Client connected with 127.0.0.1:42740
b'OK...GET / HTTP/1.1\r\nHost: 127.0.0.1:9884\r\nUser-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Firefox/52.0\r\nAccept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\nAccept-Language: en-US,en;q=0.5\r\nAccept-Encoding: gzip, deflate\r\nSec-WebSocket-Version: 13\r\nOrigin: null\r\nSec-WebSocket-Extensions: permessage-deflate\r\nSec-WebSocket-Key: g/TgSe0+bkJ3lp4aSM5v2g==\r\nConnection: keep-alive, Upgrade\r\nPragma: no-cache\r\nCache-Control: no-cache\r\nUpgrade: websocket\r\n\r\n'
(如您所见,没有关于下一条消息的信息,该消息必须为“ TEST”)