python 网络编程-05 socketserver

socketserver模块

虽说用Python编写简单的网络程序很方便,但复杂一点的网络程序还是用现成的框架比较好。这样就可以专心事务逻辑,而不是套接字的各种细节。SocketServer模块简化了编写网络服务程序的任务。同时SocketServer模块也是Python标准库中很多服务器框架的基础。

socketserver模块可以简化网络服务器的编写,Python把网络服务抽象成两个主要的类,一个是Server类,用于处理连接相关的网络操作,另外一个则是RequestHandler类,用于处理数据相关的操作。并且提供两个MixIn 类,用于扩展 Server,实现多进程或多线程。

Server类
它包含了种五种server类,BaseServer(不直接对外服务)。TCPServer使用TCP协议,UDPServer使用UDP协议,还有两个不常使用的,即UnixStreamServer和UnixDatagramServer,这两个类仅仅在unix环境下有用(AF_unix)。

RequestHandler类

所有requestHandler都继承BaseRequestHandler基类。

创建一个socketserver 的步骤
First, you must create a request handler class by subclassing the BaseRequestHandlerclass 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() orserve_forever() method of the server object to process one or many requests.
Finally, call server_close() to close the socket.

流程图

单线程示例

from socket import *
ip_port=('127.0.0.1',8888)

tcp_socket_server=socket()
tcp_socket_server.bind(ip_port)
tcp_socket_server.listen(5)

while 1:

    conn,addr=tcp_socket_server.accept()
    print('客户端',addr)
    while 1:
        client_data=conn.recv(1024)
        if len(client_data)==0:
              print("客户端断开连接,等待新的用户连接....")
              break
        print ("接受数据 >>>",str(client_data,"utf8"))
        response=input("响应数据 >>>")
        conn.sendall(bytes(response,"utf8"))

    conn.close()

################################################################################


import socket
ip_port = ('127.0.0.1',8888)
sock = socket.socket()
sock.connect(ip_port)
print ("客户端启动:")

while True:

    inp = input('发送数据 >>>')
    if inp == 'exit':
        break
    sock.sendall(bytes(inp,"utf8"))
    server_response=sock.recv(1024)
    print ("服务端响应数据 >>>",str(server_response,"utf8"))

sock.close()

并发示例

import socketserver

class Myserver(socketserver.BaseRequestHandler):

    def handle(self):

            while 1:
                client_data=self.request.recv(1024)
                if len(client_data)==0:
                      print("客户端断开连接,等待新的用户连接....")
                      break
                print ("接受数据 >>>",str(client_data,"utf8"))
                response=input("响应数据 >>>")
                self.request.sendall(bytes(response,"utf8"))

            self.request.close()


server=socketserver.ThreadingTCPServer(("127.0.0.1",8888),Myserver)
server.serve_forever()

######################################################################

import socket
ip_port = ('127.0.0.1',8888)
sock = socket.socket()
sock.connect(ip_port)
print ("客户端启动:")

while True:

    inp = input('发送数据 >>>')
    if inp == 'exit':
        break
    sock.sendall(bytes(inp,"utf8"))
    server_response=sock.recv(1024)
    print ("服务端响应数据 >>>",str(server_response,"utf8"))

sock.close()
posted @ 2020-03-03 18:10  hurz  阅读(199)  评论(0编辑  收藏  举报