Python2與Python3的區別/網絡基礎/socketserver模塊中的多線程


一.知識點補充:

1.解釋型語言和編譯型語言

  編譯型(目前有兩種解釋):

    先把代碼編譯成機器碼 -> 機器寄存器去運行 :C語言

    先把代碼編譯成XXX -> 計算機找虛擬機執行代碼 -> 機器碼交給計算機去執行 :C語言,JAVA,C#

  解釋型:

    邊解釋邊執行

2.Python中的作用域

  Python中的函數是一個作用域

3.這里規定一下以后寫元組的格式:

  v = (1,2,3,)

1.Python中函數是一個作用域
i=0
for i in range(10):
    pass
print(i)

結果:9


def func():
    for i in range(10):
        pass
func()
print(i)

結果:報錯

2.列表生成式
val = [lambda x:x+i for i in range(10)]
ret = val[3](6)
print(ret)

結果:15


val = [lambda :x for x in range(10)]
ret = val[3]()
print(ret)

結果:9
View Code

二.Python2和Python3的區別(必會)

1.編碼&字符串

  字符串:

    python2:

      unicode  v = u"root"  本質上用unicode存儲(萬國碼)

      (str/bytes) v = "root"    本質用字節存儲

    python3:

      str     v = "root"    本質上用unicode存儲(萬國碼)

      bytes   v = b"root"  本質上用字節存儲

  編碼:

    python2:

      ASCII

      文件頭可以修改: # -*- encoding:utf-8 -*-

    python3:

      utf-8

      文件頭可以修改:# -*- encoding:utf-8 -*-

    注意:文件是如何存儲的?

2.繼承

  python2:新式類/經典類

  python3:新式類(繼承object) 

3.范圍

  python2:range/xrange

  python3:   range

4.輸入

  python2:v1 = raw_input("請輸入用戶名: ")

  python3:v2 = input("請輸入用戶名: ")

5.打印:

  python2:print "XX"

  python3:print(123)

三.網絡編程

1.PC有網卡,網卡中有MAC地址

  cmd -> config /all -> 物理地址即為你的MAC地址

2.局域網中路由器或交換機中的DHCP服務為我們自動分配IP地址

  DHCP服務:說通俗一點,就是你在你的網卡的本地連接里設置成“自動獲取IP地址”,而DHCP就是為你的網卡那個連接提供自動配置IP地址,子網掩碼,網關,DNS等信息的一種服務協議,運行這種協議的就叫DHCP服務器

  IP:為計算機網絡相互連接進行通信而設計的協議

    IPv4:互聯網協議的第四版也是第一個被廣泛使用,構成現今互聯網即使的基礎的協議,用32位0/1序列來表示,分為四段八位序列,每一段的范圍是:0~255

      00000000.00000000.00000000.00000000

      0~255  0~255  0~255  0~255

    IPv6:用來設計替代現行版本IPv4的下一代版本,使用16進制來表示,也按照8位分割,段與段之間用":"分割

      00000000.00000000.00000000.00000000.00000000.00000000

  子網掩碼:子網掩碼是一個32位地址,用於屏蔽IP地址的一部分以區別網絡標識和主機標識,並說明該IP地址是在局域網上,還是在遠程網上;不能單獨存在,必須和IP地址結合在一起使用

      192.168.13.84
      255.255.255.0

  網關IP:如果兩個IP地址,不在同一網段,這時候,要想通過IP地址訪問另一網段的計算機(也是IP地址),就需要網關地址。網關地址就是出口的地址,而且,網關地址,是你最近的一個出口的地址。網關地址總是與你的計算機的IP地址是同一網段的

      192.168.13.1

局域網;城域網;廣域網
     廣播
   單播
   廣播風暴
   arp協議
View Code

3.DNS服務器

  網絡連接:

     - 域名解析 www.luffycity.com 47.95.64.113

         www.oldboyedu.com 101.200.195.98

    - 連接

         sk = socket.socket()

         sk.connect(('47.95.64.113',80))

        ...

  問題來了,域名和IP的對應關系在哪里?
  本地:
  Win本地電腦:
    C:\Windows\System32\drivers\etc\hosts
      11.11.11.11 luffycicy.com
  Linux/Mac電腦:
      /etc/hosts

   DNS服務器:全球頂級DNS服務器13台

4.總結:

(1). DHCP,自動位局域網內容電腦分配IP。
(2). 網關,路由器中連接交換機的口。
(3). IP,4個點分的十進制表示 192.11.111.11
(4). 子網掩碼,
  IP: 192.168.13.99
  掩碼:255.255.255.0
  將擋住的IP位數作為網段。
  未擋住的部分作為可變的值。
(5). 局域網/城域網/廣域網
(6). arp協議
(7). DNS

 四.socketserver模塊

1.初識線程:

import time
import threading

def task(a1,a2,a3):
    time.sleep(2)
    print('拿快遞')

def play():
    print('和女朋友去耍')

def wm():
    print('去拿外賣')

# 創建一個線程
# 讓該線程去執行任務:函數
t1 = threading.Thread(target=task,args=(1,2,3,))
# 去執行吧
t1.start()

# 創建一個線程
# 讓該線程去執行任務:函數
t2 = threading.Thread(target=play)
# 去執行吧
t2.start()

# 創建一個線程
# 讓該線程去執行任務:函數
t3 = threading.Thread(target=wm)
# 去執行吧
t3.start()

print('玩扇子')
print('煽風點火')
print('耍賤...')

結果:
和女朋友去耍
去拿外賣
玩扇子
煽風點火
耍賤...
拿快遞
初識

2.線程執行任務:

import time import threading def task(n): print('開始執行任務:',n) time.sleep(10) print('...') print('任務%s 執行完畢:'%n) while True: name = input("請輸入任務:") t = threading.Thread(target=task,args=(name,)) t.start()

10s后

3.socket和線程的配合

import time import socket import threading def task(conn): time.sleep(20) data = conn.recv(1024) print(data) conn.close() server = socket.socket() server.bind(('127.0.0.1',8001,)) server.listen(5) while True: conn,addr = server.accept() t = threading.Thread(target=task,args=(conn,)) t.start()

4.解析socketserver模塊

import socketserver

class MyServer(socketserver.BaseRequestHandler):
    def handle(self):
        pass
        # 編寫代碼

server = socketserver.ThreadingTCPServer(('192.168.13.84',8001,),MyServer)
"""
server.server_address = server_address
server.RequestHandlerClass = RequestHandlerClass
server.__is_shut_down = threading.Event()
server.__shutdown_request = False
server.socket = socket....
    - socket.bind
    - socket.listen
"""

server.serve_forever()
View Code

五.贈送內容:uuid模塊

import uuid v = str(uuid.uuid4()) print(v) 結果: b4375eea-5f0d-473b-a489-f89c5e70c95d

uuid模塊在Python 2.5以后引入,接口包括:不可變對象UUID(UUID類)和函數uuid1()、uuid3()、uuid4()和uuid5(),后面的四個函數用於生成 RFC 4122 規范中指定的第1、3、4、5版UUID。使用uuid1()或uuid4()可以獲得一個唯一的ID,uuid1()包含了主機的網絡名稱,uuid4()不涉及網絡主機名,僅生成一個隨機UUID,因此從隱私保護角度uuid4()更加安全。

"""
安裝request模塊
pip3 install requests
"""
import threading
import requests
import uuid

url_list = [
    'https://www3.autoimg.cn/newsdfs/g28/M05/F9/98/120x90_0_autohomecar__ChsEnluQmUmARAhAAAFES6mpmTM281.jpg',
    'https://www2.autoimg.cn/newsdfs/g28/M09/FC/06/120x90_0_autohomecar__ChcCR1uQlD6AT4P3AAGRMJX7834274.jpg',
    'https://www2.autoimg.cn/newsdfs/g3/M00/C6/A9/120x90_0_autohomecar__ChsEkVuPsdqAQz3zAAEYvWuAspI061.jpg',
]

def task(url):
    """"""

    """
    1. DNS解析,根據域名解析出IP
    2. 創建socket客戶端    sk = socket.socket()
    3. 向服務端發起連接請求 sk.connect()
    4. 發送數據(我要圖片) sk.send(...)
    5. 接收數據            sk.recv(8096)

    接收到數據后寫入文件。
    """
    ret = requests.get(url)
    file_name = str(uuid.uuid4()) + '.jpg'
    with open(file_name, mode='wb') as f:
        f.write(ret.content)

for url in url_list:

    t = threading.Thread(target=task,args=(url,))
    t.start()
應用


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM