详解如何用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 encode和decode的妙用
Sep 02 Python
Python实现国外赌场热门游戏Craps(双骰子)
Mar 31 Python
对python中的for循环和range内置函数详解
Apr 17 Python
Python Pandas批量读取csv文件到dataframe的方法
Oct 08 Python
python将pandas datarame保存为txt文件的实例
Feb 12 Python
使用Python实现文字转语音并生成wav文件的例子
Aug 08 Python
解决Python对齐文本字符串问题
Aug 28 Python
python统计指定目录内文件的代码行数
Sep 19 Python
python内置模块collections知识点总结
Dec 19 Python
通过实例解析Python return运行原理
Mar 04 Python
借助Paramiko通过Python实现linux远程登陆及sftp的操作
Mar 16 Python
python实现简易自习室座位预约系统
Jun 30 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 xml文件操作实现代码(二)
2009/03/20 PHP
php获取文件名称和扩展名的方法
2017/02/07 PHP
PHP使用Http Post请求发送Json对象数据代码解析
2020/07/16 PHP
ExtJs3.0中Store添加 baseParams 的Bug
2010/03/10 Javascript
javascrip关于继承的小例子
2013/05/10 Javascript
详解JavaScript UTC时间转换方法
2016/01/07 Javascript
jsp 网站引入外部css或者js失效问题解决
2016/10/31 Javascript
JavaScript解析JSON格式数据的方法示例
2017/01/24 Javascript
jQuery实现Table表格隔行变色及高亮显示当前选择行效果示例
2017/02/14 Javascript
基于JS实现bookstore静态页面的实例代码
2017/02/22 Javascript
详解Vue 方法与事件处理器
2017/06/20 Javascript
浅谈 Vue 项目优化的方法
2017/12/16 Javascript
详解ES6 Symbol 的用途
2018/10/14 Javascript
JavaScript判断浏览器版本的方法
2019/11/03 Javascript
JavaScript this指向相关原理及实例解析
2020/07/10 Javascript
解决Can't find variable: SockJS vue项目的问题
2020/09/22 Javascript
python开发之文件操作用法实例
2015/11/13 Python
Python算法应用实战之栈详解
2017/02/04 Python
基于使用paramiko执行远程linux主机命令(详解)
2017/10/16 Python
利用Python进行异常值分析实例代码
2017/12/07 Python
python中的随机函数小结
2018/01/27 Python
用Python实现大文本文件切割的方法
2019/01/12 Python
Python 导入文件过程图解
2019/10/15 Python
python、PyTorch图像读取与numpy转换实例
2020/01/13 Python
解决python3.6用cx_Oracle库连接Oracle的问题
2020/12/07 Python
手机端用rem+scss做适配的详解
2017/11/15 HTML / CSS
使用html2canvas实现将html内容写入到canvas中生成图片
2020/01/03 HTML / CSS
顶丰TOPPIK台湾官网:增发纤维假发,告别秃发困扰
2018/06/13 全球购物
C#如何允许一个类被继承但是避免这个类的方法被重载?
2015/02/24 面试题
语文教育专业求职信
2014/06/28 职场文书
树转促学习心得体会
2014/09/10 职场文书
交通事故协议书范本
2014/11/18 职场文书
项目备案申请报告
2015/05/15 职场文书
给领导敬酒词
2015/08/12 职场文书
Golang 空map和未初始化map的注意事项说明
2021/04/29 Golang
利用python做数据拟合详情
2021/11/17 Python