標籤:關心 lan file miss 起源 lap tail mission 虛擬機器
一.socket概念1.理解socket
絡上的兩個程式通過一個雙向的通訊串連實現資料的交換,這個串連的一端稱為一個socket。
建立網路通訊串連至少要一對連接埠號碼(socket)。socket本質是編程介面(API),對TCP/IP的封裝,TCP/IP也要提供可
供程式員做網路開發所用的介面,這就是Socket編程介面;HTTP是轎車,提供了封裝或者顯示資料的具體形式;
Socket是發動機,提供了網路通訊的能力。
Socket的英文原義是“孔”或“插座”。作為BSD UNIX的進程通訊機制,取後一種意思。通常也稱作"通訊端",用於描述
IP地址和連接埠,是一個通訊鏈的控制代碼,可以用來實現不同虛擬機器或不同電腦之間的通訊。在Internet上的主機一般運
行了多個服務軟體,同時提供幾種服務。每種服務都開啟一個Socket,並綁定到一個連接埠上,不同的連接埠對應於不同
的服務。Socket正如其英文原義那樣,像一個多孔插座。一台主機猶如布滿各種插座的房間,每個插座有一個編號,
有的插座提供220伏交流電, 有的提供110伏交流電,有的則提供有線電視節目。 客戶軟體將插頭插到不同編號的插座,
就可以得到不同的服務。
Socket是應用程式層與TCP/IP協議族通訊的中間軟體抽象層,它是一組介面。在設計模式中,Socket其實就是一個門面模式,
它把複雜的TCP/IP協議族隱藏在Socket介面後面,對使用者來說,一組簡單的介面就是全部,讓Socket去組織資料,以符合指定的協議。
2.socket概念socket層
理解socket
Socket是應用程式層與TCP/IP協議族通訊的中間軟體抽象層,它是一組介面。在設計模式中,Socket其實就是一個門面模式,它把複雜的TCP/IP協
議族隱藏在Socket介面後面,對使用者來說,一組簡單的介面就是全部,讓Socket去組織資料,以符合指定的協議。
3.通訊端(socket)的發展史
通訊端起源於 20 世紀 70 年代加利福尼亞大學伯克利分校版本的 Unix,即人們所說的 BSD Unix。 因此,有時人們也把通訊端稱為“伯克利通訊端
”或“BSD 通訊端”。一開始,通訊端被設計用在同 一台主機上多個應用程式之間的通訊。這也被稱進程間通訊,或 IPC。通訊端有兩種(或者稱為
有兩個種族),分別是基於檔案型的和基於網路型的。
基於檔案類型的通訊端家族
通訊端家族的名字:AF_UNIX
unix一切皆檔案,基於檔案的通訊端調用的就是底層的檔案系統來取資料,兩個通訊端進程運行在同一機器,可以通過訪問同一個檔案系統間接完成通訊
基於網路類型的通訊端家族
通訊端家族的名字:AF_INET
(還有AF_INET6被用於ipv6,還有一些其他的地址家族,不過,他們要麼是只用於某個平台,要麼就是已經被廢棄,或者是很少被使用,或者是根本沒有
實現,所有地址家族中,AF_INET是使用最廣泛的一個,python支援很多種地址家族,但是由於我們只關心網路編程,所以大部分時候我麼只使用AF_INET)
4.tcp協議和udp協議
TCP(Transmission Control Protocol)可靠的、連線導向的協議(eg:打電話)、傳輸效率低全雙工系統通訊(發送緩衝&接收緩衝)、面向位元組流。使用TCP
的應用:Web瀏覽器;電子郵件、檔案傳輸程式。
UDP(User Datagram Protocol)不可靠的、不需連線的服務,傳輸效率高(發送前時延小),一對一、一對多、多對一、多對多、面向報文,盡最大努力服
務,無擁塞控制。使用UDP的應用:網域名稱系統 (DNS);視頻流;IP語音(VoIP)。
我知道說這些你們也不懂,直接。
二.通訊端(socket)初使用1.基於TCP協議的socket
tcp是基於連結的,必須先啟動服務端,然後再啟動用戶端去連結服務端
server端:
1 import socket 2 sk = socket.socket() 3 sk.bind((‘127.0.0.1‘,8080)) #把地址綁定到通訊端 4 sk.listen() #監聽連結 5 conn,addr = sk.accept() #接受用戶端連結 6 ret = conn.recv(1024) #接收用戶端資訊 7 print(ret) #列印用戶端資訊 8 conn.send(b‘hi‘) #向用戶端發送資訊 9 conn.close() #關閉用戶端通訊端10 sk.close() #關閉伺服器通訊端(可選)
server端
client端
1 import socket2 sk = socket.socket() # 建立客戶通訊端3 sk.connect((‘127.0.0.1‘,8898)) # 嘗試串連伺服器4 sk.send(b‘hello!‘)5 ret = sk.recv(1024) # 對話(發送/接收)6 print(ret)7 sk.close() # 關閉客戶通訊端
client端
在重啟服務端時可能會遇到以下問題:
解決方案:
1 #加入一條socket配置,重用ip和連接埠 2 import socket 3 from socket import SOL_SOCKET,SO_REUSEADDR 4 sk = socket.socket() 5 sk.setsockopt(SOL_SOCKET,SO_REUSEADDR,1) #就是它,在bind前加 6 sk.bind((‘127.0.0.1‘,8080)) #把地址綁定到通訊端 7 sk.listen() #監聽連結 8 conn,addr = sk.accept() #接受用戶端連結 9 ret = conn.recv(1024) #接收用戶端資訊10 print(ret) #列印用戶端資訊11 conn.send(b‘hi‘) #向用戶端發送資訊12 conn.close() #關閉用戶端通訊端13 sk.close() #關閉伺服器通訊端(可選)
View Code2.基於UDP協議的socket
server端:
1 import socket2 udp_sk = socket.socket(type=socket.SOCK_DGRAM) #建立一個伺服器的通訊端3 udp_sk.bind((‘127.0.0.1‘,9000)) #綁定伺服器通訊端4 msg,addr = udp_sk.recvfrom(1024)5 print(msg)6 udp_sk.sendto(b‘hi‘,addr) # 對話(接收與發送)7 udp_sk.close() # 關閉伺服器通訊端
server端
client端:
1 import socket2 ip_port=(‘127.0.0.1‘,9000)3 udp_sk=socket.socket(type=socket.SOCK_DGRAM)4 udp_sk.sendto(b‘hello‘,ip_port)5 back_msg,addr=udp_sk.recvfrom(1024)6 print(back_msg.decode(‘utf-8‘),addr)
client端3.socket參數的詳解
socket.socket(family=AF_INET,type=SOCK_STREAM,proto=0,fileno=None)
建立socket對象的參數說明:
| family |
地址系列應為AF_INET(預設值),AF_INET6,AF_UNIX,AF_CAN或AF_RDS。 (AF_UNIX 域實際上是使用本地 socket 檔案來通訊) |
| type |
通訊端類型應為SOCK_STREAM(預設值),SOCK_DGRAM,SOCK_RAW或其他SOCK_常量之一。 SOCK_STREAM 是基於TCP的,有保障的(即能保證資料正確傳送到對方)連線導向的SOCKET,多用於資料傳送。 SOCK_DGRAM 是基於UDP的,無保障的面向訊息的socket,多用於在網路上發廣播資訊。 |
| proto |
協議號通常為零,可以省略,或者在地址族為AF_CAN的情況下,協議應為CAN_RAW或CAN_BCM之一。 |
| fileno |
如果指定了fileno,則其他參數將被忽略,導致帶有指定檔案描述符的通訊端返回。 與socket.fromfd()不同,fileno將返回相同的通訊端,而不是重複的。 這可能有助於使用socket.close()關閉一個獨立的插座。 |
python基礎——socket