python使⽤socket⾼效传输视频数据帧(连续发送图⽚)
⽬录
遇到的问题
代码问题记录(需要代码的可以直接⽂末)
代码
客户端clien.py
服务端server.py
遇到的问题
⽹上了⼀些代码,都是只能建⽴⼀次socket传输⼀张图⽚,然后断开重新连重新传。⽽建⽴⼀次socket代价不⼩,反复建⽴会⾮常消耗系统资源,因此尝试⾃⼰通过⼀次socket连续传输多张图⽚
代码问题记录(需要代码的可以直接⽂末)
在做的过程中发现了⼀些问题:
socket在传⼀张图⽚时是以⼆进制流的形式传输,图⽚的⼆进制流⽐较⼤,⼀般⼀次传不完,要传很多次。那么接受者是如何知道什么时候才停⽌接收这张图⽚呢?那可以让发送者在发图之前先发⼀个头信息,告诉接收者这个⼆进制流有多长,然后接收者通过这个来判断是否传完。
这个问题是最让我致命的,由于发送者先发了⼀个头信息,使⽤socket.send()函数,然后发送图⽚也是要⽤socket.send()函数,接收端使⽤的是v(1024)函数,1024是缓存⼤。⿇烦来了,由于发送者使⽤连续的两个send,⽽v(1024)是有缓存的,他会把这两个信息缓存到⼀起去,信息头和图⽚信息全被缓存了这会直接导致代码接收逻辑错误。我的做法是,不能有两个send同时出现,那么我就在send中间加⼀个recv函数(阻塞函数),也就是发送者每发⼀个消息,接收者就⽴马回复⼀个消息,这样就保证了不会连续send
代码
由于项⽬存在两种数据源,⼀种是可见光,⼀种是红外,所以我最开始还要制作⼀个信息头,每次发送的时候要告诉接收者这是什么类型的数据,然后再接收
制作不易,记得给个赞哈!
客户端clien.py
# 服务器的地址
server_address = ('127.0.0.1', 8000)
def send(dir_name, data_format, file_name):
# 与接收端建⽴socket通信
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)  # AF_INET(TCP/IP – IPv4)协议
python入门教程视屏# 每次通信都带⼀个通信头,表明数据源的类型(红外还是可见光),要保存数据帧的⽂件夹名file_name
# 你可以不要数据格式,这⾥可以定义成你⾃⼰的形式,也算是⼀种安全机制
sock.send('{}|{}'.format(data_format, file_name).encode())  # 默认编码 utf-8,发送⽂件长度和⽂件名
reply = v(1024)
# 按照⽂件名排序,0.png,1.png
file_list = os.listdir(dir_name)
matlab画图怎么设置图例file_list.sort(key=lambda x: int(x[:-4]))
if 'ok' == reply.decode():  # 确认⼀下服务器get到⽂件长度和⽂件名数据
i = 0
print(len(file_list))
for file_name in file_list:
data = file_deal(os.path.join(dir_name, file_name))
sock.send('{}|{}'.format(len(data), file_name).encode())
go = 0
total = len(data)
while go < total:  # 发送⽂件
data_to_send = data[go:go + total//2]
sock.send(data_to_send)
go += len(data_to_send)
为什么叫c语言
i += 1
if i < len(file_list):
编程培训工作室sock.send(b'continue')
sock.send(b'over')
sock.close()
def file_deal(file_path):  # 读取⽂件的⽅法
mes = b''
try:
file = open(file_path, 'rb')
mes = ad()
except:
print('error{}'.format(file_path))
else:
file.close()
return mes
服务端server.py
LOCAL_IP = '127.0.0.1'  # 本机测试使⽤ip,局域⽹中使⽤需更换ip
PORT = 8000  # 随意指定⼀个端⼝
def server():
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)  # socket.AF_INET 指ipv4  socket.SOCK_STREAM 使⽤tcp协议    sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)  # 设置端⼝
sock.bind((LOCAL_IP, PORT))  # 绑定端⼝messagebox用不了
sock.listen(3)  # 监听端⼝
while True:
sc, sc_name = sock.accept()  # 当有请求到指定端⼝是 accept()会返回⼀个新的socket和对⽅主机的(ip,port)
print('收到{}机器请求'.format(sc_name))
info = sc.recv(1024)  # 接受客户端发来的协议头,区分数据源
# 安全处理:如果不是以这个协议头开始,认为是⾮法接⼊,就直接断掉。这⾥可以⾃⼰定义⼀些安全消息机制
print(info)
try:
data_format, directory_name = info.decode().split("|")
sc.send(b'ok')  # 表⽰收到⽂件长度和⽂件名
except:
print('协议头不对,⾃动断开连接')
sc.close()
continue
if not ists(directory_name):
os.mkdir(directory_name)
# 协议头正确之后,不断接收发来的数据帧
while True:
head_info = sc.recv(1024)
# print(data_info)
length, file_name = head_info.decode().split('|')
sc.send(b'ok')
if length and file_name:
print(file_name)
newfile = open(os.path.join(directory_name, file_name), 'wb')  # 这⾥可以使⽤从客户端解析出来的⽂件名
file = b''
total = int(length)
get = 0
while get < total:  # 接收⽂件
data = sc.recv(total//2)
file += data
get = get + len(data)
sc.send(b'ok')
print('应该接收{},实际接收{}'.format(length, len(file)))
if file:
print('actually length:{}'.format(len(file)))
newfile.write(file[:])
newfile.close()
reply = sc.recv(1024)
if reply.decode() == "over":
breakmybatis延迟加载实现原理
server()
启动步骤
1.先启动server.py
2.再启动client.py
参考⽂章
到此这篇关于python使⽤socket⾼效传输视频数据帧(连续发送图⽚)的⽂章就介绍到这了,更多相关python socket传输视频数据帧内容请搜索以前的⽂章或继续浏览下⾯的相关⽂章希望⼤家以后多多⽀持!

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。