我想要用Python进行双向通信:
我想绑定到一个套接字,一个客户端可以连接到该套接字,然后服务器和客户端可以相互“聊天”。
我已经有了基本的听众:
import socket
HOST='' #localhost
PORT=50008
s=socket.socket(socket.AF_INET, socket.SOCK_STREAM ) #create an INET, STREAMing socket
s.bind((HOST,PORT)) #bind to that port
s.listen(1) #listen for user input and accept 1 connection at a time.
conn, addr = s.accept()
print "The connection has been set up"
bool=1
while bool==1:
data=conn.recv(1024)
print data
if "#!END!#" in data:
print "closing the connection"
s.close()
bool=0
我现在要做的是实现一些东西,这样这个脚本也接受用户输入,在按下enter键之后,将其发送回客户机。
但我不知道怎么做?因为如果我这样做:
while bool==1:
data=conn.recv(1024)
print data
u_input = raw_input("input now")
if u_input != "":
conn.send(u_input)
u_input= ""
问题是它可能挂起在用户输入提示符处,因此不允许我的客户端发送数据。
我该怎么解决?
我想把它放在一个窗口里,这能用线程解决吗?
(我从未在python中使用过线程)
基本问题是您有两个输入源正在等待:套接字和用户。我可以想到的三种主要方法是使用异步I/O、对多个线程使用同步(阻塞)I/O或对超时使用同步I/O。最后一种方法在概念上是最简单的:在套接字上等待数据长达一段超时时间,然后切换到等待用户输入要发送的数据,然后返回套接字,等等
我知道,在较低的级别上,您可以通过将套接字和stdin都视为I/O句柄并使用
select
同时等待它们来相对容易地实现这一点,但我不记得该功能是否映射到了Python,或者如果是,如何映射。如果你能成功的话,这可能是一个很好的处理方法。编辑:我查了一下,Python确实有一个select
模块,但听起来它只是在Unix操作系统下运行——在Windows中,它只能接受套接字,而不能接受stdin或文件。你检查过扭曲吗?twistedpython事件驱动的网络引擎和库或 oidranot一个python库,特别是基于torando web服务器的python库
Python的套接字有一个makefile tool来简化这种交互。创建套接字s后,运行
f = s.makefile()
。它将返回一个具有类似文件的接口的对象(因此您可以使用readline,write,writeline和其他方便的方法调用)。Python标准库本身使用了这种方法(例如,参见ftplib和poplib的源代码)。要从客户端获取文本并将其显示在服务器控制台上,请使用
print f.readline()
编写循环。要从服务器控制台获取文本并将其发送到客户端,请使用
f.write(raw_input('+ ') + '\n')
编写循环。要同时发送和接收,请分别执行以下两个步骤:
如果您更喜欢异步而不是线程,下面是两个示例:
相关问题 更多 >
编程相关推荐