Python-socketserver实例介绍

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()                                 #启动服务
	
	

简单客户端( client):

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()

其实只需把TCPServer()变成ThreadingTCPServer()就可以实现多并发响应客户端了!


这次这个只是简单的使用入门,想要了解更深入,就需要你们好好的去上网查询了解,并看一下官方文档,我想会

收获更大~得意



  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值