python socket 套接字编程 单进程服务器 实现多客户端访问
Posted lonelyshy
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python socket 套接字编程 单进程服务器 实现多客户端访问相关的知识,希望对你有一定的参考价值。
服务器:
1 import socket 2 #单进程服务器 实现多客户端访问 IO复用 3 #吧所有的客户端套接字 放在一个列表里面,一次又一次的便利过滤 4 #这就是apache: select模型 6 server = socket.socket(socket.AF_INET,socket.SOCK_STREAM) 7 server.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1) #设置端口复用 8 #AF_INET: IPV4 9 #AF_INET6: IPV6 10 #SOCK_STREAM: TCP 11 #SOCK_DGRAM: UDP 12 Host = ‘‘ 13 port = 23333 14 server.bind((Host,port)) 15 #服务器绑定端口 8080 16 server.listen(5) 17 #服务器同时监听5个 最大链接数 5 18 19 print(‘[+] server open‘) 20 21 c_server = {} 22 #定义一个全局字典 23 server.setblocking(0) 24 #设置服务器recv接受信息和send发送信息为非阻塞状态(默认为阻塞状态) 25 #是否阻塞(默认True),如果设置False,那么accept和recv时一旦无数据,则报错。 26 while True: 27 try: 28 try: 29 30 client,c_addr = server.accept() 31 32 except BlockingIOError: 33 #无法立即完成一个非阻止性套接字操作。 34 if not c_server: 35 #如果字典为空 36 continue 37 #重新接收套接字 38 pass 39 else: 40 client.setblocking(0)#设置套接字属性为非阻塞 41 #是否阻塞(默认True),如果设置False,那么accept和recv时一旦无数据,则报错。 42 #[WinError 10035] 无法立即完成一个非阻止性套接字操作。 43 c_server[client] = c_addr#以字典形式存储新链接的套接字 44 print(‘[+] from‘,c_addr) 45 for a in list(c_server.keys()): 46 #这里将字典的keys取出来 在列表化,在没有信息的时候删除套接字了 47 try: 48 msg = a.recv(1024).decode(‘utf-8‘) 49 #非阻塞接受消息,但是如果客户端不马上发送,就会报错,所以设置一个延迟接收 50 except BlockingIOError as e: 51 continue 52 53 if not msg: 54 print(‘[%s] closed‘%(c_server[a][0])) 55 a.close() 56 del c_server[a] 57 continue 58 print("来自%s的消息: %s"%(c_server[a][0],msg)) 59 a.send(msg.encode(‘utf-8‘)) 60 #发送重复的消息 61 except KeyboardInterrupt: 62 break 63 64 65 server.close()
客户端:
1 #coding:utf-8 2 3 import socket 4 client = socket.socket(socket.AF_INET,socket.SOCK_STREAM) 5 #创建一个客户端链接,socket.AF_INET代表ipv4,socket.SOCK_STREAM代表tcp套接字 6 client.connect((‘127.0.0.1‘,23333)) 7 #客户端链接 8 print(‘[+] 链接成功‘) 9 #链接成功显示 10 while True: 11 msg = input(‘>>>‘) 12 if msg == ‘quit‘: 13 #如果输入的信息是quit 就退出链接 14 break 15 if len(msg) == 0:#如果直接输入的一个回车的话 16 #就重新输入,因为不能发送空 ,发送空的花 客户端会卡住 17 continue 18 client.send(msg.encode(‘utf-8‘)) 19 #客户端发送信息msg 以utf8格式发送数据 20 data = client.recv(1024).decode(‘utf-8‘) 21 if not data: 22 #如果数据为空/0 23 #服务器主动断开s 24 break 25 print(‘[+] 服务器主动断开了链接......‘) 26 27 print(‘服务器发来:‘,data) 28 29 30 print(‘[+] 链接关闭...‘) 31 32 client.close()
服务器就是apache: select模型
以上是关于python socket 套接字编程 单进程服务器 实现多客户端访问的主要内容,如果未能解决你的问题,请参考以下文章