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()

問題は、クライアントファイルの1つのインスタンスのみがサーバーによって処理されているように見えるため、クライアントの最初のインスタンスによって送信されたデータのみが表示されることです。これが私のクライアントコードです:

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)

誰かが私がこれを実現するのを手伝ってくれるでしょうか?ありがとう !

4

1 に答える 1

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
于 2012-06-29T19:31:22.133 に答える