工作上需要采集传感器数据,大数据量一般采用udp传输,故此做个记录。
服务端
# 先下载所需模块 socket
pip install -i https://pypi.doubanio.com/simple socket
创建套接字,绑定套接字到本地IP与端口;SOCK_STREAM是基于TCP的,数据传输比较有保障。SOCK_DGRAM是基于UDP的,专门用于局域网。
import socket
# 创建套接字
server_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 绑定ip和端口
server_socket.bind(("127.0.0.1", 5010))
# 等待数据接收,设置接受内容的大小(recvfrom为阻塞式 会一直阻塞到接收缓冲区里有一个字节或一个完整的UDP数据报为止,然后再返回
receive_data, addr = server_socket.recvfrom(1028)
# 打印数据内容,客户端地址
print(receive_data, addr)
基于类函数创建TCP服务端并且持续监听数据
import socket
class DataCollect():
def __init__(self):
try:
self.server_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
self.server_socket.setsockopt(socket.IPPROTO_IP, 1, 1)
self.server_socket.bind(("127.0.0.1", 5010))
self.run()
except Exception as e:
print("error: ", e)
def run(self):
while True:
try:
receive_data, addr = self.server_socket.recvfrom(1028)
print(f"接收到的数据:{receive_data} 地址:{addr}")
except Exception as e:
print("error: ", e)
if __name__ == "__main__":
DataCollect()
关于UDP
- UDP协议适用端口分辨运行在同一台设备上的多个应用程序,UDP有不提供数据报分组、组装和不能对数据包进行排序的缺点。也就是说,当报文发送之后,是无法得知其是否安全完整到达的。
- 在网络质量令人不十分满意的环境下,UDP协议数据包丢失会比较严重。
- 但是由于UDP的特性:它不属于连接型协议,因而具有资源消耗小,处理速度快的优点,所以通常音频、视频和普通数据在传送时使用UDP较多,因为它们即使偶尔丢失一两个数据包,也不会对接收结果产生太大影响。
关于TCP
TCP提供端到端、全双工通信;采用字节流方式,如果字节流太长,将其分段;提供紧急数据传送功能。
- 面向连接的传输;
- 端到端的通信;
- 高可靠性,确保传输数据的正确性,不出现丢失或乱序;
- 全双工方式传输;
- 采用字节流方式,即以字节为单位传输字节序列;
- 紧急数据传送功能。所以如果你需要传输的数据是准确的,建议采用TCP,也就是sock_stream 如果你传输的是视频音频等数据,丢几个包也无所谓的,可以采用UDP,也就是sock_dgram
© 版权声明
THE END
暂无评论内容