2013-03-07 65 views
0

我一直在四处寻找,但我一直无法解决我在聊天客户端遇到的问题。如何避免使用套接字阻塞(聊天客户端)

问题出在这里:我最近决定改变客户端,以便它允许用户输入他们想要的任何消息,而不必等待回复(阻止或阻止我的程序直到回复)

我决定使用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)做它,所以它不会阻止(?)(带或不带它仍然卡)

感谢您抽空看看

回答

0

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

看看threadingqueue模块。

+0

我会看看我能做什么,但我是全新的队列和线程。我要废弃select.select模块吗?然后只使用线程和队列?或者将select.select与线程和队列结合起来? http://i.imgur.com/xVyoSl.jpg – Micrified 2013-03-07 19:06:56

+0

我没有想法该怎么做。现在一整天,我可能会接近0.000001%。我该如何使用线程和队列?没有任何文档可以帮助我使用套接字进行设置。就我所知,我可以创建一个队列。但是我所要做的就是陷入同样的​​问题中。 – Micrified 2013-03-07 20:30:53

+0

对不起,我一整天都很耐心,现在我已经足够迷路了。 – Micrified 2013-03-07 20:31:28