|
《主流程, 服务端:》
- import socket
- from multiprocessing import Pool
- serverSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # TCP
复制代码
AF_INET: 是ipv4网络协议的套接字类型,广泛用于ipv4套接字编程之中。
PF_INET: 和上者是等价的,取值一样用途一样,只是出现在早期Linux中。(BSD中使用AF_INET)
socket.SOCK_STREAM指的是TCP协议,即流式协议
socket.SOCK_DGRAM指的是UDP协议,即数据报协议
问题《一》:
有的时候当我们重启服务端的时候,可能会报告:- Traceback (most recent call last):
- File "服务端.py", line 9, in <module>
- socket_server.bind(("172.17.100.52", 6930))
- socket.error: [Errno 98] Address already in use
复制代码
这个是由于你的服务端仍然存在四次挥手的time_wait状态在占用地址(1.tcp三次握手,四次挥手 2.syn洪水攻击 3.服务器高并发情况下会有大量的time_wait状态的优化方法)
解决方法:
加入一条socket配置,重用ip和端口
- socket_server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
- socket_server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
- socket_server.bind(("172.17.100.52", 6930))
复制代码
《主流程, 服务端:》
- serverSocket.bind((dicConnectStr['url'], dicConnectStr['port']))
复制代码- serverSocket.listen(5) # TCP协议中半链接池的数量,可同时挂起5个链接。
复制代码 这里listen(5)设置半连接池监听的数量,超过后排队。
- pool = Pool() # if processes number is 5, it can not add dynamic. So leave it null.
- conn = socket.socket() # 初始化一个conn替身,如果try失败,可以回收该变量。
- try:
- while True:
- # 有一个客户端连上来了:(server.accept)
- conn, addr = serverSocket.accept()
- pool.apply_async(talk, (conn, addr)) # async talk to client , conn/addr is arguments.
- except (KeyboardInterrupt,Exception) as err:
- print(repr(Exception), repr(err))
- raise
- finally:
- conn.close() # 这里是Try while根本没有进入(没成功),这里将socket.socket()直接析构。
- pool.close() # 关闭进程池
- pool.join() # 回收进程池
- serverSocket.close()
复制代码
参考:https://blog.csdn.net/a2011480169/article/details/73602708
|
|