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()

并发示例

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 @ 2018-08-25 17:41  Yuan先生  阅读(700)  评论(0编辑  收藏  举报