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