0

私は一日中見回していましたが、ここでチャットクライアントで発生した問題を解決できませんでした。

問題は次のとおりです。最近、クライアントを変更して、ユーザーが最初に返信を待たずに必要なメッセージを入力できるようにすることにしました(返信が届くまでプログラムをブロックするか何かが停止します)

select.selectモジュールを使用してこれを行うことにしましたが、今日、クライアントのいくつかの異なるバージョンを作成して動作させようとした後、この時点で立ち往生し続けています。

メッセージを入力するたびに、ループがどこかでスタックします(おそらく.recvデータで)これを修正するにはどうすればよいですか?私が試みたものは、それをうまくやらせることはできません。

編集:より明確にするために、実行すると、メッセージを入力し、Enterキーを押すと、何も起こりません。それはそのように実行され続けます。

from socket import *
import select
import sys #because why not?

print("New Chat Client Using Select Module")

HOST = input("Host: ")
PORT = int(input("Port: "))

s = socket(AF_INET,SOCK_STREAM)

print("Trying to connect....")
s.connect((HOST,PORT))
s.setblocking(0)
# Not including setblocking(0) because select handles that. 
print("You just connected to",HOST,)

# Lets now try to handle the client a different way!

while True:
    Incoming_data = [s]
    Exportable_data = []

    Exceptions = []
    User_input = input("Your message: ")

    rlist,wlist,xlist = select.select(Incoming_data,Exportable_data,Exceptions)

    if User_input == True:
        Exportable_data += [User_input]

    for i in rlist:
        data = i.recv(1024)
        if data == "":
            continue

    for i in wlist:
        if Exportable_data is True:
            i.send(Exportable_data)
            continue

データを受信するように設定されているときに、ブロッキング(問題だと思います)をオーバーライドする方法はありますか?s.setblocking(0)は、ブロックされないようにしません(?)(それがまだスタックしている場合とない場合)

ご覧いただきありがとうございます

4

1 に答える 1

0

ソケットと相互作用する別のスレッドまたはプロセスと、ユーザー入力を受け入れてチャットメッセージを出力する別のスレッドが必要だと思います。着信メッセージと発信メッセージの2つのキューを使用して実行できるスレッド間の相互作用。

スレッドモジュールとキューモジュールを見てください。

于 2013-03-07T18:41:38.843 に答える