chenhaiming

主要类型

  该模块有四个比较主要的类,其中常用的是 TCPServer 和 UDPServer。

  1. TCPServer

  2. UDPServer

  3. UnixStreamServer,类似于TCPServer提供面向数据流的套接字连接,但是旨在UNIX平台上可用;

  4. UnixDatagramServer,类似于UDPServer提供面向数据报的套接字连接,但是旨在UNIX平台上可用;

  这四个类型同步地处理请求,也就是说一个请求没有完成之前是不会处理下一个请求的,这种模式当然不适合生产环境,一个客户端连接就可能拖延所有的执行。所以这个模块还提供了两种支持异步处理的类: 

  5. ForkingMixIn,为每一个客户端请求派生一个新的进程去专门处理;

  6. ThreadingMixIn,为每一个客户端请求派生一个新的线程去专门处理;

  继承自这两个类型的服务端在处理新的客户端连接时不会阻塞,而是创建新的进/线程专门处理客户端的请求。

编程框架 

  首先从高层面介绍一下使用SocketServer模块开发多进程/线程 异步服务器的流程:

  1. 根据需要选择一个合适的服务类型,如,面向TCP连接多进程服务器:  ForkingTCPServer ;

  2. 创建一个请求处理器(request handler)类型,这个类型的 handle()(类似于回调函数)方法中定义如何处理到达的客户端连接。

  3. 实例化服务器,传入服务器绑定的地址和第2步定义的请求处理器类

  4. 调用服务器实例的 handle_request() 或 serve_forever() 方法,一次或多次处理客户请求。

实例代码:

服务端:socket server:

import socketserver
import time

host = \'\'
port = 8000
buffersize = 1024
address=(host,port)

class MyRequestHandler(socketserver.BaseRequestHandler):
    def handle(self):
        print(\'客户端已经连接,地址:{}\'.format(self.client_address))
        while True:
            conn = self.request
            print(\'客户端地址:{}\'.format(self.client_address))
            while True:
                client_data = conn.recv(buffersize)
                print(str(client_data,\'utf8\'))
                print(\'waiting......\')
                # conn.sendall(time.ctime().encode(encoding=\'utf-8\')+b\' \'+client_data)
          resposeStr = input(\'>>>\')
conn.sendall(time.ctime().encode(encoding=\'utf-8\')+b\' \'+ bytes(resposeStr,\'utf8\'))
conn.close()
if __name__==\'__main__\':
    server = socketserver.ThreadingTCPServer(address,MyRequestHandler)
    print(\'正在等待客户端的连接。。。。。。\')
    server.serve_forever()

客户端:普通client

import socket

sk=socket.socket()
address = (\'127.0.0.1\',8000)
sk.connect(address)

while True:
    inp = input(\'>>>\')
    if inp==\'exit\':
        break
    sk.send(bytes(inp,\'utf8\'))
    data = sk.recv(1024)
    print(str(data,\'utf-8\'))

sk.close()

 

 

分类:

技术点:

相关文章: