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 printView Code('abc') sys.stdout.write('abc') 輸出: abc abc
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() #View Code監聽,同時能接受的連線(即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)
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