Python学习笔记15(socketservre)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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())

 

以上是关于Python学习笔记15(socketservre)的主要内容,如果未能解决你的问题,请参考以下文章

python自动化学习笔记之DAY15

Python100天学习笔记Day15 图像和办公文档处理

Python100天学习笔记Day15 图像和办公文档处理

python笔记15--常见定时功能

Python学习笔记

Python学习笔记