开始线程后,我的聊天客户端冻结了

时间:2013-03-09 13:50:58

标签: python function sockets blocking

我在人们的帮助下建立了一个更好的聊天客户端:

他们告诉我,如果我不想在等待消息时阻塞.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提出此建议

1 个答案:

答案 0 :(得分: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(“你的消息:”)+“\ n”。
  • “select()”函数阻塞,直到你有东西要读,所以程序没有到达代码的下一部分,所以最好把它移到阅读线程。
  • python中的send函数不接受列表;在python 3.3中,它接受一组字节,由encoded()函数返回,因此必须调整部分代码。