python socket传文件_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 发送文件的实例代码,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持! ad51e517755f8fd6a7ec83ced4ecfaf3.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值