0

人々の助けを借りて、より良いチャット クライアントを作成しました。

メッセージを待っているときに .recv でブロックされたくない場合は、スレッド、クラス、関数、およびキューを使用する必要があるとのことでした。

そこで、特定の人が私にくれたいくつかの助けに従って、クラスからスレッドを作成し、着信メッセージを読み取ってそれらを出力するはずの関数を定義しました。

また、送信する内容を入力できる機能も作成しました。

問題は、プログラムを実行するときです。何も起こりません。

誰かが間違っていることを指摘するのを助けることができますか? (3日間質問して調べても出てこなかったのでやってみました)

from socket import *
import threading
import json
import select

print("Client Version 3")
HOST = input("Connect to: ")
PORT = int(input("On port: "))
# Create 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:
Buffer = []

rlist,wlist,xlist = select.select([s],Buffer,[])

class Incoming(threading.Thread):
    # made a function a thread
    def Incoming_messages():
        while True:
            for i in rlist:
                data = i.recv(1024)
                if data:
                    print(data.decode())

# Now for outgoing data.
def Outgoing():
    while True:
        user_input=("Your message: ")
        if user_input is True:
            Buffer += [user_input.encode()]
        for i in wlist:
            s.sendall(Buffer)
            Buffer = []

ご覧いただきありがとうございます。これを提案してくれた Tony The Lion にも感謝します

4

1 に答える 1

1

あなたのコードのこの改訂版を見てください:(python3.3で)

from socket import *
import threading
import json
import select


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()
  • プログラムでさまざまな問題が発生しました。つまり、スレッドを呼び出す必要があります。それらを定義するだけでは十分ではありません。
  • また、次の行の関数input()を忘れていました:user_input = input( "your message:")+"\n"。
  • 「select()」関数は、何かを読み取るまでブロックされていたため、プログラムはコードの次のセクションに到達しなかったため、読み取りスレッドに移動することをお勧めします。
  • Pythonのsend関数はリストを受け入れません。Python 3.3では、encoded()関数によって返されるバイトのグループを受け入れるため、コードの一部を調整する必要がありました。
于 2013-03-09T17:14:38.230 に答える