基于TCP协议编写并发服务器
基于多进程编写 tcp 并发服务器
import socket
import multiprocessing
def set_server():
"""
服务器相关设置
:return:
"""
# 1、创建'TCP'协议下的套接字对象
sk = socket.socket()
# 2、一般来说,一个端口释放后会等待两分钟之后才能再被使用,
# 'SO_REUSEADDR'是让端口释放后立即就可以被再次使用
# 'value'设置为 1,表示将'SO_REUSEADDR'标记为'TRUE'
sk.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
# 3、服务端绑定(ip + port)注册网络
sk.bind(("127.0.0.1", 6688))
# 4、开启监听
sk.listen(5)
try:
while True:
conn, client_addr = sk.accept()
p1 = multiprocessing.Process(target=deal_client_request, args=(conn, client_addr))
p1.start()
conn.close()
finally:
sk.close()
def deal_client_request(conn, client_addr):
"""
处理客户端的请求,为其服务,进行数据收发
:param conn:
:param client_addr:
:return:
"""
while True:
recv_msg = conn.recv(1024)
if len(recv_msg) > 0:
print(recv_msg.decode())
else:
print(f"{client_addr} 客户端已主动关闭!")
break
conn.close()
if __name__ == "__main__":
set_server()
基于多线程编写 tcp 并发服务器
# 多线程 tcp 并发服务器
import socket
import threading
def server_set():
"""
服务器相关设置
:return:
"""
sk = socket.socket()
sk.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
sk.bind(("127.0.0.1", 6688))
sk.listen(5)
try:
while True:
conn, client_addr = sk.accept()
t1 = threading.Thread(target=deal_client_request, args=(conn, client_addr))
t1.start()
finally:
sk.close()
def deal_client_request(conn, client_addr):
"""
处理客户端请求,进行数据收发
:param conn:
:param client_addr:
:return:
"""
while True:
recv_msg = conn.recv(1024)
if len(recv_msg) > 0:
print(recv_msg.decode())
else:
print(f"{client_addr} 客户端已主动关闭连接!")
break
conn.close()
if __name__ == "__main__":
server_set()
基于 SocketServer 实现简化并发服务器
import socketserver
class MyServer(socketserver.BaseRequestHandler):
def handle(self):
while True:
# 接收数据
recv_msg = self.request.recv(1024)
print(recv_msg.decode())
# 响应数据
self.request.send(recv_msg)
if __name__ == "__main__":
# 允许端口重用
socketserver.TCPServer.allow_reuse_address = True
# 实例化服务器对象
server = socketserver.ThreadingTCPServer(("127.0.0.1", 6688), MyServer)
# 服务器永久运行
server.serve_forever()
文章永久链接:https://tech.souyunku.com/34420