网络编程之socketserver

2018-10-10  本文已影响0人  大千世界1998

socketserver概述

    socketserver 是 python 中提供的一个可以用于面向对象服务端开发的一个高级模块,封装了底层 socket 的大量操作实现,通过提供面向对象的操作方式简化程序开发。

socketserver 模块:

属性/函数/类型 描述
BaseServer 基础服务类型,包含核心功能
TCPServer/UDPServer TCP/UDP服务类型
UnixStreamServer/UnixDatagramServer 面向文件的TCP/UDP服务类型
ForkingMiXin/ThreadingMiXin 核心派生线程类型
ForkingTCPServer/ForkingUDPServer 线程派生类型和TCP/UDP混合类型
ThreadingTCPServer/ThreadingUDPServer 线程派生类型和TCP/UDP混合类型
BaseRequestHandler 基础请求处理类型
StreamRequestHandler/DatagramRequestHandler 面向连接/无连接的请求处理类型

TCP编程

基于socketserver的TCP服务端的编程开发:

from socketserver import (TCPServer as TCP, StreamRequestHandler as SRH)


# 自定义请求处理类型
class MyRequestHandler(SRH):
    # 重写请求处理方法
    def handle(self):
        # 父类中,请求对象:self.request
        # 接收客户端消息
        print("一个客户端已连接", self.client_address)

        # 发送消息
        self.request.send("my name is server".encode("utf-8"))

        # 接收消息
        info = self.request.recv(1024)
        print(info.decode("utf-8"))


if __name__ == "__main__":
    ADDRESS = ("", 22666)
    # 创建TCP服务器
    tcp_server = TCP(ADDRESS, MyRequestHandler)
    print("server is starting, waiting for connect...")
    # 启动服务器
    tcp_server.serve_forever()

    客户端的操作也相对比较简单,唯一需要注意的是:使用 TCPServer 构建的 TCP 服务端在和客户端进行数据通信的过程中,每一次的数据通信都会使用一个新的套接字对象,所以客户端程序需要改造~每次和服务器进行数据交互时都需要创建一个新套接字。

import socket

ADDRESS = ("IP地址", 22666)

while True:

    client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    client.connect(ADDRESS)

    info = client.recv(1024)
    print(info.decode("utf-8"))

    msg = input("massage:")
    client.send(msg.encode("utf-8"))
    client.close()

UDP编程

基于socketserver的UDP服务端的编程开发:

from socketserver import (UDPServer as UDP, DatagramRequestHandler as DRH)


# 自定义请求处理类型
class MyRequestHandler(DRH):
    # 重写请求处理方法
    def handle(self):
        # 父类中,请求对象:self.request
        # 接收客户端消息
        print("一个客户端已连接", self.client_address)

        # 接收消息
        info = self.rfile.readline()
        print(info.decode("utf-8"))

        # 发送消息
        self.wfile.write("my name is server".encode("utf-8"))


if __name__ == "__main__":
    ADDRESS = ("", 22666)
    # 创建TCP服务器
    udp_server = UDP(ADDRESS, MyRequestHandler)
    print("server is starting, waiting for connect...")
    # 启动服务器
    udp_server.serve_forever()

基于socketserver的UDP客户端的编程开发:

import socket

ADDRESS = ("IP地址", 22666)

while True:

    client = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

    msg = input("massage:")
    client.sendto(msg.encode("utf-8"), ADDRESS)

    info, addr = client.recvfrom(1024)
    print(addr, "say:", info)  

    client.close()
上一篇下一篇

猜你喜欢

热点阅读