2011-11-23 91 views
3

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线程)

+1

(没有解决您的PROB LEM)'bool'是一种内置类型,您可以覆盖它,因此您可能想要使用不同的变量名称。一个更好的解决方案可能是'while True'与'break'结合。 –

+0

你想发送每一个字符吗?还是全文? –

+0

@ wal-o-mat全文 –

回答

2

的基本问题是,你必须输入的两个来源,你就等着:插座和用户。我能想到的三种主要方法是使用异步I/O,在多线程中使用同步(阻塞)I/O,或者使用带有超时的同步I/O。最后一种方法在概念上是最简单的:在一段时间内等待套接字上的数据,然后切换到等待用户输入数据发送,然后返回到套接字等。

我知道在较低的级别,您可以通过将I/O处理程序同时处理套接字和stdin,并使用select同时等待它们来相对轻松地实现这一点,但是我不记得该功能是否映射到Python,或者如果是这样,怎么样。如果你能使它工作,这可能是一个很好的处理方法。编辑:我查了一下,Python确实有一个select模块,但它听起来像在Unix操作系统下只能这样工作 - 在Windows中,它只能接受套接字,而不是stdin或文件。

+0

我正在linux下工作,所以我不介意:p –

+0

如果Windows的兼容性不是问题,那么select就是我个人的偏好。 – qid

0

你检查了扭曲? twisted蟒蛇事件驱动的网络引擎和库或 oidranot一个Python库特别是对于基于torando Web服务器上

3

Python的插座有一个makefile tool,使这种互动更加容易。在创建套接字的s后,然后运行f = s.makefile()。这将返回一个文件类接口的对象(所以你可以使用readline,,writelines和其他方便的方法调用)。 Python标准库本身使用这种方法(例如,参见ftplibpoplib的来源)。

要从客户端获取文本并将其显示在服务器控制台上,请使用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() 

如果你喜欢异步过线,这里有两个例子让你开始:

+0

是的,但我仍然不明白我将如何能够要求用户输入并同时写入屏幕:( –