如何避免使用套接字阻塞(聊天客户端)

时间:2013-03-07 18:32:06

标签: python sockets select module

我一整天都在四处寻找,但我无法解决我在聊天客户端遇到的问题。

以下是问题:我最近决定更改客户端,以便用户可以输入他们想要的任何消息,而无需先等待回复(阻止或某些内容会停止我的程序直到回复)

我决定使用select.select模块这样做,但是在我今天编写了几个不同版本的客户端试图让它工作之后,我一直陷入困境。

每当我输入消息时,循环就会卡在某处,(可能是.recv数据) 我怎样才能解决这个问题?我没有尝试过它。

编辑:更清楚一点,当我跑步时,我到达输入信息的位置,点击输入然后根本没有任何事情发生。它就像那样继续运行。

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)使它不会阻塞(?)(有或没有它仍然卡住)

谢谢你看看

1 个答案:

答案 0 :(得分:0)

我认为您应该有单独的线程或进程,它将与您的套接字和另一个线程进行交互,这将接受用户输入和打印聊天消息。您可以使用2个队列执行线程之间的交互:传入和传出消息。

查看threadingqueue个模块。