使用python套接字时无法保持连接活动

时间:2018-07-01 23:20:26

标签: python-3.x websocket

大家好,我正在尝试使用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”)

0 个答案:

没有答案