欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Python 标准类库 - 因特网协议与支持之socketserver

程序员文章站 2022-03-25 16:10:30
标准类库 - 因特网协议与支持之socketserver by:授客 QQ:1033553122 socketserver 模块,简化网络服务编写任务。 创建服务的步骤 1 通过子类化BaseRequestHandler 类,创建一个请求处理程序,并且重写handle()方法,该方法将处理接收到的请 ......

标准类库 - 因特网协议与支持之socketserver

by:授客 qq1033553122

socketserver 模块,简化网络服务编写任务。

 

创建服务的步骤

1  通过子类化baserequesthandler 类,创建一个请求处理程序,并且重写handle()方法,该方法将处理接收到的请求
2 传递服务器地址和请求处理程序类参数,实例化server类(如tcpserver)

3 调用server对象的handle_request()、serve_forever()方法,处理单个、多个请求

 

实例

socketserver.tcpserver

服务端(单线程服务器)

#!/usr/bin/env python 3.4.0
#-*- encoding:utf-8 -*-

__author__ = 'shouke'

import socketserver


class mytcphandler(socketserver.baserequesthandler):
    """
    供server使用的requesthandler类.

    每个客户端连接连接到服务器时都会被初始化一次,并且必须重写handle()方法以便同客户端交流。
    """

    def handle(self):

        while true:
            # self.request即为与客户端连接的tcp socker
            self.data = self.request.recv(1024).decode('utf-8').strip()

            print('receive data from client[host:%s port:%s]:%s' % (self.client_address[0], self.client_address[1], self.data))
            if self.data == 'bye':
                self.request.sendall(bytes('bye', encoding='utf-8'))
                self.request.close()
                break
            else:

                self.request.sendall(self.data.upper().encode('utf-8'))

if __name__ == '__main__':
    # 创建tcpsocket服务器,绑定到10.118.52.26地址上,端口8000
    server = socketserver.tcpserver(('10.118.52.26', 8000), mytcphandler)


    # 激活服务器,让服务器一直运行,直到按ctrl+c
    server.serve_forever()


客户端

 

#!/usr/bin/env python 3.4.0
#-*- encoding:utf-8 -*-

__author__ = 'shouke'

import socketserver


class mytcphandler(socketserver.baserequesthandler):
    """
    供server使用的requesthandler类.

    每个客户端连接连接到服务器时都会被初始化一次,并且必须重写handle()方法以便同客户端交流。
    """

    def handle(self):

        while true:
            # self.request即为与客户端连接的tcp socker
            self.data = self.request.recv(1024).decode('utf-8').strip()

            print('receive data from client[host:%s port:%s]:%s' % (self.client_address[0], self.client_address[1], self.data))
            if self.data == 'bye':
                self.request.sendall(bytes('bye', encoding='utf-8'))
                self.request.close()
                break
            else:

                self.request.sendall(self.data.upper().encode('utf-8'))

if __name__ == '__main__':
    # 创建tcpsocket服务器,绑定到10.118.52.26地址上,端口8000
    server = socketserver.tcpserver(('10.118.52.26', 8000), mytcphandler)


    # 激活服务器,让服务器一直运行,直到按ctrl+c
    server.serve_forever()

 

运行结果

Python 标准类库 - 因特网协议与支持之socketserver

 

 

 

函数说明:

baseserver.serve_forever(poll_interval=0.5)

处理shudown请求除外的请求。

 

有关socket说明

socket.socket(family=af_inet, type=sock_stream, proto=0, fileno=none)

使用给定的地址家族,socket 类型,协议号创建一个新的socket。

family:默认为af_inet,其它可选值有af_inet6, af_unix, af_can or af_rds

type:默认为sock_stream,其它可选值有 sock_dgram, sock_raw ,或者其它sock_xxx常量

protocol:通常为0或者忽略,当family为af_can时,为can_raw、can_bcm

 

 

socket 对象

socket.close()

标记socket为closed

 

close()释放与连接关联的资源,但不一定立即关闭连接。如果要及时关闭连接,请在调用close()之前调用shutdown()。

 

socket.connect(address)

连接给定地址的远程socket

 

 

socket.recv(bufsize[, flags])

从socket接收数据。返回值即为接收的数据。

buffsize:每次接收的最大数据量。.

flags默认为0

 

注意:为了同硬件和网络设备最佳匹配,buffsize应该为一个相对小的2次幂,比如4096

 

socket.sendall(bytes[, flags])

发送字节数据到socket。不同于send方法,该方法会持续发送bytes参数给定的数据,直到所有数据被发送、错误发生。如果发送成功,则返回none,否则抛出异常。没有方法判断到底成功发送了多少数据

 

socket.send(bytes[, flags])

发送字节数据到socket。返回发送字节数,如果只传输了部分数据,程序会尝试发送剩余数据。

 

更多资料参考官方文档,socket模块

 

 

服务端(多线程服务器)

 

#!/usr/bin/env python 3.4.0
#-*- encoding:utf-8 -*-

__author__ = 'shouke'

import socket

import time

if __name__ == '__main__':
    if_sock_connected = false
    try:

        # 创建一个socket (sock_stream 表示为tcp socket)
        sock = socket.socket(socket.af_inet, socket.sock_stream)


        # 连接到服务器
        sock.connect(('10.118.52.26', 8000))


        # 发送数据
        if_sock_connected = true
        i = 0

        while i < 100:
            if i == 6:
                sock.sendall(bytes('bye\n', "utf-8"))
            else:
                sock.sendall(bytes('hello world with tcp\n', "utf-8"))
                print("sent data to server:{}".format(bytes('hello world with tcp\n', "utf-8")))
            # 从服务器接收数据
            received = str(sock.recv(1024), "utf-8")

            print('receive data from server:%s' % received)
            if received == 'bye':
                break
            time.sleep(1)

            i += 1
    except exception as e:
        print('程序运行出错:%s' % e)
    finally:
        if if_sock_connected:
            sock.close()

运行结果

Python 标准类库 - 因特网协议与支持之socketserver

 

 

 

 

更多资料,烦参考官方文档,socketserver模块。