2012-06-29 3 views
0

파이썬에서 멀티 스레딩과 소켓을 배우고 있지만 문제가 생겼습니다. 같은 컴퓨터에있는 여러 클라이언트의 데이터를 받아서 인쇄 할 서버를 만들려고합니다. 여기에 지금까지 내 서버 코드 :동일한 컴퓨터에있는 다중 소켓 스레드

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

서버가 클라이언트로부터의 연결을 수락하면 스레드는 해당 연결을 처리하고 다음 클라이언트를 기다리는 루프를 시작해야합니다. 여기

[편집]

가 무슨 뜻인지의 예 : 이것은 내 threading.Thread 라인을하려고 한 것입니다

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

... 나는에 넣어 시도 1은 그렇지만 그저 나에게 뭔가 잘못되었다고 말하자. P – Estarius

+0

나는 나의 대답을 확장했다. – MRAB

+0

귀하의 제안은 완벽하게 잘 작동합니다, 지연에 대해 사과드립니다! 고마워. 그러나 누군가가 스레드 줄 끝에 .start()를 추가하는 것을 잊지 않으려한다면 – Estarius

관련 문제