day 30 多線程 socketserver模塊補充

內容回顧:java

socket 模塊編程

  服務端:收發數據 - > accept/recv服務器

  客戶端:收發數據 -> connect/recv網絡

1. 考試題
1. 解釋性和編譯型
    編譯型:
        先把代碼編譯成機器碼  -> 計算機寄存器去運行  :C語言
        先把代碼編譯成XXX     -> 計算機找虛擬機執行代碼->機器碼交給計算技巧去運行        :C語言、java、C#
    解釋型:
        邊解釋邊執行
            
            def func():
                print(name)
                
            print(666)
4. 
    列表: ''.join(['xx','ff'])
    字符串:list('xxxxxxxx') / split

5. v[::-1]

7. py2/py3 
    - 編碼&字符串 
        字符串:
            py2: 
                unicode         v = u"root"    本質上用unicode存儲(萬國碼)
                (str/bytes)     v = "root"     本質用字節存儲
            py3:            
                str                v = "root"     本質上用unicode存儲(萬國碼)
                bytes           v = b"root"    本質上用字節存儲
        編碼:
            py2: 
                - ascii 
                文件頭能夠修改:#-*- encoding:utf-8 -*-
            py3:
                - utf-8
                文件頭能夠修改:#-*- encoding:utf-8 -*-
            
            注意:文件是如何存儲?
    - 繼承
        py2: 經典類/新式類
        py3: 新式類
    - 範圍
        py2:range/xrange
        py3:       range 
    - 輸入
        py2: v1 = raw_input('請輸入用戶名:')
        py3: v2 = input('請輸入用戶名:')
    - 打印
        py2: print 'xx'
        py3: print(123)
    
        
9. 之後寫元組:
    v = (1,2,3,)
    
    Django框架靜態文件配置

2. 網絡編程

1. 個人電腦有網卡,網卡里有mac地址

2. 我到某個地方插上網線,路由器或交換機中的DHCP服務爲我自動分配IP地址。
    IP: 192.168.13.84
         IPv4
            00000000.00000000.00000000.00000000
            0~255    0~255    0~255    0~255
         IPv6 
            00000000.00000000.00000000.00000000.00000000.00000000
    子網掩碼:255.255.255.0
        192.168.13.84
        255.255.255.0
        
        192.168.12.84
        255.255.255.0
        
    網關IP:192.168.13.1
        
    局域網內、城域網、廣域網:
        廣播
        單播
        廣播風暴
        arp協議
    
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臺
            www.luffycity.com  47.95.64.113
            
    
    創業:
        a. 租一個服務器+公網IP
        b. 租域名
            域名+IP解析
        

總結:
    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 

3. 多線程 
4. socketserver

注意:之後若是想要提升效率能夠使用多線程。
    

    """
    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()
考試講解

 多線程:

  就是分出多個我,取同時執行任務,提升程序的執行效率。多線程

import threading
def task(a,b,c):pass
def play():psaa

t1 = threading.Thread(target=task,args=(1,2,3,))  #分身一(建立一個線程,讓線程取執行函數)
t1.start()  #執行

t2 = threading.Thread(target=play)   #分身二
t2.start()
#建立的線程位子線程,直接往下走的是函數的主線程
# by luffycity.com
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('耍賤...')
代碼詳細

 

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(('192.168.13.84',8001,))
server.listen(5)

while True:
    conn,addr = server.accept()
    t = threading.Thread(target=task,args=(conn,))
    t.start()
 1 import socketserver
 2 
 3 class MyServer(socketserver.BaseRequestHandler):
 4     def handle(self):
 5         self.request
 6         self.client_address
 7         self.server
 8         # 編寫代碼
 9 
10 server = socketserver.ThreadingTCPServer(('192.168.13.84',8001,),MyServer)
11 """
12 server.server_address = server_address
13 server.RequestHandlerClass = RequestHandlerClass
14 server.__is_shut_down = threading.Event()
15 server.__shutdown_request = False
16 server.socket = socket....
17     - socket.bind
18     - socket.listen
19 """
20 
21 
22 server.serve_forever()
解析socket源碼

 

uuid模塊

  每次執行都會生成一個隨機字符串框架

  應用:當文件名(接受的文件隨機賦值一個文件名)socket

import uuid

v = str(uuid.uuid4())
print(v)
相關文章
相關標籤/搜索