zoukankan      html  css  js  c++  java
  • Python之单线程-非阻塞模式实现TCP服务器连接多客户端

    通过为每个客户端创建一个进程的方式,能够同时与多个客户端进行通讯,但是如果有成百上千个客户端,仍然为每个客户端创建进程的话,需要消耗较多的资源,因此需要创建用单线程实现与多个客户端连接的服务器。

    # 导入 socket、sys 模块

    import socket
    import sys

    Clients=[]#创建客户端socket列表

    def main():
      # 创建 socket 对象
      server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
      localAddr=('',8080)
      server_socket.bind(localAddr)# 绑定端口号
      server_socket.listen(5)# 设置最大连接数,超过后排队
      server_socket.setblocking(0)#将套接字设置为非堵塞  
      while True:
        try:
          
    newClient=server_socket.accept()

        except Exception as result:#如果没有客户端连接则产生一个异常
          pass
        else:#如果有客户端连接,则将新的客户端设置为非阻塞,并添加到客户端列表中
          newClient[0].setblocking(0)
          
    Clients.append(newClient)
        
    Clients_
    invalid=[]#创建无效的客户端列表
        
    for clientSocket,clientAddr in Clients:
          try:
            meg='0'
            
    clientSocket.send(msg.encode('utf-8')#通过发送数据判断客户端是否在线
           except:#客户端不在线
             clientSocket.close()#关闭连接
             Clients_invalid.append((clientSocket,clientAddr))#将客户端计入无效列表
           else:
            try:          
              recvData=clientSocket.recv(1024)
              if len(recvData)>0:
             
       print(recvData))#处理数据
              else:
                pass
              

            except :#接收异常则忽略
              pass
        for client in Clinets_invalid :#从客户端列表中移除无效的客户端
          Clients.remove(client)
    if __name__='__main__':
      main()
  • 相关阅读:
    据说,能找出15个以上的的视力才正常....
    看看用PS来转基因的动物,居然很欢乐!!
    《天引》读书笔记——由新月形面积引发的人类长达2000年的探索。
    练习使用策略模式
    折半查找
    UltraEdit常用配置&搭建Java/C开发环境
    一个操作系统的实现_十分钟完成的操作系统——到这里博客迁移工作圆满结束
    C++中的变量初始化
    LeetCode Range Sum Query
    Peeking Iterator
  • 原文地址:https://www.cnblogs.com/sunsuoli/p/12899697.html
Copyright © 2011-2022 走看看