Python_socketserver

版权声明:由于作者水平有限,文中难免有误,欢迎各位业界同仁斧正! https://blog.csdn.net/UserPython/article/details/80208965

socketserver的模块

简介

socketserver模块简化了网络服务器的编写。它有4个类:TCPServer、UDPServer、UnixStreamServer、UnixDatagramServer。这4个类是同步进行处理的,即同一个服务器只能服务一个客户端,如果其他客户端连接服务器,则该客户端处于阻塞状态,直到前一个客户端断开连接才能与服务器交互。另外通过ThreadingMixIn(线程异步)和ForKingMixIn(进程异步)类来支持异步处理,即同一个服务器可以同时与多个客户端交互。

创建异步服务器步骤:

  • 首先创建一个请求处理类,它是socketserver模块中BaseRequestHandler类的子类,并重载其handle()方法
  • 其次创建一个混合处理类,参数为异步类中ThreadingMixIn、ForKingMixIn的一个,及一个同步处理类
  • 最后实例化一个服务器类,传入服务器的(地址,端口)和请求处理类。然后调用serve_forever()方法执行请求

TCPServer同步处理服务器端

import socketserver
"""
这个服务器请求处理类是我们自己定义的,它继承了socketserver的模块中的BaseRequestHandler类,并且要重写父类中的handle方法
"""
class MyTCPHandler(socketserver.BaseRequestHandler):
    #服务器与客户端所有的交互都在重写的handle方法中完成
	def handle(self):
		while True:
			try:
                #self.request是连接到客户端的TCP的套接字。(或者理解为服务器套接字实例化的对象)
				self.data = self.request.recv(1024).strip()
				print("客户端地址: %s 端口: %s " % (self.client_address[0], self.client_address[1]))
				print("客户端发来的信息:", self.data.decode())
                #发送相同信息会给客户端,但改为大写
				self.request.send(self.data.upper())
			except ConnectionResetError as e:
				print("err:", e)
				break

if __name__ == "__main__":
	HOST, POST = "127.0.0.1", 9999
    #创建服务器,并绑定地址和端口
	server = socketserver.TCPServer((HOST, POST), MyTCPHandler)
	server.serve_forever() #永远执行请求

客户端

import socket

HOST, PORT = "127.0.0.1", 9999
# Create a client socket
client = socket.socket()
# Connect to server
client.connect((HOST, PORT))

# loop send
while True:
    msg = input("Please enter the information send>>>:").strip()
    # 如果数据为空,则让用户重新发送
    if (len(msg) == 0): continue

    client.send(msg.encode("utf-8"))

    data = client.recv(1024)
    print("服务器发来的信息:", data.decode())

client.close()

ThreadingMixIn异步处理服务器[多线程并发]

import socketserver
"""
这个请求处理类是我们自己定义的,它继承了SocketServer的模块中的BaseRequestHandler类,并且重写父类的处理方法
"""
class ThreadingMixInTCPHandler(socketserver.BaseRequestHandler):
    #服务器与客户端所有的交互都在重写的handle方法中完成
	def handle(self):
		while True:
			try:
                #self.request是连接到客户端的TCP的套接字。(或者理解为服务器套接字实例化的对象)
				self.data = self.request.recv(1024).strip()
				print("客户端地址: %s 端口: %s " % (self.client_address[0], self.client_address[1]))
				print("客户端发来的信息:", self.data.decode())
                #发送相同信息会给客户端,但改为大写
				self.request.send(self.data.upper())
			except ConnectionResetError as e:
				print("err:", e)
				break

class ThreadedTCPServer(socketserver.ThreadingMixIn, socketserver.TCPServer):
	pass

if __name__ == "__main__":
	HOST, POST = "127.0.0.1", 9999
    #创建服务器,并绑定地址和端口
	server = ThreadedTCPServer((HOST, POST), ThreadingMixInTCPHandler) #创建一个新线程实例
	server.serve_forever() #永远执行请求

	# server = socketserver.ThreadingTCPServer((HOST, POST), ThreadingMixInTCPHandler)
	# server.serve_forever()  # 永远执行请求
	# ThreadingMixIn()方法等同于class ThreadedTCPServer(socketserver.ThreadingMixIn, socketserver.TCPServer): pass
	#一般不采取该写法
客户端用上面的就可以了
ForkingMixIn的使用方法类似,只不过是用进程代替线程


猜你喜欢

转载自blog.csdn.net/UserPython/article/details/80208965