python 使用socket传输图片视频等文件的实现方式
作者:smart_hang 发布时间:2022-11-12 11:55:37
标签:python,socket,传输
在开发一些需要网络通信的应用中,经常会用到各种网络协议进行通信,博主在开发实验室的机器人的时候就遇到了需要把机器人上采集到的图片传回服务器进行处理识别,在python下的实现方式如下(只贴出了关键代码)
服务器端
LOCAL_IP = '192.168.100.22' #本机在局域网中的地址,或者写127.0.0.1
PORT = 2567 #指定一个端口
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)) #绑定端口
sock.listen(3) #监听端口
while True:
sc,sc_name = sock.accept() #当有请求到指定端口是 accpte()会返回一个新的socket和对方主机的(ip,port)
print('收到{}请求'.format(sc_name))
infor = sc.recv(1024) #首先接收一段数据,这段数据包含文件的长度和文件的名字,使用|分隔,具体规则可以在客户端自己指定
length,file_name = infor.decode().split('|')
if length and file_name:
newfile = open('image/'+str(random.randint(1,10000))+'.jpg','wb') #这里可以使用从客户端解析出来的文件名
print('length {},filename {}'.format(length,file_name))
sc.send(b'ok') #表示收到文件长度和文件名
file = b''
total = int(length)
get = 0
while get < total: #接收文件
data = sc.recv(1024)
file += data
get = get + len(data)
print('应该接收{},实际接收{}'.format(length,len(file)))
if file:
print('acturally length:{}'.format(len(file)))
newfile.write(file[:])
newfile.close()
sc.send(b'copy') #告诉完整的收到文件了
sc.close()
客户端
address = ('192.168.100.22', 2567)
def send(photos):
for photo in photos[0]:
print('sending {}'.format(photo))
data = file_deal(photo)
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect(address)
sock.send('{}|{}'.format(len(data), file).encode()) #默认编码 utf-8,发送文件长度和文件名
reply = sock.recv(1024)
if 'ok' == reply.decode(): #确认一下服务器get到文件长度和文件名数据
go = 0
total = len(data)
while go < total: #发送文件
data_to_send = data[go:go + 1024]
sock.send(data_to_send)
go += len(data_to_send)
reply = sock.recv(1024)
if 'copy' == reply.decode():
print('{} send successfully'.format(photo))
sock.close() #由于tcp是以流的形式传输数据,我们无法判断开头和结尾,简单的方法是没传送一个文件,就使用一个socket,但是这样是消耗计算机的资源,博主正在探索更好的方法,有机会交流一下
def file_deal(file_path): #读取文件的方法
mes = b''
try:
file = open(file_path,'rb')
mes = file.read()
except:
print('error{}'.format(file_path))
else:
file.close()
return mes
总结
以上所述是小编给大家介绍的python 使用socket传输图片视频等文件的实现方式,网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!
来源:https://blog.csdn.net/hfutzhouyonghang/article/details/86624684


猜你喜欢
- Flask-Admin是一个功能齐全、简单易用的Flask扩展,让你可以为Flask应用程序增加管理界面。它受django-ad
- 当列表菜单项目特别多的时候,使用JavaScript手风琴菜单(Accordion Menus)是个不错的选择。手风琴折叠菜单利于组织菜单项
- 实现原理PS的扩散效果可以产生类似毛玻璃质感的效果,使画面有些毛毛的感觉。其实现可通过操作像素三通道数值的方式实现,定义一个随机数器,将图像
- 目录plsql141. 安装注册使用 1.激活了会提示激活成功plsql developer14是由Allround Automa
- 目录前言一、数组遍历方法1. forEach()2. map()3. for of4. filter()5. some()、every()6
- Select CONVERT(varchar(100), GETDATE(), 0): 05 16 2006 10:57AM Select
- 请问论坛的树状记录表是怎么展开的?如何做?论坛的这种展开技术一般采用两种方法实现,一种是采用递归的方法,优点是逻辑简单,编程简单,缺点是速度
- 首先这是VGG的结构图,VGG11则是红色框里的结构,共分五个block,如红框中的VGG11第一个block就是一个conv3-64卷积层
- 本文实例讲述了Python常见字典内建函数用法。分享给大家供大家参考,具体如下:1、len(mapping) &nbs
- [code]<script> var a=4.2343; alert(a.toFixed(3)); </script>
- 北京时间2020年12月1日,JetBrain公司推出了二十周年第三个稳定版的IntelliJ IDEA 2020.3 。距离上一个稳定版I
- 数据库和操作系统一样,是一个多用户使用的共享资源。当多个用户并发地存取数据 时,在数据库中就会产生多个事务同时存取同一数据的情况。若对并发操
- 年关将至,大家对疫情的关注度也愈发提升,本次使用PyQt5撰写100行代码写一个疫情信息快速查看工具。一.准备工作1.PyQt5PyQt 是
- 我为一大型网站做了一个论坛,也顺利通过了测试。由于是第一次做这方面的数据库,我不知道比其它网站上数据库差距有多大,是不是够优化。能推荐或介绍
- 本文实例主要实现Python中的文件复制操作,有两种方法,具体实现代码如下所示:#coding:utf-8 # 方法1:使用read()和w
- 问题的起源早些时候使用with实现了一版全局进程锁,希望实现以下效果:with CacheLock("test_lock"
- 看了大神统计voc数据集标签框后,针对自己标注数据集,灵活应用 ,感谢!看代码吧~import reimport osimport xml.
- python中xmltodict使用xml转换成OrderedDict代码 :import xmltodictfrom pprin
- asp+access用户登录代码,loginnew.asp网面包含了登录框及验证用户的代码an.mdb数据库名fd表名y_username用
- 前段时间我们部门的粉丝和布林同学都写过关于这个问题的文章。刚好阅读了关于这个问题的其他争论文章。所以顺便在这补充几点。首先说明这里讨论的是在