【Python基础】文件传输协议

0

🌈欢迎来到Python专栏
🙋🏾‍♀️作者介绍:前PLA队员 目前是一名普通本科大三的软件工程专业学生
🌏IP坐标:湖北武汉
🍉 目前技术栈:C/C++、Linux系统编程、计算机网络、数据结构、Mysql、Python(目前在学)
🍇 博客介绍:通过分享学习过程,加深知识点的掌握,也希望通过平台能认识更多同僚,如果觉得文章有帮助,请您动动发财手点点赞,本人水平有限,有不足之处欢迎大家扶正~
🍓 最后送大家一句话共勉:知不足而奋进,望远山而前行。愿大家都能早日进大厂实现财富自由~
————————————————

1.服务器端

#!/usr/bin/python
# author X_Dragon
# E-mail:3270895551@qq.com
# @Time : 2023/11/14 11:21

from socket import *
import struct

def tcp_init():
    s = socket(AF_INET, SOCK_STREAM)
    addr = ('', 2000)
    s.bind(addr)
    s.listen(128)
    return s

def send_file():
    file_name='第5章_UDP与TCP通信.doc'
    s=tcp_init()
    new_client,client_addr=s.accept()
    # 先发文件名
    file_name_bytes=file_name.encode('utf8')
    train_head_bytes=struct.pack('I',len(file_name_bytes))
    new_client.send(train_head_bytes+file_name_bytes)
    # 再发文件内容
    f=open(file_name,'rb')
    file_content=f.read()
    train_head_bytes = struct.pack('I', len(file_content))
    new_client.send(train_head_bytes+file_content)
    f.close()
    new_client.close()
    s.close()



if __name__ == '__main__':
    send_file()

tcp_init 函数用于初始化TCP服务器,绑定地址和端口,并开始监听。
send_file 函数首先等待客户端的连接,然后发送文件名和文件内容。
文件名首先转为字节并计算其长度,然后使用 struct.pack 将长度打包为4字节的二进制数据,发送给客户端。
接着将文件名字节和文件内容打包为二进制数据,同样使用 struct.pack 计算长度并发送给客户端。
要正确运行这个代码,需要有一个相应的客户端代码来接收和处理发送的文件。客户端代码应该能够解析服务器发送的二进制数据,还原文件名和文件内容。

2.客户端

#!/usr/bin/python
# author X_Dragon
# E-mail:3270895551@qq.com
# @Time : 2023/11/14 11:22
from socket import *
import select
import sys
import time
import struct
tcp_client_socket = socket(AF_INET, SOCK_STREAM)

# 本地IP地址和端口
address = ('10.12.145.90', 2000)

# 连接服务器
tcp_client_socket.connect(address)

#每次要先读4个字节的火车头
train_head_bytes=tcp_client_socket.recv(4)
train_content_len=struct.unpack('I',train_head_bytes)
file_name=tcp_client_socket.recv(train_content_len[0])  #接到文件名
f=open(file_name.decode('utf8'),'wb')

#接文件内容的长度
train_head_bytes=tcp_client_socket.recv(4)
train_content_len=struct.unpack('I',train_head_bytes)
file_content=tcp_client_socket.recv(train_content_len[0]) #接文件内容
f.write(file_content)
f.close()
tcp_client_socket.close()

首先,客户端连接到服务器的指定地址和端口。
然后,通过 tcp_client_socket.recv(4) 接收文件名的长度。
使用 struct.unpack(‘I’, train_head_bytes) 解包得到文件名的长度,并通过 tcp_client_socket.recv(train_content_len[0]) 接收文件名的字节数据。
文件名通过 file_name.decode(‘utf8’) 转换为字符串。
再次接收4个字节的火车头,解包得到文件内容的长度,再通过 tcp_client_socket.recv(train_content_len[0]) 接收文件内容的字节数据。
最后,将文件内容写入本地文件。

  • 运行:
    0
    运行结束:

00

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值