• 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()
    
  • 相关阅读:
    C# 设置 Excel 条件格式 与 冻结窗口
    Exce折叠效果(数据组合)
    [一点一滴学英语]20050829
    Tencent Messenger
    很有趣的一篇文章:不使用Linux的五大理由
    Tencent Messenger (continued)
    N久没有听过这么搞笑的RAP了
    [一点一滴学英语]20050827
    [Eclipse笔记]SWT真正的优势不是快这么简单
    [一点一滴学英语]20050828
  • 原文地址:https://www.cnblogs.com/pythonPath/p/12403774.html
Copyright © 2020-2023  润新知