Python学习笔记15(socketservre)

利用socket模块创建socket通信服务,但发现利用socket模块创建的服务无法进行多线程的处理,当需要进行大量请求处理时,请求就会阻塞在队列中,甚至发生请求丢弃。并且如果我们需要大量的socket时,就需要重复创建许多socket、绑定端口..... ,对于程序员来说意味着重复书写大量无意义代码。

那有没有一种方式既能简化书写流程又能实现多线程开发呢 ? 答案是肯定的,这就是SocketServer模块。

SocketServer简化了网络服务器的编写。在进行socket创建时,使用SocketServer会大大减少创建的步骤,并且SocketServer使用了select它有4个类:TCPServer,UDPServer,UnixStreamServer,UnixDatagramServer。这4个类是同步进行处理的,另外通过ForkingMixIn和ThreadingMixIn类来支持异步。

该模块在python3中已经更名为socketserver。

使用ThreadingTCPServer:

  • 创建一个继承自 SocketServer.BaseRequestHandler 的类
  • 类中必须定义一个名称为 handle 的方法
  • 启动ThreadingTCPServer

服务端:

import socketserver

class MyTCPHandler(socketserver.BaseRequestHandler):

    def handle(self):
        while True:
            self.data = self.request.recv(1024).strip()
            print("{} wrote:".format(self.client_address[0]))
            print(self.data)
            if not self.data:
                print("断开了")
                break
            self.request.sendall(self.data.upper())


if __name__ == "__main__":
    HOST, PORT = "localhost", 9999
    server = socketserver.ThreadingTCPServer((HOST, PORT), MyTCPHandler)
    server.serve_forever()

客户端和socket的一样:

import socket

ip_port = ('127.0.0.1',9999)
client = socket.socket()
client.connect(ip_port)

while True:
    data = input("客户端输入:").strip()
    if len(data) == 0:
        continue
    client.sendall(data.encode("utf-8"))
    server_reply = client.recv(1024)
    print("客户端收到:",server_reply.decode())

 同socket一样,如果是python3的话,就不能使用if not self.data:break,需要捕捉ConnectionResetError异常,并且,要break掉,要不然会一直重复出异常。

posted @ 2017-08-27 13:26  爱锁屏  阅读(213)  评论(0编辑  收藏  举报