socket程式設計

2022-06-19 11:09:10 字數 3538 閱讀 2005

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