2014-05-15 49 views
0

我在使TCP服務器正常運行時遇到了一些麻煩......當我使用netcat連接到它時,我只能發送一條消息,然後服務器不會顯示其他消息發送信息。當我將client, addr = tcp_socket.accept()置於while循環外時,我可以接收多條消息,但只能連接一次...TCP服務器只能讀取一條消息並停止

解決這些問題的最佳方法是什麼?

代碼

class TCP(threading.Thread): 

    def __init__(self, host, port): 
     self.port = port 
     threading.Thread.__init__(self) 

    def create_socket(self, port): 
     sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
     sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) 
     sock.bind(('', port)) 
     sock.listen(5) 
     return sock 

    def listen(self, tcp_socket): 
     while True: 
      client, addr = tcp_socket.accept() 
      print "Got connection from", addr 
      data = client.recv(1024) 
      if data: 
       print "TCP", data 

    def run(self): 
     self.listen(self.create_socket(self.port)) 
+0

考慮使用zmq。它會讓你的生活變得更簡單。甚至有命令行工具'zmqc',它允許與來自控制檯的面向行的消息進行通信(使用我的修改,它可以解決一些最新的更新:https://github.com/vlcinsky/zmqc) –

回答

1

這裏是擁有Socket.accept()循環外的工作示例服務器應用程序:

class (threading.Thread): 
    def listenForClients(self, sock): 
     while True: 
      client, address = sock.accept() 
      client.settimeout(5) 
      threading.Thread(target = self.listenToClient, args = (client,address)).start() 

    def listenToClient(self, client, address): 
     size = 1024 
     while True: 
      try: 
       data = client.recv(size) 
       if data: 
        response = "Got connection" 
        client.send(response) 
       else: 
        raise error('Client disconnected') 
      except: 
       client.close() 
       return False 

    def __init__(self, host, port): 
     sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
     sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) 
     sock.bind((host, port)) 
     sock.listen(5) 
     self.listenForClients(sock) 

這個使用一個線程爲每個客戶端,否則Socket.recv()塊,這樣客戶就必須輪流。

相關問題