准备文件:
IO.py 服务端代码
tcp_c.py 客户端代码
IO.py 代码:
from select import * #引入 select 模块
from socket import * #引入 socket 模块
s = socket() #实例化一个socket 对象
s.setsockopt(SOL_SOCKET,SO_REUSEADDR,1) #设置端口可重用
s.bind(('0.0.0.0',8888)) #绑定端口号 8888
s.listen(5) #设置监听队列
rlist = [s] #设置读列表(被动列表)
wlist = [] #设置写列表(主动列表)
xlist = [] #设置出错列表
while True: #循环等待客户端连接
rs,ws,xs = select(rlist, wlist, xlist) #将三个列表托管给select 对象
for r in rs: #遍历 读列表(收到客户端请求的对象)
if r is s: # 如果是 s 套接字对象接收到请求,则说明是新的用户连接
c,addr = s.accept() #处理客户端请求,将连接套接字赋值给 c 用户地址赋值给 addr
print(addr,'连接至s') #打印连接提示信息
rlist.append(c) #将连接套接字添加进 读列表,以便保持持续的连接
else: #如果不是 s 套接字对象接收的请求,则说明是已有的现成连接
data = r.recv(1024) #接收客户端传过来的数据
if not data:#如果没有发送过来任何数据
r.close() #将当前套接字关闭
rlist.remove(r) #将当前套接字移除出rlist列表,使 select 不再监管此对象
else: #如果有发送过来的数据
print(data.decode()) #打印出客户端发送过来的数据
r.send('已收到你的消息'.encode()) #给客户端回复数据
for w in ws: #遍历 写列表(主动发起的列表) 只要此列表有对象,会马上触发
pass #由于基本上用不到这个列表,所以此处不写任何代码
for x in xs: #遍历 发生错误的套接字列表
pass #由于基本上用不到这个列表,所以此处不写任何代码
tcp_c.py代码:
from socket import *
import time
#创建套接字
sockfd = socket(AF_INET,SOCK_STREAM)
#发起连接
server_addr = ('127.0.0.1',8888)
sockfd.connect(server_addr)
i = 0
while True:
data = input('发送>>')
#data = '哈哈'+str(i)
sockfd.send(data.encode())
data = sockfd.recv(1024)
print('接收到:',data.decode(),i)
i += 1
sockfd.close()
运行结果: