什麼是socket
socket是應用層與tcp/ip協議族通訊的中間軟體抽象層,它是一組介面。在設計模式中,socket其實就是乙個門面模式,它把複雜的tcp/ip協議族隱藏在socket介面後面,對使用者來說,一組簡單的介面就是全部,讓socket去組織資料,以符合指定的協議。
所以,我們無需深入理解tcp/udp協議,socket已經為我們封裝好了,我們只需要遵循socket的規定去程式設計,寫出的程式自然就是遵循tcp/udp標準的。
基於檔案型別的套接字家族
套接字家族的名字:af_unix
unix一切皆檔案,基於檔案的套接字呼叫的就是底層的檔案系統來取資料,兩個套接字程序執行在同一機器,可以通過訪問同乙個檔案系統間接完成通訊
基於網路型別的套接字家族
套接字家族的名字:af_inet
(還有af_inet6被用於ipv6,還有一些其他的位址家族,不過,他們要麼是只用於某個平台,要麼就是已經被廢棄,或者是很少被使用,或者是根本沒有實現,所有位址家族中,af_inet是使用最廣泛的乙個,python支援很多種位址家族,但是由於我們只關心網路程式設計,所以大部分時候我麼只使用af_inet)
套接字函式用法
服務端套接字函式重啟服務端可能出現的錯誤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配置,重用ip和埠基於tcp的套接字模擬打**phone=socket(af_inet,sock_stream)
phone.setsockopt(sol_socket,so_reuseaddr,1) #就是它,在bind前加
phone.bind(('127.0.0.1',8080))
服務端
import socket客戶端# 1.先買手機
phone = socket.socket(socket.af_inet,socket.sock_stream) # socket.sock_stream指的是tcp協議
# 2.繫結**卡
# phone.setsockopt(socket.sol_socket,socket.so_reuseaddr,1) # 就是它,在bind前加,防止作業系統未及時清理鏈結,導致埠被占用的問題
phone.bind(('127.0.0.1',8080)) # 埠範圍0-65535,1-1024系統占用
# 3.開機
phone.listen(5)
# 4.等**
print('starting....')
while true: # 鏈結迴圈
conn,addr = phone.accept() # (conn,client_addr)
# print('*****====>')
# print(conn,addr)
# 5.收發訊息
while true: # 通訊迴圈
try:
# print('*****===>ready recv')
data = conn.recv(1024) # 1024最大接收的位元組數
conn.send(data.upper())
except connectionreseterror:
break
# 6.掛**
conn.close()
# 7.關機
phone.close()
import socket# 1.先買手機
phone = socket.socket(socket.af_inet,socket.sock_stream) # socket.sock_stream指的是tcp協議
# 2.打**
phone.connect(('127.0.0.1',8080))
# 3.發收訊息
while true:
msg = input('>>:').strip()
if not msg:continue
phone.send(msg.encode('utf-8'))
data = phone.recv(1024)
print(data.decode('utf-8'))
# 4.關閉
phone.close()
socket程式設計
一直以為serversocket accept之後客戶端才能發資訊,實驗後得出如下結論 1 serversocket沒有accept時,client是可以傳送資訊到server端的。2 serversocket accept之後,正在處理訊息時,client也是可以傳送資訊到server端。如果se...
Socket程式設計
對tcp ip udp socket程式設計這些詞你不會很陌生吧?隨著網路技術的發展,這些詞充斥著我們的耳朵。那麼我想問 1.什麼是tcp ip udp?2.socket在 呢?3.socket是什麼呢?4.你會使用它們嗎?什麼是tcp ip udp?tcp ip transmission cont...
socket程式設計
建立socket 建立乙個 socket,它可用於在基於 tcp ip 的網路 如 internet 上通訊。socket s new socket addressfamily.internetwork,sockettype.stream,protocoltype.tcp 若要使用 udp 而不是 ...