我学习网络编程,想用Python编写一个简单的命令行聊天。
我想知道如何使接收常数和输入一起可随时发送。
如您所见,此客户端一次只能执行一项工作:
from socket import *
HOST = 'localhost'
PORT = 21567
BUFSIZE = 1024
ADDR = (HOST, PORT)
tcpCliSock = socket(AF_INET, SOCK_STREAM)
tcpCliSock.connect(ADDR)
while 1:
data = raw_input('> ')
if not data: break
tcpCliSock.send(data)
data = tcpCliSock.recv(BUFSIZE)
if not data: break
print data
tcpCliSock.close()
因此,如果另一个客户机发送了一条消息,那么这个客户机也只能在发送了一条消息之后才能接收到它。我打赌你理解我。我在google上找到了很多有趣的东西,比如异步I/O、线程、非阻塞同步、并发编程等等。我还安装了扭曲包。总之,我一直在学习这些东西,但还没有找到我要找的东西。(当然,我会一直努力,直到我说到点子上。)
所以,我的问题是怎么做到的?=)
聊天程序同时做两件事。
观看本地用户的键盘并发送给远程用户(通过某种插座)
监视远程套接字并在本地控制台上显示它们键入的内容。
你有几种方法可以做到这一点。
一种打开套接字和键盘并使用select模块来查看哪个已准备好输入的程序。
创建两个线程的程序。一个线程读取远程套接字并打印。另一个线程读取键盘并发送到远程套接字。
分叉两个子进程的程序。一个子进程读取远程套接字并打印。另一个子进程读取键盘并发送到远程套接字。
你的问题不太连贯。然而,您的程序根本不需要异步来实现您的要求。
这是一个工作的聊天脚本,你最初想要的变化很小。它使用1个线程接收和1个线程发送,都使用阻塞套接字。它比使用异步方法简单得多。
如果你想从头开始编写代码,
select
是一条路(你可以在Google图书搜索上阅读Python的大部分章节,简而言之,它涵盖了这些问题);如果你想利用更多的抽象,asyncore
是可用的,但是Twisted更加丰富和强大。相关问题 更多 >
编程相关推荐