zoukankan      html  css  js  c++  java
  • 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!!!
  • 相关阅读:
    Get distinct count of rows in the DataSet
    单引号双引号的html转义符
    PETS Public English Test System
    Code 39 basics (39条形码原理)
    Index was outside the bounds of the array ,LocalReport.Render
    Thread was being aborted Errors
    Reportviewer Error: ASP.NET session has expired
    ReportDataSource 值不在预期的范围内
    .NET/FCL 2.0在Serialization方面的增强
    Perl像C一样强大,像awk、sed等脚本描述语言一样方便。
  • 原文地址:https://www.cnblogs.com/lonelyshy/p/9775862.html
Copyright © 2011-2022 走看看