2

私が抱えている問題は、サーバーが送信したときにチャットクライアントがサーバーからデータを受信して​​印刷し、クライアントが応答できるようにすることです。

これは正常に機能しますが、クライアントが応答するように求められたときにプロセス全体が停止します。そのため、何かを入力するまでメッセージが山積みになり、その後、受信したすべてのメッセージが出力されます。

これを修正する方法がわからないので、5 秒後に応答タイムアウトを入力する時間をクライアントに与えないことにしました。入力が自動的にリセットされるため、かなり欠陥がありますが、とにかくうまく機能します。

タイムアウトが必要な関数は次のとおりです。

# now for outgoing data
def outgoing():
    global out_buffer
    while 1:
        user_input=input("your message: ")+"\n"
        if user_input:
            out_buffer += [user_input.encode()]
#       for i in wlist:
            s.send(out_buffer[0])
            out_buffer = []

タイムアウトを使用するにはどうすればよいですか? time.sleep を使用することを考えていましたが、それは操作全体を一時停止するだけです。

ドキュメントを探してみました。しかし、プログラムを設定された制限までカウントしてから続行するのに役立つものは見つかりませんでした。

これを解決する方法について何か考えはありますか?(タイムアウトを使用する必要はありません。クライアントの返信が送信される前に、メッセージのパイルアップを停止する必要があるだけです) (ここまで私を助けてくれたすべての人に感謝します)

Ionut Hulub の場合:

from socket import *
import threading
import json
import select
import signal # for trying to create timeout


print("client")
HOST = input("connect to: ")
PORT = int(input("on port: "))

# create the socket
s = socket(AF_INET, SOCK_STREAM)
s.connect((HOST, PORT))
print("connected to:", HOST)

#--------- need 2 threads for handling incoming and outgoing messages--

#       1: create out_buffer:
out_buffer = []

# for incoming data
def incoming():
    rlist,wlist,xlist = select.select([s], out_buffer, [])
    while 1:
        for i in rlist:
            data = i.recv(1024)
            if data:
                print("\nreceived:", data.decode())

# now for outgoing data
def outgoing():
    global out_buffer
    while 1:
        user_input=input("your message: ")+"\n"
        if user_input:
            out_buffer += [user_input.encode()]
#       for i in wlist:
            s.send(out_buffer[0])
            out_buffer = []

thread_in = threading.Thread(target=incoming, args=())
thread_out = threading.Thread(target=outgoing, args=())
thread_in.start() # this causes the thread to run
thread_out.start()
thread_in.join()  # this waits until the thread has completed
thread_out.join()
4

1 に答える 1