1. 程式人生 > 實用技巧 >python學習27天----網路基礎

python學習27天----網路基礎

1.網路開發架構

1)C/S架構:客戶端/服務端(client/server)

C/S優點:客戶端能充分發揮PC的效能

2)B/S架構:瀏覽器/伺服器(brower/server)隸屬於C/S架構

B/S優點:統一了應用的介面

2.網路通訊

1)同一個電腦兩個py程式通訊:2個py檔案同時操作1個檔案,一個讀,一個寫

2)兩個電腦通訊

3)多個電腦通訊:區域網(交換機)---二層通訊原理

2.Socket(套接字)

1)介面:別人寫好的功能,自己去呼叫,這個功能的名字就是介面

print(‘abc’)呼叫了系統中的標準輸出,所以可以列印內容,即print呼叫了這個介面

import sys
print
('abc') sys.stdout.write('abc') 輸出: abc abc
View Code

2)socket感念

Socket是應用層與TCP/IP協議簇通訊的中間軟體抽象層,它是一組介面。在設計模式中,socket其實就是一個門面模式,他把複雜的TCP/IP協議隱藏在Socker介面後面,對使用者來說,一組簡單的介面就是全部,讓socket去組織資料,以符合指定的協議

①基於檔案型別的套件字(AF_Unix):socket是源自於unix系統而研發的功能,主要是為了同一臺電腦上,多個程式直接通訊

②基於網路型別的套接字(AF_INET)

3)socket層

通訊類的程式想要實現通訊必須要呼叫Socket(裡面提供了一系列的方法),根據業務不同的傳輸模式(tcp/udp),在編寫程式過程中,只關注傳送的程式和傳送所需要的協議,其他不用關注

4)協議型別(type)

①tcp:SOCK_STREAM

②udp: SOCK_DGRAM

3.Socket

1)服務端和客戶端的連線

#server.py
import socket
import  time
sk = socket.socket()   #包.類  不傳引數,預設使用基於網路的套接字,使用TCP模式
#socket預設引數:family=AF_INET(基於網路的scoket), type=SOCK_STREAM(TCP模式), proto=0, fileno=None
sk.bind(('192.168.43.223',18800)) #服務端的IP和開啟的埠
sk.listen() #
監聽,同時能接受的連線(即A能訪問百度,B也能訪問百度) print("連線前。。。") conn,addr = sk.accept() #等待接受客戶端的連線,程式阻塞等待(之前的程式執行,之後的在客戶端連線後執行) print("連線後。。。") print("conn:%s",conn) print("addr:%s",addr) time.sleep(20) conn.close() sk.close() #關閉連線 #client.py import socket import time sk = socket.socket() sk.connect(('192.168.43.223',18800)) time.sleep(20) sk.close() #輸出: 連線前。。。 連線後。。。 conn:%s <socket.socket fd=288, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('192.168.43.223', 18800), raddr=('192.168.43.223', 51742)> addr:%s ('192.168.43.223', 51742)
View Code

2)客戶端和服務端的資料傳送和接受

#server.py
import socket
import  time
sk = socket.socket()                 #買一個手機
sk.bind(('192.168.43.223',18800))   #買一個手機卡
sk.listen()                         #開機
conn,addr = sk.accept() #等待連線     #等待朋友打電話
str = conn.recv(1024) #等待接受伺服器的大小,單位為位元組   #
str2 = conn.recv(1024)
print(str.decode("utf-8"))
# print(str2.decode("utf-8"))
conn.close()                       #掛掉電話
sk.close() #關閉連線                #關機
#client.py
import socket
import time
sk = socket.socket()
sk.connect(('192.168.43.223',18800))
sk.send(b"Hello World !!!") #客戶端傳送的資料必須為bytes型別,否則無法傳輸
sk.send("你好,世界".encode("utf-8"))
sk.close()
#輸出:
Hello World !!!你好,世界
View Code

sk = socket.socket(family=AF_INET,type=SOCK_STREAM)

4)協議型別(type)

①tcp:SOCK_STREAM

②udp: SOCK_DGRAM

5)fimaly

①AF_unix

②AF_INET

重點總結:

①arp協議

②路由器、交換機區別

③tcp協議和udp協議的特點及tcp協議的編碼

④TCP/IP五層模型

練習:

1)客戶端和服務端持續通訊,當一段輸入q時兩端退出

#server.py
import socket
import  time
sk = socket.socket()
sk.bind(('127.0.0.1',18800))
sk.listen()
conn,addr = sk.accept() #等待連線
while True:
    str_out = conn.recv(2048).decode("utf-8") #等待接受資料的大小,單位為位元組
    if str_out == 'q':
        break
    else:
        print(str_out)
    str_in = input(">>>")
    conn.send(str_in.encode("utf-8"))
    if str_in == "q":
        break
conn.close()
sk.close()
#client.py
import socket
import time
sk = socket.socket()
sk.connect(('127.0.0.1',18800))
while True:
    str_in = input(">>>")
    sk.send(str_in.encode("utf-8")) #客戶端傳送的資料必須為bytes型別,否則無法傳輸
    if str_in == 'q':
        break
    str_out= sk.recv(2048).decode("utf-8")
    print(str_out)
    if str_out=='q':
        break

sk.close()
View Code

2)一個伺服器輪流的和多個客戶端進行通訊(只需要在服務端加一個while迴圈即可)

python.py
import socket
import  time
sk = socket.socket()
sk.bind(('127.0.0.1',18800))
sk.listen()
while 1:
    conn,addr = sk.accept() #等待連線
    while True:
        str_out = conn.recv(2048).decode("utf-8") #等待接受資料的大小,單位為位元組
        if str_out == 'q':
            break
        else:
            print(str_out)
        str_in = input(">>>")
        conn.send(str_in.encode("utf-8"))
        if str_in == "q":
            break
    conn.close()
sk.close()
View Code