我們看到的所有的通訊軟體和網路遊戲,都必須要實現兩個終端之間的網路通訊,比如:
1.網頁衝浪,是操作網頁的人與網頁部署的伺服器通訊;
2.王者榮耀,是10個玩家分別與遊戲伺服器兩兩通訊,若當玩家1用技能,則玩家1的電腦先通過網路告訴伺服器,伺服器再告訴2345678910;
要在不同型別的主機不同型別的作業系統上實現網路通訊,是件很麻煩的事情。
不過幸好,所有網路通訊的協議都是一樣的,都是基於這5層模型:
這5層對應的專業人員分別為:物理層、資料鏈路層、網路層->網路通訊人員;傳輸層->核心程式設計師;應用層->應用程式設計師。
對於乙個寫應用軟體的程式設計師來說,只需要關心「應用層」上的網路通訊就可以了。為了實現網路通訊,他們需要寫一些「網路通訊相關的**」,這些**就是socket。
一句話就是,socket讓程式設計師實現網路通訊變得簡單。
如果沒有socket,這些程式設計師就不得不去關心「傳輸層」的實現,也就是說,他們要去研究核心相關的知識(linux核心,window核心,ios核心)。
而有了socket,就輕鬆了,程式設計師只需要記住「六字真訣」--綁監受連發收:
監:伺服器監聽有哪些客戶端連上,** listen();
受:伺服器開始等待接受客戶端的連線,每接受乙個便返回乙個客戶端的ip和埠,**accept();
連:客戶端通過ip和埠連線伺服器,**connect(address, port);
發:客戶端和伺服器連通後,可以相互傳送資訊,**send(data);
收:客戶端和伺服器連通後,可以相互接收到對方傳送的資訊recv()。
有了socket,程式設計師在寫**時根本不需要關心像tcp三次握手這樣的操作,因為它已經悄悄的隱匿在六字真訣中的受和連裡!
socket和傳輸層、應用層的關係:
socket是一套api,並不屬於傳輸層或應用層。簡單來說,socket是傳輸層核心**根據綁監受連發收「六字真訣」封裝的一層介面;而應用層如http,則是用socket實現的一套特殊通訊機制。
下面是乙個用python實現乙個簡單的本機伺服器和客戶端socket通訊:
#server.py
import
socket
import
threading
defhandle_client(c, addr):
print(addr, "
connected.")
n =0
while
true:
#接收data = c.recv(1024)
ifnot
data:
break
n = n + 1
(addr, n)
#傳送
c.sendall(data)
#新建乙個socket s,with是語法糖,當**離開with時自動呼叫s.close()
with socket.socket(socket.af_inet, socket.sock_stream) as s:
#繫結 0.0.0.0代表主機上的任意網絡卡
s.bind(("
0.0.0.0
", 1234))
#監聽s.listen()
#簡單版,單執行緒+接收一次資料
#c, addr = s.accept()
#data = c.recv(1024)
#if not data:
#break
#n = n + 1
#print(addr, n)
#c.sendall(data)
#複雜版,多執行緒+一直接收資料
while
true:
#接受連線
c, addr =s.accept()
#建立乙個執行緒處理客戶端連線
t = threading.thread(target=handle_client, args=(c, addr))
t.start()
#分別執行server.py和client.py,就能實現乙個簡單的網路通訊了。client.py
import
socket
import
time
#新建乙個socket s,with是語法糖,當**離開with時自動呼叫s.close()
with socket.socket(socket.af_inet, socket.sock_stream) as s:
#連線s.connect(("
127.0.0.1
", 1234))
#簡單版,傳送一條資料
s.sendall(b"
hello, kael2")
data = s.recv(1024)
print("
received:
", repr(data))
#複雜版,每個1秒傳送一條資料
#while true:
#s.sendall(b"hello, kael")
#data = s.recv(1024)
#print("received:", repr(data))
#time.sleep(1)
mysql用大白話解釋 大白話說說mysql索引
前面其實寫了好幾篇關於 mysql 索引的文章了,文章中有具體的例項和 sql 語句,這篇文章我想再用純大白話講講 mysql 索引,文中不涉及具體 sql 我之前甚至想過為啥要用資料庫來儲存資料,用普通的 txt 或者 word 這類檔案不行麼,這個問題其實可以從幾個方面來看,乙個是併發訪問資料加...
大白話說 async await ,面試專用
async await 將非同步寫成同步的樣子,並保證執行順序,解決 地獄的問題 如果你是寫成 地獄的樣式,乙個請求成功以後,在 裡面巢狀下乙個 這樣多級巢狀的 函式弊端很多,不直觀,強耦合性,的不確定性,不利於維護和復用 async await就解決了這個問題 最下方有案例參考 1 async的作...
常見開源協議大白話說明
gpl 只要你用了任何該協議的庫 甚至是一段 那麼你的整個程式,不管以何種方式鏈結,都必須全部使用gpl協議 並遵循該協議開源。商業軟體公司一般禁用gpl 但可以使用gpl的可執行檔案和應用程式。agpl 即affero gpl,是gpl的更嚴格版本。只要你用了任何該協議的庫 甚至是一段 那麼執行時...