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 中,它接受一组字节,由编码()函数返回,因此必须调整部分代码。
于 2013-03-09T17:14:38.230 回答