2016-08-15 66 views
0

我写了一个python客户端与服务器端进行通信。每当我完成数据打印时,我必须拨打sock.shutdown(socket.SHUT_WR),否则服务器不会做任何响应。但在拨打sock.shutdown(socket.SHUT_WR)后,我必须重新连接,因为sock.connect((HOST, PORT)),其他明智的我无法发送数据到服务器。那么,如何在不关闭连接的情况下保持连接。 我的示例代码如下:我怎样才能不断地发送数据,而无需在Python中关闭套接字连接

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!!' 

回答

1

你没有表现出任何服务器端的代码,但我怀疑这只是读取字节,直到它变得没有了。

你不能这样做,因为那么告诉服务器消息已完成的唯一方法是通过终止连接。

相反,您将不得不在协议中添加某种形式的框架。可能的方法包括服务器识别的指定停止字符(例如单个换行符,或者可能是0字节),发送客户端和服务器达成一致的固定大小的帧,或者先发送帧大小作为网络编码整数,紧跟指定的字节数。然后服务器首先读取整数,然后从套接字读取完全相同的字节数。

这样你就可以打开连接并发送多条消息。