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()
  • 相关阅读:
    bzoj3109【CQOI2013】新数独
    HDU 1015 Safecracker(第一次用了搜索去遍历超时,第二次用for循环能够了,思路一样的)
    从头认识java-15.1 填充容器(3)-填充Map
    写一个python的服务监控程序
    javaScript定义函数的三种方式&变量的作用域
    android开发中应该注意的问题
    某技术大牛的帖子(android项目总结)
    android命名规范
    GitHub使用教程for Eclipse
    Android内存性能优化(内部资料总结)
  • 原文地址:https://www.cnblogs.com/sunsuoli/p/12899697.html
Copyright © 2011-2022 走看看