详解如何用python实现一个简单下载器的服务端和客户端


Posted in Python onOctober 28, 2019

话不多说,先看代码:

客户端:

import socket
def main():
  #creat:
  download_client=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
  #link:
  serv_ip=input("please input server IP")
  serv_port=int(input(("please input server port")))
  serv_addr=(serv_ip,serv_port)
  download_client.connect(serv_addr)
  #send and receive
  filename=input("please input filename")
  download_client.send(filename.encode("utf-8"))
  download_data=download_client.recv(1024)
  if download_data:
    with open("receive_"+filename,"wb") as f:
      f.write(download_data)
  download_client.close()
if __name__ == '__main__':
  main()

服务器:

import socket
def send_data(server_socket):
  while True:
    filename = server_socket.recv(1024).decode("utf-8")
    print("用户请求下载对象是%s"%filename)
    if filename:
      with open(filename, "rb") as f:
        file_data = f.read()
        server_socket.send(file_data)
    else:
      server_socket.close()
      break
def main():
  #creat
  server=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
  #bind
  server.bind(("",4399))
  #listen
  server.listen(128)
  #accept
  while True:
    print("waiting for quest")
    server_socket,client_ip=server.accept()
    print("connected")
    send_data(server_socket)
  #close
  server.close()
if __name__ == '__main__':
  main()

前几天有写一个基于UDP的简单程序,今天学习了TCP,TCP与UDP 的区别与联系其实已经写得很清楚了,这里不再多说。今天使用的TCP,在文件下载方面应用更加广泛(可靠)。客户端分析:

1.注意到TCP协议是面向连接的,也就是每一个TCP,从客户端发送请求,需要与服务器建立一个连接(UDP不用)。所以这一点体现在程序中就有了一个connect动作

2.目前程序recv方法仅支持1kb,收发大文件会出错,这点在我之后搞清楚大文件下载再说

服务器分析:

1.服务器是需要绑定的,也就是需要把他的地址定下来,这样客户端才会知道每次要和谁建立链接。

2.socket之listen,之前的网络链接我们都是主动的去连接别人,如connect(),服务器是不需要连接别人的,所以他是一个被动连接,等着别人来连接他。listen就是拿来转换的。后面的参数是参数指定队列中最多可容纳的等待接受的传入连接数。若要确定可指定的最大连接数,要参照 MaxConnections 值。也就是等着连接的最大数。

3.accept()返回参数是一个元组,前面我们就用两个变量对他进行拆包了,第一个是一个socket对象,第二个是连接本服务器的地址。对于这个新的socket对象可以理解为服务器主socket接到连接后派遣了一个专员socket来对这个客户端进行服务。

4.一个服务器可以被多个客户端连接,每个客户端都会被分配一个专员进行服务。

总结:

客户端流程:创建套接字(可绑定)—连接服务器—收发—关闭
服务器流程:创建套接字—绑定—监听连接—接收连接—收发—关闭

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python实现的石头剪子布代码分享
Aug 22 Python
Python运算符重载用法实例
May 28 Python
详解Django中的ifequal和ifnotequal标签使用
Jul 16 Python
python实现字典(dict)和字符串(string)的相互转换方法
Mar 01 Python
利用python的socket发送http(s)请求方法示例
May 07 Python
对Python之gzip文件读写的方法详解
Feb 08 Python
用Q-learning算法实现自动走迷宫机器人的方法示例
Jun 03 Python
Python批量生成幻影坦克图片实例代码
Jun 04 Python
Python 自动登录淘宝并保存登录信息的方法
Sep 04 Python
python3 常见解密加密算法实例分析【base64、MD5等】
Dec 19 Python
python 正则表达式参数替换实例详解
Jan 17 Python
python 还原梯度下降算法实现一维线性回归
Oct 22 Python
SELENIUM自动化模拟键盘快捷键操作实现解析
Oct 28 #Python
如何在VSCode上轻松舒适的配置Python的方法步骤
Oct 28 #Python
python实现通过队列完成进程间的多任务功能示例
Oct 28 #Python
PYTHON如何读取和写入EXCEL里面的数据
Oct 28 #Python
python 协程中的迭代器,生成器原理及应用实例详解
Oct 28 #Python
在Python中画图(基于Jupyter notebook的魔法函数)
Oct 28 #Python
python生成器/yield协程/gevent写简单的图片下载器功能示例
Oct 28 #Python
You might like
discuz Passport 通行证 整合笔记
2008/06/30 PHP
PHP设计模式之责任链模式的深入解析
2013/06/13 PHP
php提交表单发送邮件的方法
2015/03/20 PHP
PHP使用PHPExcel删除Excel单元格指定列的方法
2016/07/06 PHP
javascript之通用简单的table选项卡实现(二)
2010/05/09 Javascript
JQuery入门——事件切换之hover()方法应用介绍
2013/02/05 Javascript
jQuery提交多个表单的小技巧
2014/07/27 Javascript
node.js开机自启动脚本文件
2014/12/24 Javascript
谷歌浏览器调试JavaScript小技巧
2014/12/29 Javascript
JavaScript 基本概念
2015/01/20 Javascript
node网页分段渲染详解
2016/09/05 Javascript
ionic进入多级目录后隐藏底部导航栏(tabs)的完美解决方案
2016/11/23 Javascript
详解用node编写自己的cli工具
2017/05/23 Javascript
JS解决IOS中拍照图片预览旋转90度BUG的问题
2017/09/13 Javascript
Vue Echarts实现可视化世界地图代码实例
2019/05/07 Javascript
vue+axios 拦截器实现统一token的案例
2020/09/11 Javascript
如何在JavaScript中使用localStorage详情
2021/02/04 Javascript
[02:07]TI9显影之尘系列 - Vici Gaming
2019/08/20 DOTA
Python原始字符串与Unicode字符串操作符用法实例分析
2017/07/22 Python
python实现堆和索引堆的代码示例
2018/03/19 Python
python scipy求解非线性方程的方法(fsolve/root)
2018/11/12 Python
Python一键查找iOS项目中未使用的图片、音频、视频资源
2019/08/12 Python
Django对models里的objects的使用详解
2019/08/17 Python
Python操作Sonqube API获取检测结果并打印过程解析
2019/11/27 Python
Python中six模块基础用法
2019/12/08 Python
Pycharm最常用的快捷键及使用技巧
2020/03/05 Python
Python语法垃圾回收机制原理解析
2020/03/25 Python
pandas.DataFrame.drop_duplicates 用法介绍
2020/07/06 Python
css3气泡 css3关键帧动画创建的动态通知气泡
2013/02/26 HTML / CSS
Vans澳大利亚官网:购买鞋子、服装及配件
2019/09/05 全球购物
酒店出纳岗位职责
2013/12/29 职场文书
小学优秀教师材料
2014/12/15 职场文书
教师个人事迹材料
2014/12/17 职场文书
Python实现滑雪小游戏
2021/09/25 Python
python区块链实现简版工作量证明
2022/05/25 Python
Java 中的 Lambda List 转 Map 的多种方法详解
2022/07/07 Java/Android