2

だから私はソケットプログラミングについて学んでいて、気の利いた小さなチャットサーバーを書いています。私が抱えている問題は、クライアントが同時に読み書きできないことです。これを設定する方法がよくわかりません。

これは私がこれまでに持っているものです。read() と write() を同時に実行したいです (同時に読み書きすることではなく、input() が待機中にメッセージを受信できるようにすることです)ユーザー入力用):

import socket 
import threading

class Client(threading.Thread):

    def __init__(self):
        self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.socket.connect(('127.0.0.1', 1234))
        print('Client connected to server')

        self.readThread = threading.Thread.__init__(self)
        self.writeThread = threading.Thread.__init__(self)

    def read(self):
        data = self.socket.recv(1024)
        if data:
            print('Received:', data)

    def write(self):
        message = input()
        self.socket.send(bytes(message, 'utf-8'))


client = Client()

while True:
    #do both
4

1 に答える 1

3

あなたは本当に近くにいます。次のようなことを試してください:

import socket 
import threading

class Client(threading.Thread):

    def __init__(self):
        self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.socket.connect(('127.0.0.1', 1234))
        print('Client connected to server')

        t = threading.Thread(target = self.read)
        t.daemon = True # helpful if you want it to die automatically
        t.start()

        t2 = threading.thread(target = self.write)
        t2.daemon = True
        t2.start()

    def read(self):
        while True:
            data = self.socket.recv(1024)
            if data:
                print('Received:', data)

    def write(self):
        while True:
            message = input()
            self.socket.send(bytes(message, 'utf-8'))


client = Client()

このように単一の端末から読み書きしている場合、プロンプトが少し手に負えなくなる可能性があることに注意してください。print ステートメントから始めていると思いますが、最終的にはアプリ内の他のコンテナーにデータを収集します。

于 2012-07-28T04:07:37.593 に答える