python 通过 socket 发送文件的实例代码

作者:郭东东郭 时间:2022-10-07 17:32:48 

目录结构:

python 通过 socket 发送文件的实例代码

client:


#!/usr/bin/env python
# -*-coding:utf-8 -*-
import socket, struct, json
download_dir = r'D:\Python\python_learning\gd\code\part3\02网络编程\文件传输\client\download'
gd_client=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
gd_client.connect(('127.0.0.1',8123))

while True:


#1、发命令
 cmd=input('>>: ').strip() #get a.txt
 if not cmd:continue
 gd_client.send(cmd.encode('utf-8'))
 #2、以写的方式打开一个新文件,接收服务端发来的文件的内容写入客户的新文件
 #第一步:先收报头的长度
 obj=gd_client.recv(4)
 header_size=struct.unpack('i',obj)[0]
 # 第二步:再收报头
 header_bytes = gd_client.recv(header_size)
 # 第三步:从报头中解析出对真实数据的描述信息
 header_json = header_bytes.decode('utf-8')
 header_dic = json.loads(header_json)
 '''
 header_dic = {
   'filename': filename, # 1.txt
   'file_size': os.path.getsize(r'%s\%s' % (share_dir, filename)) # 路径/1.txt
 }  
 '''
 total_size = header_dic['file_size']
 file_name = header_dic['filename']
 # 第四步:接收真实的数据
 with open(r'%s\%s'%(download_dir, file_name),'wb') as f:
   recv_size = 0
   while recv_size < total_size:
     line = gd_client.recv(1024)
     f.write(line)
     recv_size += len(line)
     print('总大小:%s  已下载大小:%s' % (total_size, recv_size))
gd_client.close()

server:


#!/usr/bin/env python
# -*-coding:utf-8 -*-
import socket
import subprocess
import struct
import json
import os
share_dir = r'D:\Python\python_learning\gd\code\part3\02网络编程\文件传输\server\share'
gd_server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
gd_server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
gd_server.bind(('127.0.0.1', 8123)) # 0-65535: 0-1024给操作系统使用
gd_server.listen(5)
while True:
 conn, client_addr = gd_server.accept()
 while True: # 通信循环
   try:
     # 1、收命令
     res = conn.recv(8096) # b'get 1.txt'
     if not res: break # 适用于linux操作系统
     # 2、解析命令,提取相应命令参数
     cmds = res.decode('utf-8').split() # ['get','1.txt']
     filename = cmds[1]
     # 3、以读的方式打开文件,读取文件内容发送给客户端
     # 第一步:制作固定长度的报头
     header_dic = {
       'filename': filename, # 1.txt
       'file_size':os.path.getsize(r'%s\%s'%(share_dir, filename)) # 路径/1.txt
     }
     header_json = json.dumps(header_dic)
     header_bytes = header_json.encode('utf-8')
     # 第二步:先发送报头的长度
     conn.send(struct.pack('i',len(header_bytes)))
     # 第三步:再发报头
     conn.send(header_bytes)
     # 第四步:再发送真实的数据
     with open('%s/%s'%(share_dir, filename),'rb') as f:
       for line in f:
         conn.send(line)
   except ConnectionResetError: # 适用于windows操作系统
     break
 conn.close()
gd_server.close()

命令输入: get 1.txt ,然后即可将 server 端的 share文件内的 1.txt 文件 发送到 client 端的 download文件夹下

图片、视频、文字都可以发送,因为传送的是 二进制文件

原理是:server 端以读的形式打开文件,client端以写 的方式打开文件,然后client端把 一条一条的二进制写入文件后保存即可。

总结

以上所述是小编给大家介绍的python 通过 socket 发送文件的实例代码网站的支持!

来源:https://www.cnblogs.com/friday69/p/9474580.html

标签:python,socket,文件
0
投稿

猜你喜欢

  • 教你利用pygame模块制作跳跃小球小游戏

    2022-02-07 11:28:46
  • python 性能优化方法小结

    2022-08-04 21:13:43
  • Javascript基础教程之比较操作符

    2024-04-10 16:15:05
  • Golang空接口与类型断言的实现

    2024-04-27 15:39:21
  • 几个常用的js小函数

    2007-09-19 12:59:00
  • python使用pyqt写带界面工具的示例代码

    2023-09-29 05:15:22
  • 浅谈PYTHON 关于文件的操作

    2022-06-07 19:54:58
  • js实现三张图(文)片一起切换的banner焦点图

    2024-06-20 04:17:16
  • Laravel5中实现模糊匹配加多条件查询功能的方法

    2024-05-03 15:28:35
  • 解决python3读取Python2存储的pickle文件问题

    2023-03-18 14:20:30
  • asp和php下textarea提交大量数据发生丢失的解决方法

    2023-10-26 09:01:43
  • Django CBV类的用法详解

    2022-11-24 20:33:43
  • Golang Gin 中间件 Next()方法示例详解

    2024-02-20 07:29:22
  • 讲解数据库加密技术的功能特性与实现方法

    2008-12-18 14:24:00
  • Django实现静态文件缓存到云服务的操作方法

    2023-05-26 07:52:54
  • Python中Dataframe元素为不定长list时的拆分分组

    2023-11-08 04:16:30
  • jQuery打造动态下滑菜单

    2010-04-20 14:50:00
  • python 中关于pycharm选择运行环境的问题

    2021-09-01 21:56:10
  • Mac 安装和卸载 Mysql5.7.11 的方法

    2024-01-23 16:09:58
  • python实现SOM算法

    2023-05-27 03:18:42
  • asp之家 网络编程 m.aspxhome.com