我写了一个python客户端与服务器端进行通信。每次当我完成数据处理时,我必须调用sock.shutdown(socket.SHUT_WR)
,否则服务器不会做任何响应。但是在调用sock.shutdown(socket.SHUT_WR)
之后,我必须将连接重新连接为sock.connect((HOST, PORT))
,否则我无法将数据发送到服务器。那么如何在不关闭连接的情况下保持连接存活。
我的示例代码如下:
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect((HOST, PORT))
sock.sendall(data)
sock.shutdown(socket.SHUT_WR)
received = sock.recv(1024)
while len(received)>0:
received = sock.recv(1024)
sock.sendall(newdata) # this would throw exception
服务器端代码如下:
def handle(self):
cur_thread = threading.current_thread()
while True:
self.data = self.rfile.read(bufsiz=100)
if not self.data:
print 'receive none!'
break
try:
data = self.data
print 'Received data, length: %d' % len(data)
self.wfile.write('get received data\n')
except Exception:
print 'exception!!'
答案 0 :(得分:1)
您没有显示任何服务器端代码,但我怀疑它只是读取字节,直到它再也没有。
你发现不能这样做,因为告诉服务器消息完成的唯一方法就是终止连接。
相反,您必须在协议中添加某种形式的框架。可能的方法包括服务器识别的指定停止字符(例如单个换行符,或者可能是0字节),发送客户端和服务器同意的固定大小的帧,或者首先发送帧大小作为网络编码整数后跟恰好指定的字节数。然后服务器首先读取整数,然后从套接字读取完全相同的字节数。
这样您就可以打开连接并发送多条消息。