The SocketServer
module simplifies the task of writing network servers.
SocketServer是Python中用于并发处理的模块,功能强大,用法简单,今天来简单介绍一下
SocketServer内有五个重要的类:
1.BaseServe:这个类是模块里最基本的类,所有的类源头都来至于这个基类,但是他不是用于实例或使用的
2.TCPServer:这个类用于TCP/ip的socket通讯
3.UDPServer:这个类用于UDP的socket通讯
4.UnixStreamServer 和5.UnixDatagramServer :使用的Unix - domain sockets通讯,并且只能Unix平台使用
官方的类导向图:
+------------+ | BaseServer | +------------+ | v +-----------+ +------------------+ | TCPServer |------->| UnixStreamServer | +-----------+ +------------------+ | v +-----------+ +--------------------+ | UDPServer |------->| UnixDatagramServer | +-----------+ +--------------------+
使用方法:
Creating a server requires several steps. First, you must create a request handler class by subclassing the BaseRequestHandler class and overriding its handle() method; this method will process incoming requests. Second, you must instantiate one of the server classes, passing it the server’s address and the request handler class. Then call the handle_request() or serve_forever() method of the server object to process one or many requests. Finally, call server_close() to close the socket.
意思是说,使用方法大概分四步:
1.创建自己的sockserver类,但必须继承sockeserver中的BaseRequestHandler 类
2.必须重写里面的handle()方法,并把你自己需要处理的交互方式写入,因为这个方法是用于处理的函数
而看源码可以看到,BaseRequestHandler 中的handle()没有写任何东西,所以需要你自己去写
3.然后你需要调用handle_request() 或者 serve_forever() 来使程序处理一个或者多个请求
4.使用server_close()关闭Socket服务。
简单实例:
import SocketServer
class MyTCPHandler(SocketServer.BaseRequestHandler):
def handle(self):
self.data = self.request.recv(1024).strip() #接收客户端数据
print "{} wrote:".format(self.client_address[0]) #输出屏幕并格式化
print self.data
self.request.sendall(self.data.upper()) #将收到的数据变成大写并返回给客户端
if __name__ == "__main__":
HOST, PORT = "localhost", 9999
server = SocketServer.TCPServer((HOST, PORT), MyTCPHandler) #设置ip 和端口号 并把自定义的类填入
server.serve_forever() #启动服务
import socket
client = socket.socket()
client.connect(('localhost',9999)) #连接服务器
while True:
msg = input(">>:").strip()
if len(msg) == 0 :continue
client.send(msg.encode()) #发送数据
data = client.recv(1024) #接收数据
print("返回数据:",data.decode())
client.close()
崩溃,但确会挂起,只有等当前连接的客户端断开时,才会按顺序连接第二个客户端。
那怎么样才能实现多客户端的多线程操作呢,需要自己去写个多线程的程序吗,不不不,这个模块已经给我们都写好了一个方法。
if __name__ =="__main__":
HOST,PORT = "localhost",9999
server = socketserver.ThreadingTCPServer((HOST,PORT),MyTCPHandler)
socketserver.TCPServer
server.serve_forever()
这次这个只是简单的使用入门,想要了解更深入,就需要你们好好的去上网查询了解,并看一下官方文档,我想会
收获更大~