zoukankan      html  css  js  c++  java
  • 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()
    
  • 相关阅读:
    什么样的基础设施适合快速和大数据架构?
    四大关键步骤掌握CloudOps模型
    容器技术适合你的企业吗
    内存压缩PK页面交换 解决内存问题谁更在行
    内存共享和过量使用区别在哪里
    网络策略中使用的 VLAN 属性
    四大VDI客户端 总有一款适合你
    使用Windows SFC和DISM工具来解决服务器OS问题
    远程 RADIUS 服务器组
    excel知识
  • 原文地址:https://www.cnblogs.com/pythonPath/p/12403774.html
Copyright © 2011-2022 走看看