Python基于Socket TCP协议实现小文件下载功能详解
本文详细介绍如何利用Python的socket模块结合TCP协议实现小文件下载功能。通过构建服务器端监听与客户端请求逻辑,演示了从创建套接字、绑定端口、建立连接到数据传输的完整流程,包含服务器与客户端的核心代码及运行结果分析,帮助开发者快速掌握基于Socket的文件传输基础实现。
服务器端Socket TCP实现逻辑
服务器端代码首先导入socket模块并创建套接字对象,指定使用IPv4和TCP流式协议。接着将服务器绑定到本地回环地址127.0.0.1的7890端口,并设置监听队列长度为4,进入被动监听状态。在无限循环中,服务器调用accept方法等待客户端连接,一旦有客户端成功接入,便打印连接者的IP地址信息。随后进入内部循环,持续接收客户端发送的数据。通过try-except结构处理可能的异常,防止因客户端强制断开导致服务器崩溃。接收到的数据以UTF-8解码后判断是否为空,若存在数据则打印用户请求下载的文件名。服务器尝试以二进制只读模式打开该文件,读取全部内容后通过send方法将文件内容发送给客户端,并关闭文件句柄,打印下载成功提示。若文件未找到则捕获异常,向客户端发送'Non'编码字符串表示失败,并打印未找到文件信息。若接收数据为空,说明用户正常退出,跳出内层循环;若发生其他异常,则打印用户退出连接并跳出。最后关闭与新客户端的通信套接字,外层循环结束后关闭服务器主套接字。
import socket
# 1.创建套接字
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 2.绑定端口
server.bind(('127.0.0.1', 7890))
# 3.变为被动监听模式
server.listen(4)
while True:
# 4.等待客户端链接
s_new, addr = server.accept()
print('用户【{}】已经成功连接!!'.format(addr[0]))
while True:
# 5.接受消息
try:
# 若客户端强行断开连接服务器不会崩溃
recv_data = s_new.recv(1024).decode('utf-8')
if recv_data:
print('来自【{}】的用户表示要下载: 【{}】'.format(addr[0], recv_data))
# 6.发送消息
try:
f = open(recv_data, 'rb')
content = f.read()
send_data = s_new.send(content)
f.close()
print('下载成功!')
except Exception as result:
send_data = s_new.send('Non'.encode('utf-8'))
print('未找到要下载的文件')
else:
print('用户已经正常退出!')
break
except Exception as res:
print('用户已经退出连接!')
break
s_new.close()
# 7,关闭套接字
server.close()
客户端Socket TCP请求与接收逻辑
客户端代码同样导入socket模块,创建TCP套接字后,使用connect方法主动连接至服务器地址127.0.0.1的7890端口。程序进入无限循环,通过input函数提示用户输入想要下载的文件名。若用户输入'exit',则打印退出信息并跳出循环。否则,将输入的文件名编码为UTF-8并通过send方法发送给服务器。随后调用recv方法接收服务器返回的数据,缓冲区大小为2048字节。若接收到的数据编码后等于'Non',则打印未找到文件提示;否则,以二进制写入模式打开名为'【new】'+原文件名的新文件,将接收到的数据写入该文件,打印下载成功信息并关闭文件句柄。循环结束后,关闭客户端套接字。
import socket
# 创建套接字
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 绑定IP地址
s.connect(('127.0.0.1', 7890))
while True:
# 发送数据
send_data = str(input('请输入想要下载的文件名:'))
if send_data == 'exit':
print('已退出下载!')
break
s.send(send_data.encode('utf-8'))
# 接收数据
recv_data = s.recv(2048)
if recv_data == 'Non'.encode('utf-8'):
print('未找到要下载的文件!')
else:
with open('【new】' + send_data, 'wb') as f:
f.write(recv_data)
print('[{}]下载成功!'.format(send_data))
f.close()
# 关闭套接字
s.close()
运行结果与文件验证
服务器端运行时的控制台输出显示用户连接成功及文件下载请求的处理过程。

客户端端运行时的控制台输出显示用户输入文件名、接收数据及下载结果的交互过程。

文件下载完成后,客户端本地生成的新文件内容应与原文件一致,验证传输的正确性。

至此,关于Python使用socket_TCP实现小文件下载功能的介绍已完成。如需了解更多Python小文件下载相关内容,建议搜索本站历史文章或继续浏览后续相关文章,感谢大家的支持。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













