python使用tcp实现一个简单的下载器
2024-09-01 14:17:31
上一篇中介绍了tcp的流程,本篇通过写一个简单的文件下载器程序来巩固之前学的知识。
文件下载器的流程如下:
客户端:
- 输入目标服务器的ip和port
- 输入要下载文件的名称
- 从服务器下载文件保存到本地
服务器端 :
- 接收客户端要下载的文件名称
- 从本地的文件中找到该文件
- 将文件的内容传输给客户端
文件下载客户端
示例代码如下:
import socket
def main():
# 创建套接字
tcp_socket_client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 链接的服务器信息
server_ip = input("请输入服务器ip:")
server_port = int(input("请输入服务器port:"))
# 连接服务器
tcp_socket_client.connect((server_ip, server_port))
# 输入下载的文件名称
file_name = input("请输入要下载的文件名:")
# 向服务器发送文件名
tcp_socket_client.send(file_name.encode("utf-8"))
# 接收服务器的文件内容
# 最大大小为1K
recv_data = tcp_socket_client.recv(1024)
# 写入接收到的数据
# 接收到数据时才写入数据
if recv_data:
with open("[new]" + file_name, 'wb') as f:
f.write(recv_data)
tcp_socket_client.close()
if __name__ == '__main__':
main()
文件下载服务器端
示例代码如下:
import socket
def read_file_content(file_name):
"""读取文件内容"""
try:
with open(file_name, "rb") as f:
content = f.read()
return content
except:
print("要下载的文件不存在:%s" % file_name)
def main():
# 创建套接字
tcp_socket_server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 绑定端口
local_addr = ("", 8900)
tcp_socket_server.bind(local_addr)
# 将主动套接字改为被动套接字
tcp_socket_server.listen(128)
while True:
client_socket, client_addr = tcp_socket_server.accept()
print("新的客户端链接了:%s" % str(client_addr))
# 接收数据
recv_data = client_socket.recv(1024)
file_name = recv_data.decode("utf-8")
print("客户端请求下载的文件是:%s" % file_name)
file_content = read_file_content(file_name)
if file_content:
client_socket.send(file_content)
# 关闭客户端套接字
client_socket.close()
# 关闭
tcp_socket_server.close()
if __name__ == '__main__':
main()
操作流程
启动服务器端
$ python3 downloader-server.py
启动客户端,并输入服务器端的信息已经要下载的文件
$ ptrhon3 downloader-client.py
请输入服务器ip:192.168.92.130
请输入服务器port:8900
请输入要下载的文件名:test.txt
客户端在当前目录下有一个
[new]test.txt
的文件表示下载成功
最新文章
- HDFS shell
- YCSB-压测
- boxsizing属性 IE盒模型和标准盒模型
- SQL sever 学习,2016,5,31,(重点:100行以后,字符串操作。)
- 大话设计模式C++版——装饰模式
- 课堂笔记--Strom并发模型
- Chrome的Crash Report服务
- 依赖管理工具漫谈--从Maven,Gradle到Go
- poj3384Feng Shui(半平面交)
- DI 之 3.4 Bean的作用域(捌)
- 下载word文档
- XE7 - 升级及初步使用
- 在EC2上安装MEAN环境
- SegmentReader 批量 dump
- 五个项目管理学习笔记.沟通技巧II
- maven使用jstl表达式和The absolute uri: http://java.sun.com/jsp/jstl/core cannot be resolved in either web.xml or the jar files deployed with this application解决
- Redis 如何分析慢查询操作?
- Django(十五)Form组件
- Shell编程(六)awk工具
- leetcode139
热门文章
- Java虚拟机:内存分配策略
- 「HNOI2016」数据结构大毒瘤
- Day1:html和css
- Error running 'Unnamed': Address localhost:1099 is already in use
- feh: linux终端下看图片的好工具
- 一文总结 Linux 虚拟网络设备 eth, tap/tun, veth-pair
- java基础-3
- NuGet 构建服务器与常用命令
- 设置build.gradle打包时自动加时间
- MySQL联合索引VS单列索引