当前位置:首页 > Python教程 > python技巧

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: IPV610#SOCK_STREAM: TCP11#SOCK_DGRAM: UDP12 Host = ‘‘13 port = 23333
14server.bind((Host,port))
15#服务器绑定端口 808016 server.listen(5)
17#服务器同时监听5个 最大链接数 51819print([+]  server open)
2021 c_server = {}
22#定义一个全局字典23server.setblocking(0)
24#设置服务器recv接受信息和send发送信息为非阻塞状态(默认为阻塞状态)25#是否阻塞(默认True),如果设置False,那么accept和recv时一旦无数据,则报错。26while True:
27try:
28try:
2930             client,c_addr = server.accept()
3132except BlockingIOError:
33#无法立即完成一个非阻止性套接字操作。34ifnot c_server:
35#如果字典为空36continue37#重新接收套接字38pass39else:
40             client.setblocking(0)#设置套接字属性为非阻塞41#是否阻塞(默认True),如果设置False,那么accept和recv时一旦无数据,则报错。42#[WinError 10035] 无法立即完成一个非阻止性套接字操作。43             c_server[client] = c_addr#以字典形式存储新链接的套接字44print([+] from,c_addr)
45for a in list(c_server.keys()):
46#这里将字典的keys取出来 在列表化,在没有信息的时候删除套接字了47try:
48                 msg = a.recv(1024).decode(utf-8)
49#非阻塞接受消息,但是如果客户端不马上发送,就会报错,所以设置一个延迟接收50except BlockingIOError as e:
51continue5253ifnot msg:
54print([%s] closed%(c_server[a][0]))
55                a.close()
56del c_server[a]
57continue58print("来自%s的消息: %s"%(c_server[a][0],msg))
59             a.send(msg.encode(utf-8))
60#发送重复的消息61except KeyboardInterrupt:
62break636465 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#客户端链接 8print([+]  链接成功)
 9#链接成功显示10while True:
11     msg = input(>>>)
12if msg == quit:
13#如果输入的信息是quit  就退出链接14break15if len(msg) == 0:#如果直接输入的一个回车的话16#就重新输入,因为不能发送空 ,发送空的花  客户端会卡住17continue18     client.send(msg.encode(utf-8))
19#客户端发送信息msg  以utf8格式发送数据20     data = client.recv(1024).decode(utf-8)
21ifnot data:
22#如果数据为空/0  23#服务器主动断开s24break25print([+]  服务器主动断开了链接......)
2627print(服务器发来:,data)
282930print([+]  链接关闭...)
3132 client.close()

 

服务器就是apache: select模型

 

原文:https://www.cnblogs.com/lonelyshy/p/9775862.html


【说明】本文章由站长整理发布,文章内容不代表本站观点,如文中有侵权行为,请与本站客服联系(QQ:254677821)!

相关教程推荐

其他课程推荐