socket究竟是什麼呢?
簡單來說socket就是用來完成客戶端與伺服器之間的通訊
例如瀏覽器訪問網頁,例如網路遊戲等一切基於客戶端伺服器來實現的c/s架構程式
socket是基於網際網路osi七層協議的乙個結構,準確的說是基於建議網際網路模型osi五層協議的介面
如圖所示,自行腦補!
此處延伸乙個概念:套接字
套接字在最開始的時候,是應用於程序與程序之間的通訊,之後被廣泛應用到網際網路,基本上分為兩個種族
基於檔案型別的套接字:af_unix
基於網路型別的套接字:af_inet
而我們今後關心的重點肯定是網路型別,所以今後我們會對af_inet分解研究
套接字的工作流程:
這裡我們可以看出來socket的基本工作流程了,也大致看了一下socket通訊時所用到的方法
服務端套接字函式
服務端套接字函式以上供了解和學習s.bind() 繫結(主機,埠號)到套接字
s.listen() 開始tcp監聽
s.accept() 被動接受tcp客戶的連線,(阻塞式)等待連線的到來
客戶端套接字函式
s.connect() 主動初始化tcp伺服器連線
s.connect_ex() connect()函式的擴充套件版本,出錯時返回出錯碼,而不是丟擲異常
公共用途的套接字函式
s.recv() 接收tcp資料
s.send() 傳送tcp資料(send在待傳送資料量大於己端快取區剩餘空間時,資料丟失,不會發完)
s.sendall() 傳送完整的tcp資料(本質就是迴圈呼叫send,sendall在待傳送資料量大於己端快取區剩餘空間時,資料不丟失,迴圈呼叫send直到發完)
s.recvfrom() 接收udp資料
s.sendto() 傳送udp資料
s.getpeername() 連線到當前套接字的遠端的位址
s.getsockname() 當前套接字的位址
s.getsockopt() 返回指定套接字的引數
s.setsockopt() 設定指定套接字的引數
s.close() 關閉套接字
面向鎖的套接字方法
s.setblocking() 設定套接字的阻塞與非阻塞模式
s.settimeout() 設定阻塞套接字操作的超時時間
s.gettimeout() 得到阻塞套接字操作的超時時間
面向檔案的套接字的函式
s.fileno() 套接字的檔案描述符
s.makefile() 建立乙個與該套接字相關的檔案
那麼如何使用socket進行tcp通訊呢?
**示例:
1#2伺服器端import
socket
3 phone =socket.socket(socket.af_inet,socket.sock_stream)
4 phone.bind(("
192.168.16.2
",8800))
5 phone.listen(5)
6while
true:
7 con,addr =phone.accept()
8while
true:
9try
:10 datas = con.recv(1024)
11if
not datas : break
#應對服務死迴圈
12if(datas == b"
egon"):
13 con.send(b"sb"
)14else:15
con.send(datas)
16except
exception as e:
17break
18con.close()
19 phone.close()
1#2客戶端今天暫時寫到這裡,明天繼續import
socket
3 gophone =socket.socket(socket.af_inet,socket.sock_stream)
4 gophone.connect(("
192.168.16.2
",8800))
5while
true:
6 msg= input("
>>>:")
7ifnot msg : continue
8 gophone.send(msg.encode("
utf8"))
9print(gophone.recv(1024).decode("
gbk"))
socket程式設計 socket基本概念
socket socket可以看成是使用者程序與核心網路協議棧的程式設計介面,不僅可以用於本機的程序間通訊,也可以用於網路上不同主機的程序間通訊 而管道只能在同一臺主機進行通訊 應用層依靠socket進行資料傳輸,我們不必關心底層的核心,即底層資料的傳輸細節,只關心套介面的存在。可以把套介面看成程序...
socket概念通訊基石
socket起源於unix,而unix linux基本模式就是 一切皆檔案 都可以用 開啟open 讀寫write read 關閉close 模式來操作。socket也是該模式的實現,即 socket也是一種特殊的檔案,socket的api函式就是對socket物件進行檔案操作 讀 寫io 開啟 關...
網路程式設計 socket相關概念
socket介紹 socket位址 了解網路程式設計需要先了解計算機通訊中位元組的儲存順序 考慮32位機,cpu累加器一次能裝載4位元組。這4位元組在記憶體的排列順序影響被累加器裝載成的整數值。位元組序分為大端位元組序 big endian 和小端位元組序 little endian 傳送端總是要把...