zoukankan      html  css  js  c++  java
  • 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 的步骤

    1 First, you must create a request handler class by subclassing the BaseRequestHandlerclass and overriding its handle() method; this method will process incoming requests.   
    2 Second, you must instantiate one of the server classes, passing it the server’s address and the request handler class.
    3 Then call the handle_request() orserve_forever() method of the server object to process one or many requests.
    4 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()
    View Code

    并发示例

    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()
    View Code
  • 相关阅读:
    moment获取天的23时59分59秒可以用moment().endOf(String),以及获取天的0时0分0秒可以用moment().startOf('day')
    vue 去除输入框首位的空格
    管道
    事件广播
    iview在子组件中调用父组件的方法
    ZOJ 3430 Detect the Virus(AC自动机)
    HDU 3065 病毒侵袭持续中(AC自动机)
    HDU 2896 病毒侵袭(AC自动机)
    HDU 2222 Keywords Search(AC自动机)
    shell常用命令
  • 原文地址:https://www.cnblogs.com/fmgao-technology/p/9870019.html
Copyright © 2011-2022 走看看