python socket TCP/UDP/MULTICAST 收发示例

python socket TCP/UDP/MULTICAST 收发示例

一、接收端

import socket
import struct


def tcp_onece_receiver(port):
    """只接收一次 TCP 消息"""
    # 创建 TCP 套接字
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

    # 绑定到本地端口
    sock.bind(('', port))

    # 监听连接
    sock.listen(1)

    print('接收 TCP 消息中...')

    while True:
        conn, addr = sock.accept()
        data = conn.recv(1024)
        print(f'接收到来自 {addr} 的 TCP 消息: {data}')
        conn.close()


def tcp_receiver(port):
    # 创建 TCP 套接字
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

    # 绑定到本地端口
    sock.bind(('', port))

    # 监听连接
    sock.listen(1)

    print('接收 TCP 消息中...')

    conn, addr = sock.accept()
    while True:
        data = conn.recv(1024)

        print(f'接收到来自 {addr} 的 TCP 消息: {data}')

        if data == b'':
            break
    conn.close()


def udp_receiver(port):
    # 创建 UDP 套接字
    sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

    # 绑定到本地端口
    sock.bind(('', port))

    print('接收 UDP 消息中...')

    while True:
        data, addr = sock.recvfrom(1024)
        print(f'接收到来自 {addr} 的 UDP 消息: {data}, {data}')


def multicast_receiver(group, port):
    # 创建 UDP 套接字
    sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

    # 设置 SO_REUSEADDR 选项,允许绑定同一个地址
    sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

    # 绑定到组播地址和端口
    sock.bind(('', port))

    # 加入组播组
    mreq = struct.pack('4sl', socket.inet_aton(group), socket.INADDR_ANY)
    sock.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, mreq)

    print('接收组播消息中...')

    while True:
        data, addr = sock.recvfrom(1024)
        print(f'接收到来自 {addr} 的组播消息: {data}')


if __name__ == "__main__":
    tcp_receiver(26000)
    # udp_receiver(26000)
    # multicast_receiver('224.2.2.1', 26000)

二、发送端

import socket
import struct


def tcp_sender(message: bytes, ip: str, port: int):
    # 创建 TCP 套接字
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

    try:
        # 连接到指定地址
        sock.connect((ip, port))

        # 发送数据
        sock.sendall(message)

        print(f'已将 TCP 消息 {message} 发送到 {ip}:{port}')
    finally:
        sock.close()


def udp_sender(message: bytes, ip: str, port: int):
    # 创建 UDP 套接字
    sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

    # 设置广播选项(当发送 UDP 广播出现 "Permission denied" 错误时,可以尝试设置此选项)
    # sock.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)

    try:
        # 发送数据到指定地址
        sock.sendto(message, (ip, port))

        print(f'已将 UDP 消息 {message} 发送到 {ip}:{port}')
        from time import sleep
        sleep(5)
    finally:
        sock.close()


def multicast_sender(message, group, port):
    # 创建 UDP 套接字
    sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP)

    # 设置TTL,控制数据包在网络中可以经过的最大跳数
    ttl = struct.pack('b', 1)
    sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, ttl)

    try:
        # 发送数据到组播地址
        sock.sendto(message, (group, port))

        print(f'已将组播消息 {message} 发送到 {group}:{port}')
    finally:
        sock.close()


if __name__ == "__main__":
    tcp_sender(b'hello', '127.0.0.1', 26000)
    # udp_sender(b'hello', '127.0.0.1', 26000)
    # multicast_sender(b'hello', '224.1.1.1', 26000)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值