标签:send 消息 个数 encode udp style 打印 tcp协议 int
-------------------------------------------------------------------------------------------------------------------------------------
一、UDP协议:OSI七层协议中的传输协议的一种(另外一种tcp协议),他们都是一种端口协议
而且UDP协议传输具有不安全行,或者说是即时性,给对方发送信息时候,只管发,至于他收不收得到都不会去考虑,
不管是服务端还是客户端都一样。
下面来简单实现基于UDP协议的客户端、服务端通信
# 服务端: import socket # udp传输的服务端无需半连接池,因为通信无需建立双向连接通道,无需三次握手四次挥手,只要知道对方ip和port就行 server = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) server.bind((‘127.0.0.1‘, 8080)) # 通信循环 while True: data, client_addr = server.recvfrom(1024) # 这里接收用recvfrom print(‘收到客户端发来的udp消息%s‘ % data.decode(‘utf-8‘)) server.sendto(data.upper(), client_addr) # 这里发送用sendto # 客户端: import socket # 无需connect服务端,因为发送时候跟上服务端ip和port就行 client = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) while True: msg = ‘hello‘ client.sendto(msg.encode(‘utf-8‘), (‘127.0.0.1‘, 8080)) data, server_addr = client.recvfrom(1024) print(data.decode(‘utf-8‘))
二、UDP协议的一些特点
总结几个UDP协议的特点:
# 验证UDP是否有粘包问题: from socket import * server = socket(AF_INET, SOCK_DGRAM) server.bind((‘127.0.0.1‘, 8080)) while True: data1, addr = server.recvfrom(1024) data2, addr = server.recvfrom(1024) data3, addr = server.recvfrom(1024) data4, addr = server.recvfrom(1024) data5, addr = server.recvfrom(1024) print(data1) print(data2) print(data3) print(data4) print(data5) from socket import * client = socket(AF_INET, SOCK_DGRAM) while True: client.sendto(b‘Hello1‘, (‘127.0.0.1‘, 8080)) client.sendto(b‘Hello2‘, (‘127.0.0.1‘, 8080)) client.sendto(b‘Hello3‘, (‘127.0.0.1‘, 8080)) client.sendto(b‘Hello4‘, (‘127.0.0.1‘, 8080)) client.sendto(b‘Hello5‘, (‘127.0.0.1‘, 8080)) # 打印的每条数据都是独立的,没有2条数据在一起的情况 UDP不存在粘包问题,是由于UDP发送的时候,没有经过Nagle算法的优化,不会将多个小包合并一次发送出去。另外,在UDP协议的接收端,采用了链式结构来记录每一个到达的UDP包,这样接收端应用程序一次recv只能从socket接收缓冲区中读出一个数据包。也就是说,发送端send了几次,接收端必须recv几次(无论recv时指定了多大的缓冲区)。
标签:send 消息 个数 encode udp style 打印 tcp协议 int
原文地址:https://www.cnblogs.com/suguangti/p/10891403.html