码迷,mamicode.com
首页 > 其他好文 > 详细

socketserver

时间:2018-03-08 21:13:26      阅读:168      评论:0      收藏:0      [点我收藏+]

标签:大小   put   wro   action   错误   检查   nis   多用户   gif   

SocketServer

socket有个问题,无法支持多用户(多并发)所以就出现了SocketServer

SocketServer模块简化了编写网络服务器,SocketServer是对socket的再封装,使其更简单

socketserver.TCPServer(server_address,RequestHandlerClass,bind_and_activate=True)(最常用)
socketserver.UDPServer(server_address,RequestHandlerClass,bind_and_activate=True)(这个比较少用)

socketserver.UnixStreamServer(server_address,RequestHandlerClass,bind_and_activate=True)(更少用,本机内不同进程交互使用)
socketserver.UnixDatagramServer(server_address,RequestHandlerClass,bind_and_activate=True)(更少用)

以上四个都继承了BaseServer

技术分享图片

 


创建一个socketserver至少分以下几步:


1.你必须创建一个请求处理类,并且这个类要继承类BaseRequestHandler,重写父类的handle()方法(跟客户端所有的交互都是这个方法里面写的)

2.你必须要实例化TCPServer等上面提出的类其中一个,并且传递server ip和你上面创建的请求处理类给这个TCPServer(这里以TCPServer为例子)

3.
server.handle_request()#只处理一个请求(这个一般不用)
server.serve_forever()#处理多个请求,永远执行

4.关闭socketserver

 

技术分享图片
import socketserver

# 每个客户端请求过来都会实例化MyTCPHandler
# 必须要写一个自己的处理类,这个类必须继承BaseRequestHandler并且重写handle()方法
class MyTCPHandler(socketserver.BaseRequestHandler):
    # 重写handle()方法
    def handle(self):
        while True:
            try:
                # self.request.recv 接收客户端数据
                self.data = self.request.recv(1024).strip()
                print("{}wrote:".format(self.client_address))
                print(self.data)

                # 将数据变成大写,再发送回客户端
                self.request.send(self.data.upper())

            except ConnectionResetError as e:
                print("客户端%s已经断开"%format(self.client_address),e)
                break
if __name__ == __main__:
    HOST,PORT = "localhost",9999

    # 实例化TCPServer,将ip地址以及端口传递,还有刚刚定义的类也传递
    # TCPServer只是单对单的服务
    # server = socketserver.TCPServer((HOST,PORT),MyTCPHandler)

    # ThreadingTCPServer才是多线程
    server = socketserver.ThreadingTCPServer((HOST, PORT), MyTCPHandler)

    # 建立多进程,一般用于linux操作系统,windows没有
    # server = socketserver.ForkingTCPServer((HOST, PORT), MyTCPHandler)

    print("服务器已经启动".center(70, "="))
    # 处理多个客户端请求
    server.serve_forever()
socketserver例子

 

技术分享图片
import socket

client = socket.socket()

client.connect(("localhost",9999))

while True:

    msg = input("输入:").strip()

    if not msg:
        continue
    client.send(msg.encode("utf-8"))

    recv = client.recv(1024)
    print(recv.decode())
client

 

HOST = 0.0.0.0#这样写是避免了一台机器多个网卡的情况,只有特定的ip地址才能访问
fileno()#返回文件描述符
,一般用不到

handle_request()#处理单个请求,一般不用

server_forever(poll_interval = 0.5)#一直处理请求知道收到一个明确的shutdown()请求,每0.5秒检查一下shutdown信号。

server_actions()#收到shutdown请求后,会自动调用server_actions()去清理子进程的垃圾。

shutdown()#告诉server_forever()让他停掉,然后清理垃圾

server_close()#关闭服务器

address_family#地址簇

RequestHandlerClass #请求处理类

server_address #ip地址

socket#之前学习的socket

allow_reuse_address#允许地址重用,即服务器断开了,但是客户端依然连接的情况,强制断开客户端地址,使得服务器地址能够再次使用,不报错;不然需要等几十秒才能自动断开

request_queue_size#队列大小

socket_type #协议类型

timeout#超时时间,一般不使用

finish_request()#一般不使用

get_request()#获取请求的实例以及ip地址,一般不使用

handle_error(request,client_address)#处理错误,一般也不怎么使用

handle_timeout()#一般不使用

process_request(requet,client_address)#处理单个请求用

server_activate()#没用过

server_bind()#内部调用,一般用不到

 

socketserver

标签:大小   put   wro   action   错误   检查   nis   多用户   gif   

原文地址:https://www.cnblogs.com/cheng662540/p/8530768.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!