【问题标题】:How to avoid blocking using sockets (chat client)如何避免使用套接字阻塞(聊天客户端)
【发布时间】:2013-03-08 02:41:38
【问题描述】:

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

这就是问题所在:我最近决定更改客户端,以便它允许用户输入他们想要的任何消息,而不必先等待回复(阻塞或某些事情会停止我的程序,直到收到回复)

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

感谢观看

【问题讨论】:

    标签: python sockets select module


    【解决方案1】:

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

    查看threadingqueue 模块。

    【讨论】:

    • 我会看看我能做什么,但我对队列和线程是全新的。我要废弃 select.select 模块吗?然后只使用线程和队列?或者将 select.select 与线程和队列结合起来? i.imgur.com/xVyoSl.jpg
    • 我不知道该怎么做。现在已经一整天了,我可能更接近 0.000001%。我应该如何使用线程和队列?没有文档可以帮助我使用我的套接字进行设置。据我所知,我可以创建一个队列。但我要做的就是陷入与我开始时相同的问题。
    • 对不起,我已经忍了一天了,现在我受够了迷路。
    猜你喜欢
    • 2015-03-09
    • 2017-04-18
    • 2017-01-29
    • 1970-01-01
    • 1970-01-01
    • 2016-11-06
    • 1970-01-01
    • 2012-10-13
    • 1970-01-01
    相关资源
    最近更新 更多