python socket基础三 socketserver的用法

import socketserver

class MyTCPserver(socketserver.BaseRequestHandler):
    def handle(self):
        while True:
            try:
                self.data=self.request.recv(1024).strip()
                print("您已经接收数据:",self.data)
                self.request.sendall(self.data.upper())
                print("您已经发送数据:")
            except ConnectionResetError as e:
                break


host,port="127.0.0.1",6000
serverTCP = socketserver.TCPServer(("127.0.0.1", 6000), MyTCPserver)
print("***连接成功***")
#server=socketserver.ThreadingTCPServer((host,port),MyTCPserver)
serverTCP.serve_forever()

import socket

client=socket.socket()
client.connect(('127.0.0.1',6000))

while True:
    msg=input("<<请输入").strip()
    if len(msg)==0:continue
    ss=client.send(msg.encode('utf-8'))
    print("send:",ss)
    data = client.recv(1024)
    print(data.decode('utf-8'))
client.close

遇到了bug,因为我之前用过这个端口,没有停掉

这个问题肯定是server的问题,要不是server写错了,要不是先开启了client

我是把handle写成了handler一直进不去这个函数,后来注意到这个是继承的前面肯定有override的标识

self.request就是socket中的server.accept()接收到的request是一致的.
代码的思路
1. 创建一个请求处理的类,并且这个类要继承BaseRequestHandlerclass ,并且还要重写父类里handle()方法;
2. 你必须实例化 TCPServer,并且传递server IP和你上面创建的请求处理类,给这个TCPServer;
3. server.handle_requese()#只处理一个请求,server.server_forever()处理多个一个请求,永远执行
4. 关闭连接server_close()
fileno()
返回服务器正在侦听的套接字的整数文件描述符。这个函数通常被传递给选择器,允许在同一个进程中监视多个服务器。

handle_request()
处理一个请求。该函数按顺序调用以下方法:get_request(),verify_request()和process_request()。如果处理程序类的用户提供的handle()方法引发异常,则将调用服务器的handle_error()方法。如果在超时秒内没有收到请求,则会调用handle_timeout(),并返回handle_request()。

serve_forever(POLL_INTERVAL = 0.5)
处理请求直到显式关闭()请求。轮询关闭每个poll_interval秒。忽略超时属性。它还调用service_actions(),子类或mixin可以使用它来提供特定于给定服务的操作。例如,ForkingMixIn类使用service_actions()来清理僵尸子进程。

在版本3.3中进行了更改:将service_actions调用添加到了serve_forever方法。

service_actions()
这在serve_forever()循环中被调用。这个方法可以被子类或mixin类覆盖,以执行特定于给定服务的操作,例如清理操作。

3.3版本中的新功能

shutdown()
告诉serve_forever()循环停止并等待,直到它结束。

server_close()
清理服务器。可能会被覆盖。

address_family
服务器套接字所属的协议族。通常的例子是socket.AF_INET和socket.AF_UNIX。

RequestHandlerClass
用户提供的请求处理程序类;这个类的一个实例是为每个请求创建的。

server_address

服务器正在侦听的地址。地址格式因协议族而异,有关详细信息,请参阅套接字模块的文档。对于Internet协议,这是一个包含给出地址的字符串的元组,以及一个整数端口号:('127.0.0.1',80)。

socket
服务器将侦听传入请求的套接字对象。

服务器类支持以下类变量:

allow_reuse_address
服务器是否允许重用地址。这默认为False,可以在子类中设置来更改策略。

request_queue_size
请求队列的大小。如果处理单个请求需要很长时间,则在服务器繁忙时到达的所有请求都会被放入一个队列中,最多为request_queue_size请求。一旦队列已满,来自客户端的进一步请求将会得到“连接被拒绝”错误。默认值通常是5,但这可以由子类覆盖。

socket_type
服务器使用的套接字的类型; socket.SOCK_STREAM和socket.SOCK_DGRAM是两个常见的值。

timeout
超时持续时间(以秒为单位);如果不需要超时,则超时。如果handle_request()在超时期限内没有收到传入的请求,则调用handle_timeout()方法。

有许多服务器方法可以被TCPServer等基本服务器类的子类覆盖;这些方法对服务器对象的外部用户没有用处。

finish_request()
实际上通过实例化RequestHandlerClass并调用其handle()方法来处理请求。

get_request()
必须接受来自套接字的请求,并返回包含要用于与客户端通信的新套接字对象的2元组以及客户端的地址。

handle_error(request,client_address)
如果RequestHandlerClass实例的handle()方法引发异常,则调用此函数。默认操作是将回溯打印到标准输出,并继续处理更多的请求。

handle_timeout()
当timeout属性被设置为None以外的值时,该函数被调用,超时时间已经过去,没有收到请求。派生服务器的默认动作是收集退出的任何子进程的状态,而在线程服务器中,这个方法什么也不做。

process_request(request,client_address)
调用finish_request()来创建RequestHandlerClass的一个实例。如果需要,这个函数可以创建一个新的进程或线程来处理请求; ForkingMixIn和ThreadingMixIn类都是这样做的。

server_activate()
由服务器的构造函数调用以激活服务器。 TCP服务器的默认行为只是在服务器套接字上调用listen()。可能会被覆盖。

server_bind()
由服务器的构造函数调用,将套接字绑定到所需的地址。可能会被覆盖。

verify_request(request,client_address)
必须返回一个布尔值;如果值为True

猜你喜欢

转载自blog.csdn.net/qq_37312720/article/details/82979371