上一篇中介绍了tcp的流程,本篇通过写一个简单的文件下载器程序来巩固之前学的知识。

文件下载器的流程如下:

客户端:

  1. 输入目标服务器的ip和port
  2. 输入要下载文件的名称
  3. 从服务器下载文件保存到本地

服务器端 :

  1. 接收客户端要下载的文件名称
  2. 从本地的文件中找到该文件
  3. 将文件的内容传输给客户端

文件下载客户端

示例代码如下:

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()

操作流程

  1. 启动服务器端

    $ python3 downloader-server.py
  2. 启动客户端,并输入服务器端的信息已经要下载的文件

    $ ptrhon3 downloader-client.py
    请输入服务器ip:192.168.92.130
    请输入服务器port:8900
    请输入要下载的文件名:test.txt
  3. 客户端在当前目录下有一个[new]test.txt的文件表示下载成功

最新文章

  1. HDFS shell
  2. YCSB-压测
  3. boxsizing属性 IE盒模型和标准盒模型
  4. SQL sever 学习,2016,5,31,(重点:100行以后,字符串操作。)
  5. 大话设计模式C++版——装饰模式
  6. 课堂笔记--Strom并发模型
  7. Chrome的Crash Report服务
  8. 依赖管理工具漫谈--从Maven,Gradle到Go
  9. poj3384Feng Shui(半平面交)
  10. DI 之 3.4 Bean的作用域(捌)
  11. 下载word文档
  12. XE7 - 升级及初步使用
  13. 在EC2上安装MEAN环境
  14. SegmentReader 批量 dump
  15. 五个项目管理学习笔记.沟通技巧II
  16. 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解决
  17. Redis 如何分析慢查询操作?
  18. Django(十五)Form组件
  19. Shell编程(六)awk工具
  20. leetcode139

热门文章

  1. Java虚拟机:内存分配策略
  2. 「HNOI2016」数据结构大毒瘤
  3. Day1:html和css
  4. Error running 'Unnamed': Address localhost:1099 is already in use
  5. feh: linux终端下看图片的好工具
  6. 一文总结 Linux 虚拟网络设备 eth, tap/tun, veth-pair
  7. java基础-3
  8. NuGet 构建服务器与常用命令
  9. 设置build.gradle打包时自动加时间
  10. MySQL联合索引VS单列索引