用select()模块,基于Python实现了一个简单的echo程序。
服务端程序:
import socket
import select
serv_socket = socket.socket(family=socket.AF_INET, type=socket.SOCK_STREAM)
serv_socket.bind(("127.0.0.1", 4567))
serv_socket.listen(5)
print("服务端开启...")
rlist = [serv_socket]
while True:
# rlist等待读取的对象,wlist等待写入的对象, xlist等待异常的对象
rs, ws, es = select.select(rlist, [], [], 3)
for r in rs:
# 如果是serv_socket可读,则说明有新的连接请求到来
if r is serv_socket:
clnt_socket, clnt_addr = serv_socket.accept()
print(clnt_addr, "建立连接")
# 把客户端socket也加入到等待读取对象列表中
rlist.append(clnt_socket)
# 客户端socket发送了消息
else:
data = r.recv(1024)
# 如果客户端不发送的不是q,服务器echo接受到的消息给客户端
if data != b'':
print("收到客户端发来的消息:%s" % data.decode())
r.send(data)
else:
rlist.remove(r)
客户端程序:
import socket
host = '127.0.0.1'
port = 4567
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((host, port))
while True:
msg = input("please input a string(q for quit):")
if msg == 'q' or msg == 'Q':
break
s.send(msg.encode())
rcv_msg = s.recv(1024)
print("客户端回送消息:%s"%rcv_msg.decode())
s.close()