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模型

猜你喜欢

转载自www.cnblogs.com/lonelyshy/p/9775862.html