socket是基於c/s架構的,也就是說進行socket網路程式設計,通常需要編寫兩個py檔案,乙個服務端,乙個客戶端。
首先,匯入python中的socket模組: import socket
python中的socket通訊邏輯如下圖所示
這張邏輯圖,是整個socket程式設計中的重點.
在python中,import socket
後,用socket.socket()
方法來建立套接字,語法格式如下:
sk = socket.socket([family[, type[, proto]]])引數說明:
直接socket.socket(),則全部使用預設值。
下面是具體的引數定義:
socket型別
描述socket.af_unix
只能夠用於單一的unix系統程序間通訊
socket.af_inet
ipv4
socket.af_inet6
ipv6
socket.sock_stream
流式socket , for tcp
socket.sock_dgram
資料報式socket , for udp
socket.sock_raw
原始套接字,普通的套接字無法處理icmp、igmp等網路報文,而sock_raw可以;其次,sock_raw也可以處理特殊的ipv4報文;此外,利用原始套接字,可以通過ip_hdrincl套接字選項由使用者構造ip頭。
socket.sock_seqpacket
可靠的連續資料報服務
建立tcp socket:
s=socket.socket(socket.af_inet,socket.sock_stream)
建立udp socket:
s=socket.socket(socket.af_inet,socket.sock_dgram)
通過s = socket.socket()
方法,我們可以獲得乙個socket物件s,也就是通常說的獲取了乙個「套接字」,該物件具有一下方法:
方法描述
伺服器端方法
s.bind()
繫結位址(host,port)到套接字,在af_inet下,以元組(host,port)的形式表示位址。
s.listen(backlog)
開始監聽。backlog指定在拒絕連線之前,作業系統可以掛起的最大連線數量。該值至少為1,大部分應用程式設為5就可以了。
s.accept()
被動接受客戶端連線,(阻塞式)等待連線的到來,並返回(conn,address)二元元組,其中conn是乙個通訊物件,可以用來接收和傳送資料。address是連線客戶端的位址。
客戶端方法
s.connect(address)
客戶端向服務端發起連線。一般address的格式為元組(hostname,port),如果連線出錯,返回socket.error錯誤。
s.connect_ex()
connect()函式的擴充套件版本,出錯時返回出錯碼,而不是丟擲異常
公共方法
s.recv(bufsize)
接收資料,資料以bytes型別返回,bufsize指定要接收的最大資料量。
s.send()
傳送資料。返回值是要傳送的位元組數量。
s.sendall()
完整傳送資料。將資料傳送到連線的套接字,但在返回之前會嘗試傳送所有資料。成功返回none,失敗則丟擲異常。
s.recvform()
接收udp資料,與recv()類似,但返回值是(data,address)。其中data是包含接收的資料,address是傳送資料的套接字位址。
s.sendto(data,address)
傳送udp資料,將資料data傳送到套接字,address是形式為(ipaddr,port)的元組,指定遠端位址。返回值是傳送的位元組數。
s.close()
關閉套接字,必須執行。
s.getpeername()
返回連線套接字的遠端位址。返回值通常是元組(ipaddr,port)。
s.getsockname()
返回套接字自己的位址。通常是乙個元組(ipaddr,port)
s.setsockopt(level,optname,value)
設定給定套接字選項的值。
s.getsockopt(level,optname[.buflen])
返回套接字選項的值。
s.settimeout(timeout)
設定套接字操作的超時期,timeout是乙個浮點數,單位是秒。值為none表示沒有超時期。一般,超時期應該在剛建立套接字時設定,因為它們可能用於連線的操作(如connect())
s.gettimeout()
返回當前超時期的值,單位是秒,如果沒有設定超時期,則返回none。
s.fileno()
返回套接字的檔案描述符。
s.setblocking(flag)
如果flag為0,則將套接字設為非阻塞模式,否則將套接字設為阻塞模式(預設值)。非阻塞模式下,如果呼叫recv()沒有發現任何資料,或send()呼叫無法立即傳送資料,那麼將引起socket.error異常。
s.makefile()
建立乙個與該套接字相關連的檔案
注意事項:
python3以後,socket傳遞的都是bytes型別的資料,字串需要先轉換一下,string.encode()
即可;另一端接收到的bytes資料想轉換成字串,只要bytes.decode()
一下就可以。
在正常通訊時,accept()
和recv()
方法都是阻塞的。所謂的阻塞,指的是程式會暫停在那,一直等到有資料過來。
服務端:
建立套接字,繫結套接字到本地ip與埠:socket.socket(socket.af_inet,socket.sock_stream) , s.bind()
開始監聽連線:s.listen()
進入迴圈,不斷接受客戶端的連線請求:s.accept()
接收傳來的資料,或者傳送資料給對方:s.recv() , s.sendall()
傳輸完畢後,關閉套接字:s.close()
客戶端:
連線後傳送資料和接收資料:s.sendall(), s.recv()
傳輸完畢後,關閉套接字:s.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 而不是 ...