socket程式設計

2022-05-29 20:57:09 字數 3230 閱讀 3040

什麼是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和埠

phone=socket(af_inet,sock_stream)

phone.setsockopt(sol_socket,so_reuseaddr,1) #就是它,在bind前加

phone.bind(('127.0.0.1',8080))

基於tcp的套接字模擬打**

服務端

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 而不是 ...