首页 > 其他分享 >37. socketserver模块

37. socketserver模块

时间:2024-11-25 21:14:23浏览次数:9  
标签:socketserver self 37 tcp client 模块 data 客户端

一、socketserver模块

  SocketServer 是标准库中的一个高级模块,它的目标是简化很多样板代码,它们是创建网络客户端和服务器所必须的代码。这个模块中有为你创建的各种各样的类。

描述
BaseServer 包含核心服务器功能和 min-in 类的钩子;
仅用于推导,这样不会创建这个类的实例;
可以用 TCPServer 或 UDPServer 创建类的实例
TCPServer/UDPServer 基础的网络同步 TCP/UDP 服务器
UnixStreamServer/UnixDatagramServer 基于文件的基础同步 TCP/UDP 服务器
ForkingMixIn/ThreadingMixIn 核心派出或线程功能;
只用作 mix-in 类与一个服务器类配合实现一些异步性;
不能直接实例化这个类
ForkingTCPServer/ForkingUDPServer ForkingMixIn 和 TCPServer/UDPServer 的组合
ThreadingTCPServer/ThreadingUDPServer ThreadingMixIn 和 TCPServer/UDPServer 的组合
BaseRequestHander 包含服务请求的核心功能;
仅仅用于推导,这样无法创建这个类的实例;
可以使用 StreamRequestHandler 或 DatagramRequestHandler 创建类的实例
StreamRequestHander/DatagramRequestHandler 实现 TCP/UDP 服务器的服务处理器

二、基于TCP协议通信

2.1、创建socketserver的TCP服务器

from socketserver import ThreadingTCPServer,StreamRequestHandler
from time import ctime

HOST = "127.0.0.1"
PORT = 8085
ADDRESS = (HOST, PORT)


class MyRequestHandler(StreamRequestHandler):
    def handle(self):
        # 如果是tcp协议,self.request --> connection
        print("...connected from: ",self.client_address)

        while True:  # 通信循环
            try:
                data = self.request.recv(1024)                              # 服务端接收消息,单次最大接收为1024个字节
                # 在Linux系统中,一旦data收到空,意味着是一种异常的行为:客户端非法断开连接
                if not data:                                                # 适用于Linux系统
                    break
                print("收到客户端%s数据:%s" % (self.client_address,data.decode("utf-8")))
                self.request.send(f"[{ctime()}] {data}".encode("utf-8"))    # 服务端发送消息
            except ConnectionResetError:                                    # 适用于Windows系统
                break

        self.request.close()


tcp_server = ThreadingTCPServer(ADDRESS,MyRequestHandler)
print("waiting for connection...")
tcp_server.serve_forever()

  我们得到请求处理程序,作为 socketserver 中 StreamRequestHandler 的一个子类,并重写了它的 handler() 方法,该方法在基类 Request 中默认情况下没有任何行为。当接收一个来自客户端的消息时,它就会调用 handler() 方法。

2.2、创建socketserver的TCP客户端

from socket import socket
from socket import AF_INET, SOCK_STREAM

HOST = "127.0.0.1"
PORT = 8085
ADDRESS = (HOST,PORT)

tcp_client = socket(AF_INET, SOCK_STREAM)                   # 创建客户端套接字
tcp_client.connect(ADDRESS)                                 # 尝试连接服务器

while True:                                                 # 通信循环
    data = input(">>>: ").strip()
    if not data:                                            # 按空格、回车等键结束连接
        break
    tcp_client.send(data.encode("utf-8"))                   # 客户端发送数据

    data = tcp_client.recv(1024)                            # 客户端接收数据,单次最大接收为1024个字节
    if not data:
        break
    print("收到服务端返回的数据:%s" % data.decode("utf-8"))

tcp_client.close()                                          # 关闭客户端套接字

三、基于UDP协议通信

3.1、创建socketserver的UDP服务器

from socketserver import ThreadingUDPServer,BaseRequestHandler
from time import ctime

HOST = "127.0.0.1"
PORT = 8086
ADDRESS = (HOST, PORT)


class MyRequestHandler(BaseRequestHandler):
    def handle(self):
        data = self.request[0]
        server = self.request[1]

        print("收到客户端%s数据:%s" % (self.client_address, data))
        server.sendto(f"[{ctime()}] {data}".encode("utf-8"), self.client_address)  # 服务端发送消息


udp_server = ThreadingUDPServer(ADDRESS,MyRequestHandler)
print("waiting for connection...")
udp_server.serve_forever()

3.2、创建socketserver的UDP客户端

from socket import socket
from socket import AF_INET, SOCK_DGRAM

HOST = "127.0.0.1"
PORT = 8086
ADDRESS = (HOST, PORT)

udp_client = socket(AF_INET,SOCK_DGRAM)                     # 创建服务器套接字

while True:                                                 # 通信循环
    data = input(">>>: ").strip()
    udp_client.sendto(data.encode("utf-8"),ADDRESS)         # 客户端发送数据

    data,server_addr = udp_client.recvfrom(1024)            # 客户端接收数据,单次最大接收为1024个字节
    print("收到服务端返回的数据:%s" % data.decode("utf-8"))

udp_client.close()                                          # 关闭客户端套接字

标签:socketserver,self,37,tcp,client,模块,data,客户端
From: https://www.cnblogs.com/FlurryHeart/p/18568736

相关文章

  • Python -- PyExecJS模块
    PyExecJS介绍PyExecJS是一个可以使用Python来模拟运行JavaScript的库。使用该模块可以通过python程序调用执行js代码,获取js代码返回的结果!注意事项:电脑必须安装好了nodejs开发环境上述模块才可以生效!环境安装:pipinstallPyExecJS使用步骤:导包:importexecjs......
  • DRANet-RAB模块
    classBasic(nn.Module):def__init__(self,in_planes,out_planes,kernel_size,padding=0,bias=False):super(Basic,self).__init__()self.out_channels=out_planesgroups=1self.conv=nn.Conv2d(in_planes,out_planes,......
  • RT-DETR融合[CVPRW2024]MAN中的MLKA模块及相关改进思路
    RT-DETR使用教程: RT-DETR使用教程RT-DETR改进汇总贴:RT-DETR更新汇总贴《Multi-scaleAttentionNetworkforSingleImageSuper-Resolution》一、模块介绍    论文链接:https://arxiv.org/pdf/2209.14145v2    代码链接:https://github.com/icand......
  • Jupyter Notebook无法导入外部模块—引出对环境变量的思考
    JupyterNotebook简介JupyterNotebook是一种交互式的计算环境,允许用户通过Notebook形式创建和共享代码、可视化和文档的组合。它是一个非常流行的数据科学工具,广泛用于数据分析、机器学习。今天主要使用了NumPy——科学计算库;Matplotlib——数据绘图库下文中,为方便起......
  • LeetCode 1837[K进制表示下的各位数字总和]
    题目链接LeetCode1837[K进制表示下的各位数字总和]详情实例提示题解思路进制转换,遍历求和代码classSolution{public:intsumBase(intn,intk){intiSum=0;while(n>0){iSum+=n%k;......
  • python中的包和模块(非常详细),零基础入门到精通,看这一篇就够了
    文章目录一、包与模块二、第三方包的安装2.1pipinstall2.2使用curl+管道2.3其他安装方法三、导入单元的构成3.1pip的使用3.2模块的缓存3.3源码包与二进制包四、setup.py的编写零基础入门AI大模型1.学习路线图2.视频教程3.技术文档和电子书4.LLM面试题和面经合......
  • 【FAQ】Harmo【FAQ】HarmonyOS SDK 闭源开放能力 — 公共模块
    1.问题描述:文档哪里能找到所有的权限查看该权限是用户级的还是系统级的。解决方案:您好,可以看一下下方链接是否可以解决问题:https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/permissions-for-all-V5https://developer.huawei.com/consumer/cn/doc/harmonyo......
  • 【web】Gin+Go-Micro +Vue+Nodejs+jQuery+ElmentUI 用户模块之vue登录开发以及接口联
    在现代Web应用中,实现用户登录模块是一个关键功能。本文将分为初级、中级、高级阶段,详细说明如何使用Vue、ElementUI进行登录开发,并与Gin、Go-Micro、Node.js进行接口联调。初级用法介绍在初级阶段,主要关注于使用Vue和ElementUI创建一个简单的登录界面,并通过Node.js后端进......
  • Toyota Programming Contest 2024#11(AtCoder Beginner Contest 379)
    A-Cyclic链接:A-Cyclic代码:#include<bits/stdc++.h>usingnamespacestd;intmain(){ stringss; cin>>ss; cout<<ss[1]<<ss[2]<<ss[0]<<""<<ss[2]<<ss[0]<<ss[1]; return0;}B-Strawberri......
  • 如何通过命令行创建一个Maven多模块项目
    本教程将引导您使用命令行创建一个简单的Maven多模块项目,以一个博客应用为例,该应用包含一个父项目和三个子模块:blogger-core、blogger-common和blogger-web。我们将使用最新的Java版本和依赖项。准备工作确保您的系统已安装以下软件:JDK21Maven文本编辑器或IDE(如Eclip......