天天看點

python socket用戶端_python socket 常見方法及 簡單服務/用戶端

socket 常見方法:

補充說明:what is file descriptor? 檔案描述符是什麼?

參考(http://stackoverflow.com/questions/8191905/whats-is-difference-between-file-descriptor-and-file-pointer)

File pointer:

It is high level interface

Passed to fread() and fwrite() functions

Includes buffering,error indication and EOF detection,etc.

Provides higher portability and efficiency.

File descriptor:

Low/Kernel level handler

passe to read() and write() of UNIX System Calls

Doesn't include buffering and such features

Less portable and lacks efficiency

socket.accept() ,接受一個連接配接,但前提是socket必須已經綁定了一個位址,在等待連接配接。傳回值是一個(conn, addresss)的值對,這裡的conn是一個socket對象,可以用來改送或接收資料.而address是連接配接另一端綁定的位址,socket.getpeername()函數也能傳回該位址。

socket.bind(address),将socket對象綁定到一個位址,但這個位址必須是沒有被占用的,否則會連接配接失敗。這裡的address一般是一個ip,port對,如(‘localhost’, 10000)

socket.close(),關閉連接配接,當socket.close()執行時,與這個連接配接相關的底層操作也會關閉(如檔案描述符),一旦關閉,再對相關的檔案對象操作都會失敗。

socket.connect(address),連接配接到一個address對應的遠端socket。如果連接配接被中斷,這個方法會等待直到連接配接完成,或者會抛出socket.timeout錯誤(逾時)

socket.connect_ex(address), 類似與connect(address),但是當遇到c語言層的異常時,并不會抛出異常,而是傳回一個錯誤訓示器。但其他異常如host not found還是會抛出異常,操作成功時,錯誤訓示器的值是0,否則是不确定的值。

如:

>>> import socket

>>> s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

>>> s.connect_ex(('localhost', 1024))

111

socket.detach(),将socket 對象設定為關閉狀态,但底層的檔案描述符并沒關閉,仍可以進行操作,傳回值為檔案描述符。

socket.dup(), 複制一個socket

socket.fileno(),傳回檔案描述符(一個很小的整數),如果失敗傳回-1.win系統上,傳回的個整數不能用在如os.fdopen()方法。

socket.get_inheritable(),測試socket是否可以繼承,True或者False

socket.getpeername() , 傳回目前socket連接配接的遠端位址

socket.getsockname(), 傳回socket自己的位址,如:

>>> s.bind(('localhost', 10000))

>>> s.getsockname()

('127.0.0.1', 10000)

socket.gettimeout(), 傳回逾時值,機關是秒,沒有設定傳回None.

>>> s.gettimeout()

>>> print(s.gettimeout())

None

>>>

socket.listen([backlog]), 監聽,使得伺服器能接收服務端連接配接,如果backlog指定了(最少是0,如果比0小,系統預設改成0),限制可以連接配接的數量,如果沒有指定,将指派一個預設的合理值。

socket.makefile(mode='r', buffering=None, *, encoding=None, errors=None,newline=None), 傳回一個檔案對象,具體類型與參數相關,除了隻能指定‘r’,‘w’,'b'模式外,與open()函數一樣.

前提條件是socket必須是阻塞模式,它可以含有一個逾時間(指socket),如果發生逾時,内部緩沖區會在不一緻的狀态中關閉。

關閉檔案對象不會關閉socket,除非調用了socket.close()方法,或者所有其他檔案對象都關閉了。

注意:在win上,makefile建立的一個類檔案對象在需要檔案描述符的檔案對象的情況下是無法使用的(意思大概是makefile建立的檔案對象沒有檔案描述符)

socket.recv(bufsize[, flags]),從socket接收資料,注意是byte類型,bufsize指定一次最多接收的資料大小,

socket.recvfrom(bufsize[, flags]) ,與上一個方法的差別是傳回值除了資料還有發送資料的位址,傳回值是一個資料,位址對(data, address)

socket.recvmsg(bufsize[, ancbufsize[, flags]]),接收正常檔案,附件等。ancbufsize設定附件接收緩沖區,類似于bufsize。但傳回值是有四個元素的元組()。(data, ancdata, msg_flags, address). ancdata是一個含有四個0的清單或者是(cmsg_level, cmsg_type, cmsg_data)這樣的清單。

socket.send(bytes[,flags]), 發送資料到socket,前提是已經連接配接到遠端socket,傳回值是發送資料的量,檢查資料是否發送完是應用的責任

socket.sendall(bytes[,flags]), 同上,與send不同的是,它會一直發送完為止,或者發生了錯誤,導緻異常。發送成功傳回None

socket.sendto(bytes, flags, address), 基本與socket.send()相同

socket.sendmsg()對應上面的socket.recvmsg()

待續。。。

python socket用戶端_python socket 常見方法及 簡單服務/用戶端

繼續閱讀