Python3 搭建UDP/TCP服务端

Posted Fu_Lin_

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 的响应消息,其中相关的方法,可以参考上面的描述

以上是关于Python3 搭建UDP/TCP服务端的主要内容,如果未能解决你的问题,请参考以下文章

udp/tcp流程

python3(socket 实现udp,tcp套接字编程)

qt udp tcp代替RPC 图片AI服务器

qt udp tcp代替RPC 图片AI服务器

TCP和UDP基本原理

Linux----网络传输层UDP/TCP