2012-06-29 64 views
0

我正在学习Python上的多线程和套接字,但遇到了一个问题。我正在尝试创建一台服务器,可以从同一台计算机上的多个客户端接收和打印数据。这是到目前为止,我的服务器代码:同一台计算机上的多个套接字线程

import socket 
import threading 

def conn(HOST, PORT, BUFSIZE): 
    serversock = RecvConnection(HOST, PORT) 
    serversock.listen(BUFSIZE) 

class RecvConnection(object): 

    def __init__(self,host, port, sock=None): 
     if sock == None: 
      self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
     else: 
      self.sock = sock 

     self.sock.bind((host, port))  

    def listen(self, buffsize): 
     self.sock.listen(5) 
     clisock, (remhost, remport) = self.sock.accept() 
     while 1: 
      print clisock.recv(buffsize) 

HOST = 'localhost' 
PORT = 21567 
BUFSIZ = 1024 


threading.Thread(target=conn, args=(HOST, PORT, BUFSIZ,)).start() 

的问题是,只有一个我的客户端文件的情况下似乎是由我的服务器来处理,所以只显示我的客户端的第一个实例发送数据。这里是我的客户端代码:

import socket 
import threading 

class CreateConnection(object): 

    def __init__(self, sock=None): 
     if sock is None: 
      # Create a socket 
      self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
     else: 
      self.sock = sock 

    def connect(self, host, port): 
     # Connect to host, port 
      self.sock.connect((host, port)) 

class Communication(CreateConnection): 

    def sendMsg(self, msg): 
     self.sock.send(msg) 

HOST = 'localhost' 
PORT = 21567 

cltsock = Communication() 
cltsock.connect(HOST, PORT) 
while 1: 
    msg = raw_input('> ') 
    cltsock.sendMsg(msg) 

任何人都可以帮助我做到这一点? 谢谢!

回答

2

当服务器接受来自客户端的连接时,它应该启动一个线程来处理该连接,然后循环等待下一个客户端。

[编辑]

这里是我的意思的例子:

def listen(self, buffsize): 
    self.sock.listen(5) 

    while True: 
     # Listen for a new client. 
     clisock, (remhost, remport) = self.sock.accept() 

     # Start listening to the new client. 
     t = threading.Thread(target=self._handle_client, args=(clisock, buffsize)) 
     t.start() 

def _handle_client(self, clisock, buffsize): 
    while True: 
     received = clisock.recv(buffsize) 
     if not received: 
      # The client has closed the connection. 
      break 

     print received 
+0

这是我一直在试图与我threading.Thread线做...我试图把它放在一个虽然1但我们只是说它给了我一个非常错误的:P – Estarius

+0

我已经扩大了我的答案。 – MRAB

+0

您的主张完美无缺,对不起延期!非常感谢。但是,如果有人尝试它,请不要忘记在线程末尾添加.start() – Estarius

相关问题