2012-06-29 63 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

相關問題