您有两个系统吗?服务器系统的IP地址是否为192.168.1.1?如果只有一个系统,则本地主机地址为127.0.0.1。那是我必须对您的代码进行的第一个更改,以便在同一系统上运行服务器和客户端时获得连接。
另一个问题是您的客户端线程实际上并未启动。由于需要客户端线程类,因此下面是声明和启动它的方法:
- threading.Thread的子类。
- 重写
__init__
您的行为,但首先调用__init__
基类。 - 覆盖
run
线程工作。 - 创建一个实例并调用其
start
方法。
另一个问题是
recv如果客户端未发送任何数据,则会阻塞,因此,如果您尝试连接多个客户端,则它将挂在客户端列表的循环中。您将需要每个客户端一个线程,或用于
select.select查询客户端套接字以进行读/写准备。
以下是更改后的代码,只有一个客户端可以响应,但是需要处理多个客户端。它还需要建立协议来处理消息。TCP是一种流协议(无消息边界),因此发送“ abc”和“
123”可能会导致接收到“ abc123”或“ ab”和“ c123”等。它必须处理关闭连接并从客户端列表中删除客户端对象。
祝好运!您将学到很多知识,从头开始研究如何做所有这些事情。
socketserver.py还要查看库中的示例代码。srv.py
clnt.pyimport 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()
输出(srv.py)import socketimport stringaddress = ('localhost',22085)mySocket = socket.socket()mySocket.connect(address)print("Connected successfully!")mySocket.send('blah'.enpre())print(mySocket.recv(1024))
输出(clnt.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).
Connected successfully!b'Testamundo.rn'
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)