python多线程服务器

python多线程服务器,第1张

python多线程服务器

您有两个系统吗?服务器系统的IP地址是否为192.168.1.1?如果只有一个系统,则本地主机地址为127.0.0.1。那是我必须对您的代码进行的第一个更改,以便在同一系统上运行服务器和客户端时获得连接。

另一个问题是您的客户端线程实际上并未启动。由于需要客户端线程类,因此下面是声明和启动它的方法:

  1. threading.Thread的子类。
  2. 重写
    __init__
    您的行为,但首先调用
    __init__
    基类。
  3. 覆盖
    run
    线程工作。
  4. 创建一个实例并调用其
    start
    方法。

另一个问题是

recv
如果客户端未发送任何数据,则会阻塞,因此,如果您尝试连接多个客户端,则它将挂在客户端列表的循环中。您将需要每个客户端一个线程,或用于
select.select
查询客户端套接字以进行读/写准备。

以下是更改后的代码,只有一个客户端可以响应,但是需要处理多个客户端。它还需要建立协议来处理消息。TCP是一种流协议(无消息边界),因此发送“ abc”和“
123”可能会导致接收到“ abc123”或“ ab”和“ c123”等。它必须处理关闭连接并从客户端列表中删除客户端对象。

祝好运!您将学到很多知识,从头开始研究如何做所有这些事情。

socketserver.py
还要查看库中的示例代码。

srv.py
import socketimport threadingimport structimport stringclass clientThread(threading.Thread):    def __init__(self, serv):        threading.Thread.__init__(self)        self.server = serv        self.clientList = []        self.running = True        print("Client thread created. . .")    def run(self):        print("Beginning client thread loop. . .")        while self.running: for client in self.clientList:     message = client.sock.recv(self.server.BUFFSIZE)     if message != None and message != "":         client.update(message)class clientObject(object):    def __init__(self,clientInfo):        self.sock = clientInfo[0]        self.address = clientInfo[1]    def update(self,message):        self.sock.send("Testamundo.rn".enpre())class Server(object):    def __init__(self):        self.HOST = 'localhost'        self.PORT = 22085        self.BUFFSIZE = 1024        self.ADDRESS = (self.HOST,self.PORT)        self.clientList = []        input("Press enter to start the server. . .")        self.running = True        self.serverSock = socket.socket()        self.serverSock.bind(self.ADDRESS)        self.serverSock.listen(2)        self.clientThread = clientThread(self)        print("Starting client thread. . .")        self.clientThread.start()        print("Awaiting connections. . .")        while self.running: clientInfo = self.serverSock.accept() print("Client connected from {}.".format(clientInfo[1])) self.clientThread.clientList.append(clientObject(clientInfo))        self.serverSock.close()        print("- end -")serv = Server()
clnt.py
import socketimport stringaddress = ('localhost',22085)mySocket = socket.socket()mySocket.connect(address)print("Connected successfully!")mySocket.send('blah'.enpre())print(mySocket.recv(1024))
输出(srv.py)
Press enter to start the server. . .Client thread created. . .Starting client thread. . .Beginning client thread loop. . .Awaiting connections. . .Client connected from ('127.0.0.1', 52850).
输出(clnt.py)
Connected successfully!b'Testamundo.rn'


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5631235.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-15
下一篇 2022-12-16

发表评论

登录后才能评论

评论列表(0条)

保存