1. 程式人生 > >python標準庫之【socket】

python標準庫之【socket】

yun lock .cn 函數返回 targe ddr 是個 進程間的通信 log

socket通常也稱作”套接字“。網絡上的兩個程序通過一個雙向的通信連接實現數據的交換,這個連接的一端稱為一個socket。socket 是網絡連接端點。例如當你的Web瀏覽器請求www.fishc.com上的主頁時,你的Web瀏覽器創建一個socket並命令它去連接 www.fishc.com的Web服務器主機,Web服務器也對來自的請求在一個socket上進行監聽。兩端使用各自的socket來發送和 接收信息。
socket模塊提供了幾個函數用於使用主機名和地址來工作: gethostname() 返回運行程序所在的計算機的主機名:

  1. #>>> import socket
  2. #>>> socket.gethostname()
  3. #‘李嘉圖的計算機‘
  4. #>>>
復制代碼

gethostbyname(name) 嘗試將給定的主機名解釋為一個IP地址

  1. #>>> #socket.gethostbyname(‘www.fishc.com‘)
  2. #‘101.37.44.185‘
  3. #>>> socket.gethostbyname(‘李嘉圖的計算機‘)
  4. #‘192.168.1.104‘
  5. #>>>
復制代碼

ps:首先將檢查當前計算機是否能夠解釋。如果不能,一個解釋請求將發送給一個遠程的DNS服務器(遠程的DNS服務器 還可能將解釋請求轉發給另一個DNS服務器,直到該請求可以被處理)。gethostbyname函數返回這個IP地址或在查找失敗後引發一個異常。 拓展; gethostbyname_ex(name)

返回一個包含三個元素的元組 : (給定地址的主要的主機名同一IP地址的可選的主機名的一個列,同一主機的同一接口的其它IP地址的一個列表)

  1. >>> #>>>socket.gethostbyname_ex(‘www.fishc.com‘)
  2. #(‘bbgaws7ldwotai4akucb7ckfsnvzoz6m.aliyunwaf.com‘, [‘www.fishc.com‘], [‘101.37.44.185‘])
復制代碼

gethostbyaddr(address)函數的作用與gethostbyname_ex相同,只是你提供給它的參數是一個IP地址字符串

getservbyname(service,protocol)函數要求一個服務名(如‘telnet‘或‘ftp‘)和一個協議(如‘tcp‘或‘udp‘),返回服務所使用的端口號:

  1. #>>>socket.getservbyname(‘http‘,‘tcp‘)
  2. #80
  3. #>>>socket.getservbyname(‘telnet‘,‘tcp)
  4. #23
復制代碼

socket通信 import socket
1. socket()

  1. socket.socket(family=AF_INET, type=SOCK_STREAM, proto=0, fileno=None)
復制代碼

(1)family = AF_INET表示服務器之間的通信。

(2)fmily = AF_UNIX表示Unix不同進程間的通信。

(3)type = SOCK_STREAM表示TCP連接。

(4)type = SOCK_DGRAM 表示UDP連接。

ps: 2, 3, 4 方法用於服務端 2. bind()
sk.bind(address)
將地址與socket綁定。address(host IP,端口號),address必須是個元組。

3. listen()
listen(backlog)
監聽客戶端的連接。backlog為可選參數,表示最大等待連接數量。

4.accept()
接受連接並返回(conn,address)。其中conn表示客戶端的sk對象,
示例:

  1. sk = socket.socket()
  2. address = (‘127.0.0.1‘,9080)
  3. sk.bind(address)
  4. sk.listen(5)
  5. conn,addr = sk.accept()
  6. print(sk)
  7. print(conn)
  8. print(addr)
  9. 輸出結果:
  10. <socket.socket fd=3, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=(‘127.0.0.1‘, 9080)>
  11. <socket.socket fd=4, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=(‘127.0.0.1‘, 9080), raddr=(‘127.0.0.1‘, 35066)>
  12. (‘127.0.0.1‘, 35066)
復制代碼

5.recv()
sk.recv(bufsize)
接收數據。其中bufsize表示最大可接收的數據大小。

6.connect()
sk.connect(address)
連接指定地址的socket。address用元組表示。

7.send()
sk.send(data)
將data發送給連接的socket。

8.sendall()
與send類似,內部通過遞歸調用send()方法,嘗試將所有數據發送出去。
9.sendto()
sk.sendto(data,addr) 可指定遠端地址

notice! TCP(SOCK_STREAM),需要連接到遠程主機才可以發送數據,發送數據用send(b‘字符‘) UDP(SOCK_DGRAM),不需要連接,直接發送數據,發送數據用sendto(b‘字符‘,(ip,port))
10.settimeout(timeout)
設置超時。

11.getpeername()
返回遠端socket的地址(address,port)。

12.getsockname()
返回自己的socket地址(address,port)。

13.fileno()
套接字的文件描述符。

示例: 利用socket模塊進行通信 服務端:

  1. sk = socket.socket()
  2. address = (‘127.0.0.1‘,9080)
  3. sk.bind(address)
  4. sk.listen(5)
  5. conn,addr = sk.accept()
  6. data = conn.recv(1024)
  7. print(str(data,‘utf8‘))
復制代碼

客戶端:

  1. sk = socket.socket()
  2. address = (‘127.0.0.1‘,9080)
  3. sk.connect(address)
  4. inp = input(‘>>‘)
  5. sk.send(bytes(inp,‘utf8‘))
復制代碼

技術分享

python標準庫之【socket】