详解如何用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命令行参数sys.argv使用示例
Jan 28 Python
用Python登录Gmail并发送Gmail邮件的教程
Apr 17 Python
Python中用函数作为返回值和实现闭包的教程
Apr 27 Python
详解Python中的各种函数的使用
May 24 Python
python利用lxml读写xml格式的文件
Aug 10 Python
解决Python安装后pip不能用的问题
Jun 12 Python
pycharm 将python文件打包为exe格式的方法
Jan 16 Python
python pandas模块基础学习详解
Jul 03 Python
Flask中endpoint的理解(小结)
Dec 11 Python
python3.7.3版本和django2.2.3版本是否可以兼容
Sep 01 Python
python openssl模块安装及用法
Dec 06 Python
python 远程执行命令的详细代码
Feb 15 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
使用NetBeans + Xdebug调试PHP程序的方法
2011/04/12 PHP
php中单个数据库字段多列显示(单字段分页、横向输出)
2014/07/28 PHP
php中字符串和正则表达式详解
2014/10/23 PHP
PHP中调用C/C++制作的动态链接库的教程
2016/03/10 PHP
PHP的Yii框架中行为的定义与绑定方法讲解
2016/03/18 PHP
为Yahoo! UI Extensions Grid增加内置的可编辑器
2007/03/10 Javascript
优化javascript的执行速度
2010/01/23 Javascript
Node.js中使用计时器定时执行函数详解
2014/08/15 Javascript
js计算任意值之间随机数的方法
2015/01/16 Javascript
基于原生JS实现图片裁剪
2016/08/01 Javascript
轻松理解JavaScript闭包
2017/03/14 Javascript
微信小程序开发图片拖拽实例详解
2017/05/05 Javascript
深入理解AngularJs-scope的脏检查(一)
2017/06/19 Javascript
Bootstrap模态对话框中显示动态内容的方法
2018/08/10 Javascript
17道题让你彻底理解JS中的类型转换
2019/08/08 Javascript
async/await让异步操作同步执行的方法详解
2019/11/01 Javascript
Python代理抓取并验证使用多线程实现
2013/05/03 Python
在Linux系统上安装Python的Scrapy框架的教程
2015/06/11 Python
使用python读取txt文件的内容,并删除重复的行数方法
2018/04/18 Python
Python中如何导入类示例详解
2019/04/17 Python
python自动化UI工具发送QQ消息的实例
2019/08/27 Python
python单例模式原理与创建方法实例分析
2019/10/26 Python
matplotlib实现显示伪彩色图像及色度条
2019/12/07 Python
python GUI库图形界面开发之PyQt5信号与槽的高级使用技巧(自定义信号与槽)详解与实例
2020/03/06 Python
在Sublime Editor中配置Python环境的详细教程
2020/05/03 Python
python读取图像矩阵文件并转换为向量实例
2020/06/18 Python
pandas参数设置的实用小技巧
2020/08/23 Python
Python word文本自动化操作实现方法解析
2020/11/05 Python
Europcar葡萄牙:葡萄牙汽车和货车租赁
2017/10/13 全球购物
LACOSTE波兰官网:Polo衫、服装和鞋类
2020/09/29 全球购物
分公司经理岗位职责
2013/11/11 职场文书
出纳员岗位职责风险
2014/03/06 职场文书
学习雷锋主题班会
2015/08/14 职场文书
创业计划书之酒店
2019/08/30 职场文书
【海涛dota解说】海涛小满开黑4v5被破两路翻盘潮汐第一视角解说
2022/04/01 DOTA
《遗弃》开发商删推文要跑路?官方回应:还在开发
2022/04/03 其他游戏