python【系列教程】之網絡編程

一、網絡編程的基礎知識

二、python 的基本網絡支持

 

 

 

 

 

 

 

 

 多線程下載文件工具類DownUtil

from urllib.request import *
import threading


class DownUtil:
    def __init__(self, path, target_file, thread_num):
        # 定義資源下載的路徑
        self.path = path
        # 定義需要使用多少個線程下載資源
        self.thread_num = thread_num
        # 指定所下載的文件的保存位置
        self.target_file = target_file
        # 初始化threads數組
        self.threads = []

    def download(self):
        # 創建request對象
        req = Request(url=self.path, method='GET')
        # 添加請求頭
        req.add_header('Accept', '*/*')
        req.add_header('Charset', 'UTF-8')
        req.add_header('Connection', 'Keep-Alive')
        # 打開要下載的資源
        f = urlopen(req)
        self.file_size = int(dict(f.headers).get('Content-Length', 0))
        f.close()
        # 計算每個線程要下載的資源大小
        current_part_size = self.file_size // self.thread_num + 1
        for i in range(self.thread_num):
            # 計算每個線程下載的開始位置
            start_pos = i * current_part_size
            # 每個線程使用一個wb模式打開的文件進行下載
            t = open(self.target_file, 'wb')
            # 定義該線程的下載位置
            t.seek(start_pos, 0)
            # 創建下載線程
            td = DownThread(self.path, start_pos, current_part_size, t)
            self.threads.append(td)
            # 啓動線程
            td.start()

    # 獲取下載完成的百分比
    def get_complete_rate(self):
        # 統計多個線程已經下載的資源總大小
        sum_size = 0
        for i in range(self.thread_num):
            sum_size += self.threads[i].length
        return sum_size / self.file_size


class DownThread(threading.Thread):
    def __init__(self, path, start_pos, current_part_size, current_part):
        super().__init__()
        self.path = path
        # 當前線程的下載位置
        self.start_pos = start_pos
        # 定義當前線程負責下載的文件大小
        self.current_part_size = current_part_size
        # 當前線程需要下載的文件塊
        self.current_part = current_part
        # 定義當前線程已下載的字節數
        self.length = 0

    def run(self):
        # 創建Request對象
        req = Request(url=self.path, method='GET')
        # 添加請求頭
        req.add_header('Accept', '*/*')
        req.add_header('Charset', 'UTF-8')
        req.add_header('Connection', 'Keep-Alive')
        # 打開要下載的資源
        f = urlopen(req)
        # 跳過self.start_pos個字節,表明該線程只下載自己負責的那部分內容
        for i in range(self.start_pos):
            f.read(1)
        while self.length < self.current_part_size:
            data = f.read(1024)
            if data is None or len(data) <= 0:
                break
            self.current_part.write(data)
            # 累計該線程下載的資源總大小
            self.length += len(data)
        self.current_part.close()
        f.close()

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)

d.download()

def show_process():
    print('已完成:%.2f'% d.get_complete_rate())
    global t
    if d.get_complete_rate()<1:
        t = threading.Timer(0.1,show_process)
        t.start()
t = threading.Timer(0.1,show_process)
t.start()

 

 

 

 

from urllib.request import *
import http.cookiejar, urllib.parse

cookie_jar = http.cookiejar.MozillaCookieJar('a.txt')
cookie_processor = HTTPCookieProcessor(cookie_jar)
opener = build_opener(cookie_processor)
# 定義一個模擬chrome瀏覽器的User-Agent
user_agent = r'Mozilla/5.0(Windows NT 6.1; wow64) AppleWebKit/537.36' \
             r'(KHTML,like Gecko) Chrome/56.0.2924.87 Safari/537.36'

# 定義請求頭
headers = {'User-Agent': user_agent, 'Connection': 'keep-alive'}

# 下面代碼發送登陸的post請求
# 定義登陸系統的請求參數
params = {'name': 'crazyit.org', 'pass': 'leegang'}
postdata = urllib.parse.urlencode(params).encode()
# 創建向登錄頁面發送的post請求的request
request = Request('http://localhost:8888/test/join.jsp', data=postdata,headers=headers)
response = opener.open(request)
print(response.read().decode('utf-8'))
# 將cookie信息寫入文件
cookie_jar.save(ignore_discard=True, ignore_expires=True)
# 下面代碼發送訪問被保護資源的get請求
request = Request('http://localhost:8888/test/secret.jsp',headers=headers)
response = opener.open(request)
print(response.read().decode('utf-8'))

 

 

三、基於tcp協議的網絡編程

 

 

 

 

# 導入socket模塊
import socket

# 創建socket對象
s = socket.socket()
# 連接遠程服務器
s.connect(('localhost', 30000))
print(s.recv(1024).decode('utf-8'))
s.close()

 socket 通信 服務端代碼:

# 導入socket模塊
import socket

# 創建socket對象
s = socket.socket()
# 將socket綁定到本機IP和端口
s.bind(('localhost', 30000))
# 服務器端開始監聽來自客戶端的連接
s.listen()

while True:
    # 每當接收到客戶端的socket請求時,該方法就返回對應的socket和遠程地址
    c, addr = s.accept()
    print(c)
    print('連接地址', addr)
    c.send('您好!您收到了服務器的新年祝福'.encode('utf-8'))
    # 關閉連接
    c.close()

 socket通信客戶端代碼:

# 導入socket模塊
import socket

# 創建socket對象
s = socket.socket()
# 連接遠程服務器
s.connect(('localhost', 30000))
print(s.recv(1024).decode('utf-8'))
s.close()

 

 

 

 

 

 

 

 

 

四、基於udp協議的網絡編程

 

 

 

 

 

 

 

五、電子郵件支持

 

import smtplib
from email.message import EmailMessage

# 定義smtp服務器地址
smtp_server = 'smtp.qq.com'
# 定義發件人地址
from_addr = '[email protected]'
# 定義登錄郵箱的密碼
password = 'plrcqrfgdajybhah'
# 定義收件人地址
to_addr = '[email protected]'
# 創建smtp連接
conn = smtplib.SMTP(smtp_server)
smtplib.SMTP_SSL(smtp_server, 465)
conn.set_debuglevel(1)
conn.login(from_addr, password)
msg = EmailMessage()
msg.set_content('您好,這是一封來自python的郵件', 'plain', 'utf-8')
conn.sendmail(from_addr, [to_addr], msg.as_string())
conn.quit()

 發送html郵件

 

import smtplib
from email.message import EmailMessage

# 定義smtp服務器地址
smtp_server = 'smtp.qq.com'
# 定義發件人地址
from_addr = '[email protected]'
# 定義登錄郵箱的密碼
password = 'plrcqrfgdajybhah'
# 定義收件人地址
to_addr = '[email protected]'
# 創建smtp連接
conn = smtplib.SMTP(smtp_server)
smtplib.SMTP_SSL(smtp_server, 465)
conn.set_debuglevel(1)
conn.login(from_addr, password)
msg = EmailMessage()
msg.set_content('<h1>您好,這是一封來自python的郵件</h1>', 'html', 'utf-8')
msg['subject'] = '<h1>一封html郵件</h1>'
msg['from'] = '李剛<%s>' % from_addr
msg['to'] = '新用戶<%s>' % to_addr
conn.sendmail(from_addr, [to_addr], msg.as_string())
conn.quit()

 

 

 

 

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章