经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » 树莓派 » 查看文章
树莓派采用socket方式文件传输(python)
来源:jb51  时间:2019/6/24 8:33:54  对本文有异议

两个树莓派,在同一个局域网内,传输文件,采用socket方式。

client端代码:

  1. import socket
  2. import os
  3. import hashlib
  4. client = socket.socket() # 生成socket,连接server
  5. ip_port =("192.168.137.210",12346) # server地址和端口号(最好是10000以后)
  6. client.connect(ip_port) # 连接
  7. print("服务器已连接")
  8. while True:
  9. content = input(">>")
  10. if len(content)==0: continue # 如果传入空字符会阻塞
  11. if content.startswith("get"):
  12. client.send(content.encode("utf-8")) # 传送和接收都是bytes类型
  13. # 1.先接收长度,建议8192
  14. server_response = client.recv(1024)
  15. file_size = int(server_response.decode("utf-8"))
  16. print("接收到的大小:",file_size)
  17.  
  18. # 2.接收文件内容
  19. client.send("准备好接收".encode("utf-8")) # 确认接收
  20. filename = "new" + content.split(" ")[1]
  21. f = open(filename, "wb")
  22. received_size = 0
  23. m = hashlib.md5()
  24. while received_size < file_size:
  25. size = 0 # 准确接收数据大小,解决粘包
  26. if file_size - received_size >1024: # 多次接收
  27. size = 1024
  28. else: # 最后一次接收完毕
  29. size = file_size - received_size
  30. data = client.recv(size) # 多次接收内容,接收大数据
  31. data_len = len(data)
  32. received_size += data_len
  33. print("已接收:", int(received_size/file_size*100), "%"
  34. m.update(data)
  35. f.write(data)
  36. f.close()
  37. print("实际接收的大小:", received_size) # 解码
  38.  
  39. # 3.md5值校验
  40. md5_sever = client.recv(1024).decode("utf-8")
  41. md5_client = m.hexdigest()
  42. print("服务器发来的md5:",md5_sever)
  43. print("接收文件的md5:",md5_client)
  44. if md5_sever == md5_client:
  45. print("MD5值校验成功")
  46. else:
  47. print("MD5值校验失败")
  48. client.close()

这一个代码是用来的到文件的:get filename

需要说明的是:得到的文件是存在于client.py的同一目录。

下面是server端:

  1. import socket
  2. import os
  3. import hashlib
  4.  
  5. server = socket.socket()
  6. server.bind(("192.168.137.96", 12346)) # 地址与端口
  7. server.listen(5)
  8. print("等待连接..")
  9. while True:
  10. conn, addr =server.accept() # 等待连接
  11. print("conn:", conn, "\naddr:", addr) # conn连接实例
  12. while True:
  13. data =conn.recv(1024) # 接收
  14. if not data: # 客户端已断开
  15. print("客户端断开连接")
  16. break
  17. print("收到的命令:", data.decode("utf-8"))
  18. cmd, filename = data.decode("utf-8").split(" ")
  19. if cmd=="get":
  20. if os.path.isfile(filename): # 判断文件存在
  21. size = os.stat(filename).st_size
  22. #获取文件大小
  23. conn.send(str(size).encode("utf-8")) # 发送数据长度
  24. print("发送的大小:", size)
  25. conn.recv(1024) # 接收确认
  26. m = hashlib.md5()
  27. f = open(filename, "rbname")
  28. for line in f:
  29. conn.send(line) # 发送数据
  30. m.update(line)
  31. f.close()
  32. md5 = m.hexdigest()
  33. conn.send(md5.encode("utf-8"))
  34. print("md5:", md5)
  35. server.close()

文件的传输是单向的,也就是说,只有client端才能在server端中获取文件,但是,获取的文件也只能是与server同一个目录下。

运行命令:

  1. python client.py
  2. python server.py

看个人习惯,也可以直接打开.py文件

最终效果图:

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持w3xue。

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号