
🌈欢迎来到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]) 接收文件内容的字节数据。
 最后,将文件内容写入本地文件。
- 运行:
  
 运行结束:




















