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


socket 常見方法:

補充說明:what is file descriptor? 文件描述符是什么?

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

File pointer:

  1. It is high level interface
  2. Passed to fread() and fwrite() functions
  3. Includes buffering,error indication and EOF detection,etc.
  4. Provides higher portability and efficiency.

File descriptor:

  1. Low/Kernel level handler
  2. passe to read() and write() of UNIX System Calls
  3. Doesn't include buffering and such features
  4. 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()

 待續。。。

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM