插座:在Python
2路通信我想在Python双向通信:插座:在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
我想现在要做的是实现东西,所以这个脚本也接受用户输入并回车键被击中后,发回给客户端。
但我不明白我该如何做到这一点?因为如果我会做这样的:
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。最后一种方法在概念上是最简单的:在一段时间内等待套接字上的数据,然后切换到等待用户输入数据发送,然后返回到套接字等。
我知道在较低的级别,您可以通过将I/O处理程序同时处理套接字和stdin,并使用select
同时等待它们来相对轻松地实现这一点,但是我不记得该功能是否映射到Python,或者如果是这样,怎么样。如果你能使它工作,这可能是一个很好的处理方法。编辑:我查了一下,Python确实有一个select
模块,但它听起来像在Unix操作系统下只能这样工作 - 在Windows中,它只能接受套接字,而不是stdin或文件。
我正在linux下工作,所以我不介意:p –
如果Windows的兼容性不是问题,那么select就是我个人的偏好。 – qid
Python的插座有一个makefile tool,使这种互动更加容易。在创建套接字的s后,然后运行f = s.makefile()
。这将返回一个文件类接口的对象(所以你可以使用readline,写,writelines和其他方便的方法调用)。 Python标准库本身使用这种方法(例如,参见ftplib和poplib的来源)。
要从客户端获取文本并将其显示在服务器控制台上,请使用print f.readline()
编写一个循环。
要从服务器控制台获取文本并将其发送到客户端,请使用f.write(raw_input('+ ') + '\n')
编写一个循环。
要发送,并在同一时间收到,做这两个步骤单独的线程:
Thread(target=read_client_and_print_to_console).start()
Thread(target=read_server_console_and_send).start()
如果你喜欢异步过线,这里有两个例子让你开始:
是的,但我仍然不明白我将如何能够要求用户输入并同时写入屏幕:( –
(没有解决您的PROB LEM)'bool'是一种内置类型,您可以覆盖它,因此您可能想要使用不同的变量名称。一个更好的解决方案可能是'while True'与'break'结合。 –
你想发送每一个字符吗?还是全文? –
@ wal-o-mat全文 –