上一篇中介绍了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的文件表示下载成功

python使用tcp实现一个简单的下载器的更多相关文章

  1. 用 python 实现一个多线程网页下载器

    今天上来分享一下昨天实现的一个多线程网页下载器. 这是一个有着真实需求的实现,我的用途是拿它来通过 HTTP 方式向服务器提交游戏数据.把它放上来也是想大家帮忙挑刺,找找 bug,让它工作得更好. k ...

  2. Python使用Redis实现一个简单作业调度系统

    Python使用Redis实现一个简单作业调度系统 概述 Redis作为内存数据库的一个典型代表,已经在非常多应用场景中被使用,这里仅就Redis的pub/sub功能来说说如何通过此功能来实现一个简单 ...

  3. 使用python做一个IRC在线下载器

    使用python做一个IRC在线下载器 1.开发流程 2.软件流程 3.开始 3.0 准备工作 3.1寻找API接口 3.2 文件模块 3.2.1 选择文件弹窗 3.2.2 提取文件名 3.2.2.1 ...

  4. 自己写的一个简单PHP采集器

    自己写的一个简单PHP采集器 <?php //**************************************************************** $url = &q ...

  5. python使用wxPython创建一个简单的文本编辑器。

    ubuntu下通过'sudo apt-get install python-wxtools'下载wxPython.load和save函数用于加载和保存文件内容,button通过Bind函数绑定这两个函 ...

  6. python (1)一个简单的爬虫: python 在windows下 创建文件夹并写入文件

    1.一个简单的爬虫:爬取豆瓣的热门电影的信息 写在前面:如何创建本来存在的文件夹并写入 t_path = "d:/py/inn" #本来不存在inn,先定义路径,然后如果不存在,则 ...

  7. 扩展Python模块系列(二)----一个简单的例子

    本节使用一个简单的例子引出Python C/C++ API的详细使用方法.针对的是CPython的解释器. 目标:创建一个Python内建模块test,提供一个功能函数distance, 计算空间中两 ...

  8. 老男孩python作业5-开发一个简单的python计算器

    开发一个简单的python计算器 实现加减乘除及拓号优先级解析 用户输入 1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568 ...

  9. Python之自定义封装一个简单的Log类

    参考:http://www.jb51.net/article/42626.htm 参考:http://blog.csdn.net/u011541946/article/details/70198676 ...

随机推荐

  1. Android开发技术周报176学习记录

    Android开发技术周报176学习记录 教程 当 OkHttp 遇上 Http 2.0 http://fucknmb.com/2018/04/16/%E5%BD%93OkHttp%E9%81%87% ...

  2. JDK设计模式之——责任链(Filter)

    责任链的设计模式可以参考Servlet的FilterChain.FilterChain中的每个Filter(过滤器)就像一个个的链条 web开发中 有时候需要对接口request和response进行 ...

  3. phtoshop cs6 下载安装及破解方法(另附Photoshop CC 2018破解版图文教程)

    前言: 前端虽然用PS不多,但有时需要用PS切图:UI给你PSD图,需要取色,查看字体颜色大小:测量元素宽高等 但有时想找一个“麻雀虽小,五脏俱全”又是破解版的PS,也不是那么容易的 注:ps完整版不 ...

  4. CSS3新增伪类--好用的:target

      问:如果让你实现下图,点击跳转后,让内容1增加一个背景颜色,你会怎么做呢? 可能很多小伙伴第一反应是用JS,给跳转绑定点击事件,然后用DOM获取到内容1,在给其添加css样式. 如果我跟你说用cs ...

  5. win 10 升级远程连接服务器 要求的函数不受支持

    首先展示错误信息: win10更新系统后,之前连接的服务器都连接不上了,应该用一下方法解决: 运行 gpedit.msc,打开本地组策略:计算机配置>管理模板>系统>凭据分配> ...

  6. vis.js没有中文文档,个人在项目中总结的一些中文配置

    ##vis.js var options = { nodes:{//节点配置 borderWidth: 1,//节点边框的宽度,单位为px borderWidthSelected: 2,节点被选中时边 ...

  7. js对象按某个字段排序

    var arr = [ {name:'zopp',age:0}, {name:'gpp',age:18}, {name:'yjj',age:8} ]; function compare(propert ...

  8. mysql 开发进阶篇系列 14 锁问题(避免死锁,死锁查看分析)

    一. 概述 通常来说,死锁都是应用设计问题,通过调整业务流程,数据库对象设计,事务大小,以及访问数据库的sql语句,绝大部分死锁都可以避免,下面介绍几种避免死锁的常用 方法. 1. 在应用中,如果不同 ...

  9. SQL语句方法语法总结(一)

    1.distinct:返回不重复.唯一的值. select distinct col_name from tbl_name --表中的col_name 列的值 如果有10条一样的,仅返回一条. 2.w ...

  10. PCA实现教程

    数据是机器学习模型的生命燃料.对于特定的问题,总有很多机器学习技术可供选择,但如果没有很多好的数据,问题将不能很好的解决.数据通常是大部分机器学习应用程序中性能提升背后的驱动因素. 有时,数据可能很复 ...