今天主题是实现并发服务器,实现方法有多种版本,先从简单的单进程代码实现到多进程,多线程的实现,最终引入一些高级模块来实现并发TCP服务器。
说到TCP,想起吐槽大会有个段子提到三次握手,也只有程序猿(媛)能get。
UDP服务器数据传输不可靠,这里就忽略了。
>>:
简单的单进程TCP服务器
假代码:
#创建tcp服务器套接字
#绑定端口
#设置正常情况退出的服务器下,端口可以重用
#设置监听,变为主动监听
# 等待客户端的链接,返回新的socket和地址
#关闭tcp服务器套接字
from socket import socket, AF_INET,SOCK_STREAM,SOL_SOCKET,SO_REUSEADDR#创建tcp服务器套接字server_socket = socket(AF_INET,SOCK_STREAM)#绑定端口server_socket.bind(("",9999))#设置正常情况退出的服务器下,端口可以重用server_socket.setsockopt(SOL_SOCKET,SO_REUSEADDR,1)#设置监听,变为主动监听server_socket.listen(5)while True: # 等待客户端的链接,返回新的socket和地址 new_socket,new_address = server_socket.accept() #接收数据,并且发送数据 try: while True: recv_data = new_socket.recv(1024) #当有客户端关闭后,recv解除阻塞,并且返回长度为0 if len(recv_data) > 0: recv_content = recv_data.decode("gb2312") print("收到:%s的信息是:%s" % (str(new_address),recv_content)) new_socket.send("thank you!".encode("gb2312")) else: print("客户端%s已经关闭" % (str(new_address))) break finally: new_socket.close() print("关闭%s客户端" % (str(new_address)))#关闭tcp服务器套接字server_socket.close()
多进程TCP服务器
from socket import socket, AF_INET,SOCK_STREAM,SOL_SOCKET,SO_REUSEADDRfrom multiprocessing import Process#在子进程中接收消息def recv_data(new_socket,new_address): while True: recv_data = new_socket.recv(1024) # 当有客户端关闭后,recv解除阻塞,并且返回长度为0 if len(recv_data) > 0: recv_content = recv_data.decode("gb2312") print("收到:%s的信息是:%s" % (str(new_address), recv_content)) new_socket.send("thank you!".encode("gb2312")) else: print("客户端%s已经关闭" % (str(new_address))) break #关闭与客户端的连接 print("关闭与客户端的连接") new_socket.close()def main(): #创建tcp服务器套接字 server_socket = socket(AF_INET,SOCK_STREAM) #绑定端口 server_socket.bind(("",8888)) #设置正常情况退出的服务器下,端口可以重用 server_socket.setsockopt(SOL_SOCKET,SO_REUSEADDR,1) #设置监听,变为被动连接 server_socket.listen(3) try: while True: # 等待客户端的链接,返回新的socket和地址 new_socket,new_address = server_socket.accept() #接收数据,并且发送数据 Process(target=recv_data,args=(new_socket,new_address)).start() #因为主进程和子进程不共享数据 #如果我们直接关闭new_socket,只是关闭主进程的new_socket,而子进程的不受影响 new_socket.close() finally: #关闭tcp服务器套接字 server_socket.close()if __name__ == "__main__": main()
新闻热点
疑难解答