python【系列教程】之网络编程

举报
小米粒-biubiubiu 发表于 2020/12/03 01:21:53 2020/12/03
【摘要】 一、网络编程的基础知识 二、python 的基本网络支持                  多线程下载文件工具类DownUtil from urllib.request import *import threading class DownUtil: def __init__(self, path, target_file, thread_nu...

一、网络编程的基础知识

二、python 的基本网络支持

 

 

 

 

 

 

 

 

 多线程下载文件工具类DownUtil


  
  1. from urllib.request import *
  2. import threading
  3. class DownUtil:
  4. def __init__(self, path, target_file, thread_num):
  5. # 定义资源下载的路径
  6. self.path = path
  7. # 定义需要使用多少个线程下载资源
  8. self.thread_num = thread_num
  9. # 指定所下载的文件的保存位置
  10. self.target_file = target_file
  11. # 初始化threads数组
  12. self.threads = []
  13. def download(self):
  14. # 创建request对象
  15. req = Request(url=self.path, method='GET')
  16. # 添加请求头
  17. req.add_header('Accept', '*/*')
  18. req.add_header('Charset', 'UTF-8')
  19. req.add_header('Connection', 'Keep-Alive')
  20. # 打开要下载的资源
  21. f = urlopen(req)
  22. self.file_size = int(dict(f.headers).get('Content-Length', 0))
  23. f.close()
  24. # 计算每个线程要下载的资源大小
  25. current_part_size = self.file_size // self.thread_num + 1
  26. for i in range(self.thread_num):
  27. # 计算每个线程下载的开始位置
  28. start_pos = i * current_part_size
  29. # 每个线程使用一个wb模式打开的文件进行下载
  30. t = open(self.target_file, 'wb')
  31. # 定义该线程的下载位置
  32. t.seek(start_pos, 0)
  33. # 创建下载线程
  34. td = DownThread(self.path, start_pos, current_part_size, t)
  35. self.threads.append(td)
  36. # 启动线程
  37. td.start()
  38. # 获取下载完成的百分比
  39. def get_complete_rate(self):
  40. # 统计多个线程已经下载的资源总大小
  41. sum_size = 0
  42. for i in range(self.thread_num):
  43. sum_size += self.threads[i].length
  44. return sum_size / self.file_size
  45. class DownThread(threading.Thread):
  46. def __init__(self, path, start_pos, current_part_size, current_part):
  47. super().__init__()
  48. self.path = path
  49. # 当前线程的下载位置
  50. self.start_pos = start_pos
  51. # 定义当前线程负责下载的文件大小
  52. self.current_part_size = current_part_size
  53. # 当前线程需要下载的文件块
  54. self.current_part = current_part
  55. # 定义当前线程已下载的字节数
  56. self.length = 0
  57. def run(self):
  58. # 创建Request对象
  59. req = Request(url=self.path, method='GET')
  60. # 添加请求头
  61. req.add_header('Accept', '*/*')
  62. req.add_header('Charset', 'UTF-8')
  63. req.add_header('Connection', 'Keep-Alive')
  64. # 打开要下载的资源
  65. f = urlopen(req)
  66. # 跳过self.start_pos个字节,表明该线程只下载自己负责的那部分内容
  67. for i in range(self.start_pos):
  68. f.read(1)
  69. while self.length < self.current_part_size:
  70. data = f.read(1024)
  71. if data is None or len(data) <= 0:
  72. break
  73. self.current_part.write(data)
  74. # 累计该线程下载的资源总大小
  75. self.length += len(data)
  76. self.current_part.close()
  77. f.close()
  78. d = DownUtil('https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1569583834625&di=9a307758f95e32c324e36d00a9cdd59b&imgtype=0&src=http%3A%2F%2Fb.zol-img.com.cn%2Fsoft%2F6%2F571%2FcepyVKtIjudo6.jpg','./1.jpg',5)
  79. d.download()
  80. def show_process():
  81. print('已完成:%.2f'% d.get_complete_rate())
  82. global t
  83. if d.get_complete_rate()<1:
  84. t = threading.Timer(0.1,show_process)
  85. t.start()
  86. t = threading.Timer(0.1,show_process)
  87. t.start()

 

 

 

 


  
  1. from urllib.request import *
  2. import http.cookiejar, urllib.parse
  3. cookie_jar = http.cookiejar.MozillaCookieJar('a.txt')
  4. cookie_processor = HTTPCookieProcessor(cookie_jar)
  5. opener = build_opener(cookie_processor)
  6. # 定义一个模拟chrome浏览器的User-Agent
  7. user_agent = r'Mozilla/5.0(Windows NT 6.1; wow64) AppleWebKit/537.36' \
  8. r'(KHTML,like Gecko) Chrome/56.0.2924.87 Safari/537.36'
  9. # 定义请求头
  10. headers = {'User-Agent': user_agent, 'Connection': 'keep-alive'}
  11. # 下面代码发送登陆的post请求
  12. # 定义登陆系统的请求参数
  13. params = {'name': 'crazyit.org', 'pass': 'leegang'}
  14. postdata = urllib.parse.urlencode(params).encode()
  15. # 创建向登录页面发送的post请求的request
  16. request = Request('http://localhost:8888/test/join.jsp', data=postdata,headers=headers)
  17. response = opener.open(request)
  18. print(response.read().decode('utf-8'))
  19. # 将cookie信息写入文件
  20. cookie_jar.save(ignore_discard=True, ignore_expires=True)
  21. # 下面代码发送访问被保护资源的get请求
  22. request = Request('http://localhost:8888/test/secret.jsp',headers=headers)
  23. response = opener.open(request)
  24. print(response.read().decode('utf-8'))

 

 

三、基于tcp协议的网络编程

 

 

 

 


  
  1. # 导入socket模块
  2. import socket
  3. # 创建socket对象
  4. s = socket.socket()
  5. # 连接远程服务器
  6. s.connect(('localhost', 30000))
  7. print(s.recv(1024).decode('utf-8'))
  8. s.close()

 socket 通信 服务端代码:


  
  1. # 导入socket模块
  2. import socket
  3. # 创建socket对象
  4. s = socket.socket()
  5. # 将socket绑定到本机IP和端口
  6. s.bind(('localhost', 30000))
  7. # 服务器端开始监听来自客户端的连接
  8. s.listen()
  9. while True:
  10. # 每当接收到客户端的socket请求时,该方法就返回对应的socket和远程地址
  11. c, addr = s.accept()
  12. print(c)
  13. print('连接地址', addr)
  14. c.send('您好!您收到了服务器的新年祝福'.encode('utf-8'))
  15. # 关闭连接
  16. c.close()

 socket通信客户端代码:


  
  1. # 导入socket模块
  2. import socket
  3. # 创建socket对象
  4. s = socket.socket()
  5. # 连接远程服务器
  6. s.connect(('localhost', 30000))
  7. print(s.recv(1024).decode('utf-8'))
  8. s.close()

 

 

 

 

 

 

 

 

 

四、基于udp协议的网络编程

 

 

 

 

 

 

 

五、电子邮件支持

 


  
  1. import smtplib
  2. from email.message import EmailMessage
  3. # 定义smtp服务器地址
  4. smtp_server = 'smtp.qq.com'
  5. # 定义发件人地址
  6. from_addr = '414591005@qq.com'
  7. # 定义登录邮箱的密码
  8. password = 'plrcqrfgdajybhah'
  9. # 定义收件人地址
  10. to_addr = '414591005@qq.com'
  11. # 创建smtp连接
  12. conn = smtplib.SMTP(smtp_server)
  13. smtplib.SMTP_SSL(smtp_server, 465)
  14. conn.set_debuglevel(1)
  15. conn.login(from_addr, password)
  16. msg = EmailMessage()
  17. msg.set_content('您好,这是一封来自python的邮件', 'plain', 'utf-8')
  18. conn.sendmail(from_addr, [to_addr], msg.as_string())
  19. conn.quit()

 发送html邮件

 


  
  1. import smtplib
  2. from email.message import EmailMessage
  3. # 定义smtp服务器地址
  4. smtp_server = 'smtp.qq.com'
  5. # 定义发件人地址
  6. from_addr = '414591005@qq.com'
  7. # 定义登录邮箱的密码
  8. password = 'plrcqrfgdajybhah'
  9. # 定义收件人地址
  10. to_addr = '414591005@qq.com'
  11. # 创建smtp连接
  12. conn = smtplib.SMTP(smtp_server)
  13. smtplib.SMTP_SSL(smtp_server, 465)
  14. conn.set_debuglevel(1)
  15. conn.login(from_addr, password)
  16. msg = EmailMessage()
  17. msg.set_content('<h1>您好,这是一封来自python的邮件</h1>', 'html', 'utf-8')
  18. msg['subject'] = '<h1>一封html邮件</h1>'
  19. msg['from'] = '李刚<%s>' % from_addr
  20. msg['to'] = '新用户<%s>' % to_addr
  21. conn.sendmail(from_addr, [to_addr], msg.as_string())
  22. conn.quit()

 

 

 

 

 

 

 

 

 

 

 

 

文章来源: blog.csdn.net,作者:血煞风雨城2018,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/qq_31905135/article/details/101020351

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

举报
请填写举报理由
0/200