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()
    
  • 相关阅读:
    查看windows下指定的端口是否开放
    网易云音乐评论爬虫:爬取歌曲的全部评论
    用 Python 玩转 GitHub 的贡献板
    用python实现linux口令破解
    Python 音频数据扩充的技巧
    教你使用python+Opencv完成人脸解锁
    opencv+Python特征检测及K-最近邻匹配
    opencv+python 统计及绘制直方图
    学会用这个工具做分析,1年积累3年工作经验
    15分钟,教你用Python爬网站数据,并用BI可视化分析!
  • 原文地址:https://www.cnblogs.com/pythonPath/p/12403774.html
Copyright © 2011-2022 走看看