我学习网络编程,想在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()
Run Code Online (Sandbox Code Playgroud)
因此,如果另一个客户端发送消息,该客户端也将仅在发送消息后接收它.我打赌你了解我.我搜索了这个问题,发现了很多有趣的东西,比如异步I/O,线程,非阻塞同步,并发编程等等.我也安装了扭曲的包装.简而言之,我一直在学习所有这些东西但却找不到我想要的东西.(当然,我会一直努力尝试,直到我说到这一点.)
所以,我的问题是如何制作的?=)
你的问题不是很一致.但是,您的程序根本不需要异步即可实现您的要求.
这是一个您最初想要的工作聊天脚本,只需要很少的更改.它使用1个线程进行接收,1个用于发送,两者都使用阻塞套接字.它比使用异步方法简单得多.
from socket import *
from threading import Thread
import sys
HOST = 'localhost'
PORT = 21567
BUFSIZE = 1024
ADDR = (HOST, PORT)
tcpCliSock = socket(AF_INET, SOCK_STREAM)
tcpCliSock.connect(ADDR)
def recv():
while True:
data = tcpCliSock.recv(BUFSIZE)
if not data: sys.exit(0)
print data
Thread(target=recv).start()
while True:
data = raw_input('> ')
if not data: break
tcpCliSock.send(data)
tcpCliSock.close()
Run Code Online (Sandbox Code Playgroud)