详解如何用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 相关文章推荐
在arcgis使用python脚本进行字段计算时是如何解决中文问题的
Oct 18 Python
Python中类型检查的详细介绍
Feb 13 Python
Python中函数eval和ast.literal_eval的区别详解
Aug 10 Python
windows下python之mysqldb模块安装方法
Sep 07 Python
python中使用正则表达式的连接符示例代码
Oct 10 Python
Python3中的列表,元组,字典,字符串相关知识小结
Nov 10 Python
python如何实现一个刷网页小程序
Nov 27 Python
django一对多模型以及如何在前端实现详解
Jul 24 Python
学Python 3的理由和必要性
Nov 19 Python
如何使用Python破解ZIP或RAR压缩文件密码
Jan 09 Python
tensorflow求导和梯度计算实例
Jan 23 Python
Python scrapy爬取小说代码案例详解
Jul 09 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
当海贼王变成JOJO风
2020/03/02 日漫
PHP中的生成XML文件的4种方法分享
2012/10/06 PHP
解析mysql中UNIX_TIMESTAMP()函数与php中time()函数的区别
2013/06/24 PHP
CI框架开发新浪微博登录接口源码完整版
2014/05/28 PHP
利用PHP fsockopen 模拟POST/GET传送数据的方法
2015/09/22 PHP
php大小写转换函数(strtolower、strtoupper)用法介绍
2017/11/17 PHP
PHP实现的分解质因数操作示例
2018/08/01 PHP
php让json_encode不自动转义斜杠“/”的方法
2020/04/27 PHP
jquery URL参数判断,确定菜单样式
2010/05/31 Javascript
jquery1.5.1中根据元素ID获取元素对象的代码
2011/04/02 Javascript
addEventListener()第三个参数useCapture (Boolean)详细解析
2013/11/07 Javascript
js处理自己不能定义二维数组的方法详解
2014/03/03 Javascript
JavaScript DOM节点添加示例
2014/07/16 Javascript
Javascript正则控制文本框只能输入整数或浮点数
2014/09/02 Javascript
Javascript优化技巧之短路表达式详细介绍
2015/03/27 Javascript
JS组件Bootstrap实现下拉菜单效果代码
2016/04/26 Javascript
AngularJS 入门教程之事件处理器详解
2016/08/19 Javascript
聊聊JavaScript如何实现继承及特点
2017/04/07 Javascript
vue.js 实现输入框动态添加功能
2018/06/25 Javascript
微信小程序登录session的使用
2019/03/17 Javascript
vue.js 打包时出现空白页和路径错误问题及解决方法
2019/06/26 Javascript
ES6 Iterator接口和for...of循环用法分析
2019/07/31 Javascript
[51:11]2014 DOTA2国际邀请赛中国区预选赛5.21 LGD-CDEC VS DT
2014/05/22 DOTA
windows下安装python paramiko模块的代码
2013/02/10 Python
Python实现的检测网站挂马程序
2014/11/30 Python
python实现几种归一化方法(Normalization Method)
2019/07/31 Python
python 画出使用分类器得到的决策边界
2019/08/21 Python
python对Excel按条件进行内容补充(推荐)
2019/11/24 Python
使用py-spy解决scrapy卡死的问题方法
2020/09/29 Python
英文求职信结束语大全
2013/10/26 职场文书
《再见了,亲人》教学反思
2014/02/26 职场文书
制冷与空调专业毕业生推荐信
2014/07/07 职场文书
2014年纳税评估工作总结
2014/12/23 职场文书
2015教师节师德演讲稿
2015/03/19 职场文书
中国式结婚:司仪主持词(范文)
2019/07/25 职场文书
MySQL官方导出工具mysqlpump的使用
2021/05/21 MySQL