IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 网络协议 -> Python3 搭建UDP/TCP服务端 -> 正文阅读

[网络协议]Python3 搭建UDP/TCP服务端

基于socketserver实现

看网上有很多人写这个,有说到用socketserver 这个库来实现,但是代码完全不可用,不知道搞些什么,不晓得是不是版本太低还是自己瞎写凑数,然后网上大多都是复制来复制去的同一篇,所以我只能跑到官网去看教程例程,下面便记录一下,socketserver官方文档地址

下面貼出官方TCP服务端的实现demo:

import socketserver

class MyTCPHandler(socketserver.BaseRequestHandler):
    """
    The request handler class for our server.

    It is instantiated once per connection to the server, and must
    override the handle() method to implement communication to the
    client.
    """

    def handle(self):
        # self.request is the TCP socket connected to the client
        self.data = self.request.recv(1024).strip()
        print("{} wrote:".format(self.client_address[0]))
        print(self.data)
        # just send back the same data, but upper-cased
        self.request.sendall(self.data.upper())

if __name__ == "__main__":
    HOST, PORT = "localhost", 9999

    # Create the server, binding to localhost on port 9999
    with socketserver.TCPServer((HOST, PORT), MyTCPHandler) as server:
        # Activate the server; this will keep running until you
        # interrupt the program with Ctrl-C
        server.serve_forever()

下面貼出官方UDP服务端的实现demo:

import socketserver

class MyUDPHandler(socketserver.BaseRequestHandler):
    """
    This class works similar to the TCP handler class, except that
    self.request consists of a pair of data and client socket, and since
    there is no connection the client address must be given explicitly
    when sending data back via sendto().
    """

    def handle(self):
        data = self.request[0].strip()
        socket = self.request[1]
        print("{} wrote:".format(self.client_address[0]))
        print(data)
        socket.sendto(data.upper(), self.client_address)

if __name__ == "__main__":
    HOST, PORT = "localhost", 9999
    with socketserver.UDPServer((HOST, PORT), MyUDPHandler) as server:
        server.serve_forever()

其他线程类混合类请求就去看看官网文档,一切以官方文档为准,文档可切换成中文语言查看,还是很方便的~

原生socket实现

下面是python使用原生Socket搭建UDP的方式,我贴一下简单的

服务端的实现代码:

import socket

# AF_INET 表示使用IPv4, SOCK_DGRAM 则表明数据将是数据报(datagrams)
udp = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

udp.bind(('0.0.0.0', 1777))

while True:
    rec_msg, addr = udp.recvfrom(1024)
    client_ip, client_port = addr
    print('client_ip:', client_ip, 'client_port:', client_port)

    print('msg from client:', rec_msg.decode('utf8'))

    ack_msg = 'Hello, udp client.'
    udp.sendto(ack_msg.encode('utf8'), addr)

用法说明:

  • 使用 udp.bind() 方法绑定 ipport
  • 通过 udp.recvfrom() 方法来收取客户端发送的 udp 消息(该方法是阻塞的,直到有消息来才能够向下执行)
  • 可以在 addr 中获取到 client_ip, client_port,你可以自行记录,以便 server 和 不同的 client 进行通信
  • 收取到的消息使用 decoce() 方法解码,可以得到对应的字符串消息
  • 使用 udp.sendto() 方法可以将消息发送到对应的客户端

客户端实现:

import socket

# AF_INET 表示使用IPv4, SOCK_DGRAM 则表明数据将是数据报(datagrams)
udp_client = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

client_msg = 'Hello udp server.'

udp_client.sendto(client_msg.encode('utf8'), ('127.0.0.1', 1777))

while True:
    rec_msg, addr = udp_client.recvfrom(1024)
    print('msg form server:', rec_msg.decode('utf8'))

该段代码是客户端模拟发送 udp 消息,以及收取 server 的响应消息,其中相关的方法,可以参考上面的描述

  网络协议 最新文章
使用Easyswoole 搭建简单的Websoket服务
常见的数据通信方式有哪些?
Openssl 1024bit RSA算法---公私钥获取和处
HTTPS协议的密钥交换流程
《小白WEB安全入门》03. 漏洞篇
HttpRunner4.x 安装与使用
2021-07-04
手写RPC学习笔记
K8S高可用版本部署
mySQL计算IP地址范围
上一篇文章      下一篇文章      查看所有文章
加:2022-03-30 19:06:09  更:2022-03-30 19:06:38 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 5:44:09-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码