详解如何用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 相关文章推荐
tornado框架blog模块分析与使用
Nov 21 Python
Python socket.error: [Errno 98] Address already in use的原因和解决方法
Aug 25 Python
python获取list下标及其值的简单方法
Sep 12 Python
利用python写个下载teahour音频的小脚本
May 08 Python
Python OpenCV 直方图的计算与显示的方法示例
Feb 08 Python
Django 使用Ajax进行前后台交互的示例讲解
May 28 Python
python通过tcp发送xml报文的方法
Dec 28 Python
Python常用爬虫代码总结方便查询
Feb 25 Python
Python利用字典破解WIFI密码的方法
Feb 27 Python
Python Selenium 之数据驱动测试的实现
Aug 01 Python
Django 项目通过加载不同env文件来区分不同环境
Feb 17 Python
python标准库OS模块详解
Mar 10 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
用PHP和ACCESS写聊天室(九)
2006/10/09 PHP
apache2.2.4+mysql5.0.77+php5.2.8安装精简
2009/04/29 PHP
PhpMyAdmin出现export.php Missing parameter: what /export_type错误解决方法
2012/08/09 PHP
thinkphp中空模板与空模块的用法实例
2014/11/26 PHP
学习php设计模式 php实现装饰器模式(decorator)
2015/12/07 PHP
JavaScript性能优化 创建文档碎片(document.createDocumentFragment)
2010/07/13 Javascript
关于JavaScript的面向对象和继承有利新手学习
2013/01/11 Javascript
js实现按Ctrl+Enter发送效果
2014/09/18 Javascript
ajax如何实现页面局部跳转与结果返回
2015/08/24 Javascript
Json解析的方法小结
2016/06/22 Javascript
bootstrap侧边栏圆点导航
2017/01/11 Javascript
vue使用监听实现全选反选功能
2018/07/06 Javascript
Vue组件的使用及个人理解与介绍
2019/02/09 Javascript
关于vue-cli3打包代码后白屏的解决方案
2020/09/02 Javascript
十条建议帮你提高Python编程效率
2016/02/16 Python
Python3 加密(hashlib和hmac)模块的实现
2017/11/23 Python
Matplotlib 生成不同大小的subplots实例
2018/05/25 Python
python SQLAlchemy的Mapping与Declarative详解
2019/07/04 Python
浅析Python 引号、注释、字符串
2019/07/25 Python
Python+numpy实现矩阵的行列扩展方式
2019/11/29 Python
Django中文件上传和文件访问微项目的方法
2020/04/27 Python
Django中Aggregation聚合的基本使用方法
2020/07/09 Python
HTML5中FileReader接口使用方法实例详解
2017/08/26 HTML / CSS
物流仓管员工作职责
2014/01/06 职场文书
建筑经济管理专业求职信分享
2014/01/06 职场文书
2014新课程改革心得体会
2014/03/10 职场文书
项目建议书范文
2014/05/12 职场文书
反对邪教标语
2014/06/30 职场文书
实习生辞职信范文
2015/03/02 职场文书
2015年挂职干部工作总结
2015/05/14 职场文书
结婚幸福感言
2015/08/01 职场文书
幼儿园托班教育随笔
2015/08/14 职场文书
2016党员干部廉洁自律心得体会
2016/01/13 职场文书
读《工匠精神》有感:热爱工作,精益求精
2019/12/28 职场文书
go语言求任意类型切片的长度操作
2021/04/26 Golang
Node.js实现断点续传
2021/06/23 Javascript