目录结构:
client:
#!/usr/bin/env python
# -*-coding:utf-8 -*-
import socket, struct, json
download_dir = r'D:Pythonpython_learninggdcodepart3 2网络编程文件传输clientdownload'
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:Pythonpython_learninggdcodepart3 2网络编程文件传输servershare'
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 发送文件的实例代码,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我们网站的支持!
本文标题: python 通过 socket 发送文件的实例代码
本文地址: http://www.cppcns.com/jiaoben/python/237219.html
本文来自 运维人生 ,作者:fly是个稻草人链接:http://www.ywadmin.com/?id=76误删除linux系统文件了?不用急,本文将给你一个恢复linux文件的方法,让你轻松应对运维中的各风险问题。方法总比问题多~说在前面的话针对日常维护操作,难免会出现文件误删除的操作。大家熟知linux文件系统不同win有回收...
原文来自SecIN社区—作者:WiHat0x00 什么是WebShell渗透测试工作的一个阶段性目标就是获取目标服务器的操作控制权限,于是WebShell便应运而生。Webshell中的WEB就是web服务,shell就是管理攻击者与操作系统之间的交互。Webshell被称为攻击者通过Web服务器端口对Web服务器有一定的操作权限,而...
断电时文件系统发生了什么?硬盘又发生了什么?下一次开机时写到一半的文件在系统层面还在吗?在底层还在吗?更进一步的, 文件系统如何保证事务性, 会不会存在某种极端情况导致例如最后几个bit还没写完, 文件系统却认为它成功了的情况?回答不限任何文件系统,谢谢!下面是「北极」的回复分享断电的一瞬间,很多事情是无法确定的:1. 你无法确定...
接到项目需求。需要搭建一个页面进行交互,慢慢来b (2).jpg使用python django框架进行页面的搭建在项目文件下打开窗口,输入命令;django-admin startproject helloword#在文件helloword/helloword/创建view.py在view.py文件中输入以代码from django....
常见的错误集合解决方案(一)No.1提示错误'Microsoft.VC90.CRT,version="9.0.21022.8"把Microsoft.NET Framework 3.5.1下面的全部勾选上。No.2解决Qt Designer设计的图标但是VS生成不显示问题描述:在Qt designer中为菜单栏和工具栏设计的图标,但是...