首页 > 编程 > Python > 正文

基于并发服务器几种实现方法(总结)

2020-02-16 11:22:42
字体:
来源:转载
供稿:网友

今天主题是实现并发服务器,实现方法有多种版本,先从简单的单进程代码实现到多进程,多线程的实现,最终引入一些高级模块来实现并发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()            
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表