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

       生命不息
       希望不止
       将来的你
       一定会感谢现在拼命的自己
       fighting!!!
  • 相关阅读:
    设计模式 ( 十七) 状态模式State(对象行为型)
    Intellij13 IDEA常用快捷键 (mac 10.5 +),优化,使用出现的问题汇总
    Web服务器及Web应用服务器
    阮一峰的网络日志
    双击退出的实现
    完成3DM以后的总结(2).Xutils的简单使用
    完成3DM以后的总结(1).PullToRefresh
    软考之路之j2se总结
    2013-2014年终总结
    牛腩新闻发布系统之获取IP
  • 原文地址:https://www.cnblogs.com/lonelyshy/p/9775862.html
Copyright © 2020-2023  润新知