详解如何用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 相关文章推荐
使用IPython来操作Docker容器的入门指引
Apr 08 Python
python复制文件的方法实例详解
May 22 Python
Python 将pdf转成图片的方法
Apr 23 Python
opencv python 基于KNN的手写体识别的实例
Aug 03 Python
django主动抛出403异常的方法详解
Jan 04 Python
python选取特定列 pandas iloc,loc,icol的使用详解(列切片及行切片)
Aug 06 Python
python PIL和CV对 图片的读取,显示,裁剪,保存实现方法
Aug 07 Python
Python数据可视化:幂律分布实例详解
Dec 07 Python
pandas使用之宽表变窄表的实现
Apr 12 Python
Python configparser模块常用方法解析
May 22 Python
Python如何实现的二分查找算法
May 27 Python
python Cartopy的基础使用详解
Nov 01 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程序的方法
2015/06/13 PHP
PHP 在数组中搜索给定的简单实例 array_search 函数
2016/06/13 PHP
PHP处理二进制数据的实现方法
2016/06/13 PHP
PHP中strtr与str_replace函数运行性能简单测试示例
2019/06/22 PHP
学习并汇集javascript匿名函数
2010/11/25 Javascript
web的各种前端打印方法之jquery打印插件PrintArea实现网页打印
2013/01/09 Javascript
javascript贪吃蛇完整版(源码)
2013/12/09 Javascript
再谈javascript原型继承
2014/11/10 Javascript
浅谈javascript回调函数
2014/12/07 Javascript
javascript中Date对象的getDay方法使用指南
2014/12/22 Javascript
jQuery.Highcharts.js绘制柱状图饼状图曲线图
2015/03/14 Javascript
JS面向对象(3)之Object类,静态属性,闭包,私有属性, call和apply的使用,继承的三种实现方法
2016/02/25 Javascript
js一维数组、多维数组和对象的混合使用方法
2016/04/03 Javascript
深入理解Ajax的get和post请求
2016/06/02 Javascript
AngularJS监听路由变化的方法
2017/03/07 Javascript
微信小程序 合法域名校验出错详解及解决办法
2017/03/09 Javascript
详解Vue 方法与事件处理器
2017/06/20 Javascript
bootstrap精简教程_动力节点Java学院整理
2017/07/14 Javascript
Angular搜索 过滤 批量删除 添加 表单验证功能集锦(实例代码)
2017/10/25 Javascript
Bootstrap modal只加载一次数据的解决办法(推荐)
2017/11/24 Javascript
Vue核心概念Getter的使用方法
2019/01/18 Javascript
在Python中操作日期和时间之gmtime()方法的使用
2015/05/22 Python
Python制作词云的方法
2018/01/03 Python
PyCharm配置mongo插件的方法
2018/11/30 Python
Python设计模式之观察者模式原理与用法详解
2019/01/16 Python
解决pycharm的Python console不能调试当前程序的问题
2019/01/20 Python
Python hashlib模块加密过程解析
2019/11/05 Python
浅析Python迭代器的高级用法
2020/07/16 Python
解决TensorFlow训练模型及保存数量限制的问题
2021/03/03 Python
HTML5中Canvas与SVG的画图原理比较
2013/01/16 HTML / CSS
意大利网上购书网站:Libraccio.it
2021/02/03 全球购物
经典c++面试题六
2012/01/18 面试题
婚礼主持词开场白
2014/03/13 职场文书
2015年党员自我剖析材料
2014/12/17 职场文书
小学教师党员承诺书
2015/04/27 职场文书
赤壁观后感(2)
2015/06/15 职场文书