select版tcp服务器(python实现)

红太狼 2022-06-09 14:15 312阅读 0赞

在编写了单进程非阻塞式服务器之后,还有另外种写服务器的方法,便是利用select。
select是对底层操作系统的一个访问操作,因而效率较高,比单进程非阻塞中的for循环遍历效率要高,可以利用select进行选择,选择出来可以读取信息的套接字、可以发送信息的套接字、以及产生的异常(分别是三个返回值)。

  1. readable, writable, exceptionable = select([], [], [])

以上即为select的使用方法,程序执行到该语句后进行阻塞等待,接收到新的套接字之后便解阻塞。
程序思路便是利用select检测、选择出能读取的套接字(包括服务器套接字、客户端套接字),将接收到消息的客户端套接字存入列表(列表中本来只有服务器套接字),之后进行for循环遍历,读取套接字中的信息或者进行与客户端的连接。
代码如下:

  1. #-*- coding:utf-8 -*-
  2. from socket import *
  3. from select import select
  4. import sys
  5. def main():
  6. serSocket = socket(AF_INET, SOCK_STREAM)
  7. localAddr = ('', 7788)
  8. serSocket.bind(localAddr)
  9. serSocket.setblocking(False)
  10. serSocket.listen(100)
  11. inputs = [serSocket]
  12. running = True
  13. while True:
  14. readable, writable, exceptionable = select(inputs, [], [])
  15. for sock in readable:
  16. if sock == serSocket:
  17. clientSocket, clientAddr = serSocket.accept()
  18. print('newClient[%s]'%str(clientAddr))
  19. inputs.append(clientSocket)
  20. elif sock == sys.stdin:
  21. cmd = sys.stdin.readline()
  22. running = False
  23. break
  24. else:
  25. massage = sock.recv(1024)
  26. if massage:
  27. print('massage from [%s] is %s'%(str(sock), massage.decode('utf-8')))
  28. else:
  29. print('[%s] was closed'%(str(sock)))
  30. inputs.remove(sock)
  31. sock.close()
  32. if not running:
  33. break
  34. serSocket.close()
  35. if __name__ == '__main__':
  36. main()

select版服务器有一定的缺点,便是只能处理1024个并发客户端,因而其效率还是有一定的局限性。

发表评论

表情:
评论列表 (有 0 条评论,312人围观)

还没有评论,来说两句吧...

相关阅读

    相关 QT TCP服务器实现

    1.TCP通信概述 tcp是一种用于数据传输的低级网络协议,它是可靠的、面向流、面向连接的传输协议,特别适合于连续数据传输。 服务器端使用QTcpServer用于端口监