码迷,mamicode.com
首页 > 编程语言 > 详细

Python学习笔记15(socketservre)

时间:2017-08-27 14:07:21      阅读:220      评论:0      收藏:0      [点我收藏+]

标签:名称   mixin   定义   端口   code   request   pre   form   connect   

利用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)

标签:名称   mixin   定义   端口   code   request   pre   form   connect   

原文地址:http://www.cnblogs.com/zy516563199/p/7440154.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!