udp一对多_【计算机网络】 TCP/UDP + Python 网络编程

7c8c03c0d50675c73d89cb4034b8c9d3.png

1. 简介

1.1 TCP (Transmission Control Protocol)

  • 面向连接
  • 面向字节流
  • 一对一通信
  • 可靠传输,使用流量控制和拥塞控制
  • 首部最小20字节,最大60字节

1.2 UDP (User Datagram Protocol)

  • 无连接
  • 对应用层交付的报文直接打包
  • 支持一对一,一对多,多对一和多对多通信
  • 传输不可靠
  • 首部开销小,仅8字节

以下来自于湖科大教书匠《计算机网络简明教程及仿真实验》视频截图:

fe2d6f3e1ce0586a9c9b613d9573ae61.png

d4712cbd230ca8f907dd2d62f4999c7a.png

53b4c9c7d4cc7fca4e8e55daafcc052d.png

7534376d6b402ac7b4dc85bcb0722ca2.png

e052b74e31ffb3a7434ea98b3370dcbc.png

2. Python

2.1 TCP

  • 服务端 Server
import socket

# 创建 socket
# AF_INET 表示 IPV4 协议,AF_INET6 表示 IPV6
# SOCK_STREAM 表示面向字节流的 TCP 协议,SOCK_DGRAM 表示 UDP
tcp_server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# 绑定 IP 和 port
tcp_server.bind("127.0.0.1", 8888)

# 监听端口
# 参数:等待连接的最大数量
tcp_server.listen(5)
print('waiting for connection ...')

while True:
    # 接受新的连接
    sock, addr = tcp_server.accept()
    # 创建新的线程处理 TCP 连接
    # 每个连接都必须创建新线程(或进程)来处理,否则,单线程在处理连接的过程中,无法接受其他客户端的连接
    t = threading.Thread(target=tcp, args=(sock, addr))

def tcp(sock, addr):
    print('Accept new connection from %s:%s...' % addr)
    sock.send(b'Welcome!')
    while True:
        data = sock.recv(1024)
        time.sleep(1)
        if not data or data.decode('utf-8') == 'exit':
            break
        sock.send(('Hello, %s!' % data.decode('utf-8')).encode('utf-8'))
    sock.close()
    print('Connection from %s:%s closed.' % addr)
  • 客户端 Client
import socket

tcp_client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# 建立连接,注意 (IP, port) 是一个元组 tuple
tcp_client.connect(('127.0.0.1', 8888))

# 发送数据
tcp_client.send('hello')

# 接收数据
buffer = []
while True:
    data = tcp_client.recv(1024) # 指定单次接收的最大字节数
    if data:
        buffer.append(data)
    else:
        break
data_bytes = b''.join(buffer)

tcp_client.close()

2.2 UDP

  • 服务器 Server
import socket

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

# 绑定端口
udp_server.bind(('127.0.0.1', 9999))

while True:
    # 接收数据
    data, addr = udp_server.recvfrom(1024)
    print('Received from %s:%s.' % addr)
    udp_server.sendto(b'Hello, %s!' % data, addr)
  • 客户端 Client
import socket

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

for data in [b'Michael', b'Tracy', b'Sarah']:
    # 发送数据:
    udp_client.sendto(data, ('127.0.0.1', 9999))
    # 接收数据:
    print(udp_client.recv(1024).decode('utf-8'))
udp_client.close()

参考:

网络编程​www.liaoxuefeng.com
60c4fb138184484392327b5a1f91fa55.png
计算机网络简明教程及仿真实验_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili​www.bilibili.com
336330d3cd9c71036b52953fcb1a4014.png
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值