我正在使用套接字模块在Python中编写多线程套接字应用程序 . 服务器侦听连接,当它获得连接时,它会为该套接字生成一个线程 .
服务器线程将一些数据发送到客户端 . 但客户尚未准备好接收它 . 我认为这会导致服务器等到客户端启动recv但是立即返回
然后客户端调用阻塞的recv,并且不会收到任何数据 .
客户端套接字构造函数
self.__clientSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.__clientSocket.connect((server, port))
服务器套接字构造函数
self.servSock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.servSock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
#self.servSock.settimeout(None)
self.servSock.setblocking(1)
self.servSock.bind((self.addr,self.port))
self.servSock.listen(5)
听接受线程
try:
(cs, address) = self.servSock.accept()
except socket.timeout:
return
threadName = '\r\nClient %s:%s\r\n' % (cs, address)
print threadName
clientSocketHandler = ClientSocket()
clientSocketHandler.setClientSocket(cs)
self.clients.newThread(self.clientFunc, {clientSocketHandler : "1"}, threadName).start()
服务器和客户端从ClientSocket内部发送/ rec方法
receivedData = self.__clientSocket.recv(1024*1024)
self.__clientSocket.send(s)
任何想法为什么send()会马上回来?
3 回答
客户端不必准备好接收数据 - 数据将在套接字的接收缓冲区中排队,直到您准备好recv()它为止 . 由于发送缓冲区未满,发送立即返回 - 如果已满,send()将阻塞,直到您想要发送的数据有空间 .
大多数时候你永远不会填补它 - 因此你正在经历的事情 . 另一方面,你可能不希望在其中使用1024 * 1024的recv调用 - 这有点偏高 .
对于延迟我很抱歉我在问这个问题后不久就解决了这个问题 . @Lee感谢您的回答,它指出了我正确的方向 . 解决方案是发送一个4byte int,指定要遵循的数据大小 . 客户端总是会收到这四个字节,然后是数据的大小 .
所有send()都填充网络缓冲区并返回发送的字节数 .
如果你想发送阻止只是从客户端收回确认消息 .