python標準庫之【socket】
socket通常也稱作”套接字“。網絡上的兩個程序通過一個雙向的通信連接實現數據的交換,這個連接的一端稱為一個socket。socket 是網絡連接端點。例如當你的Web瀏覽器請求www.fishc.com上的主頁時,你的Web瀏覽器創建一個socket並命令它去連接 www.fishc.com的Web服務器主機,Web服務器也對來自的請求在一個socket上進行監聽。兩端使用各自的socket來發送和 接收信息。
socket模塊提供了幾個函數用於使用主機名和地址來工作: gethostname() 返回運行程序所在的計算機的主機名:
- #>>> import socket
- #>>> socket.gethostname()
- #‘李嘉圖的計算機‘
- #>>>
gethostbyname(name) 嘗試將給定的主機名解釋為一個IP地址
- #>>> #socket.gethostbyname(‘www.fishc.com‘)
- #‘101.37.44.185‘
- #>>> socket.gethostbyname(‘李嘉圖的計算機‘)
- #‘192.168.1.104‘
- #>>>
ps:首先將檢查當前計算機是否能夠解釋。如果不能,一個解釋請求將發送給一個遠程的DNS服務器(遠程的DNS服務器 還可能將解釋請求轉發給另一個DNS服務器,直到該請求可以被處理)。gethostbyname函數返回這個IP地址或在查找失敗後引發一個異常。 拓展; gethostbyname_ex(name)
- >>> #>>>socket.gethostbyname_ex(‘www.fishc.com‘)
- #(‘bbgaws7ldwotai4akucb7ckfsnvzoz6m.aliyunwaf.com‘, [‘www.fishc.com‘], [‘101.37.44.185‘])
gethostbyaddr(address)函數的作用與gethostbyname_ex相同,只是你提供給它的參數是一個IP地址字符串
- #>>>socket.getservbyname(‘http‘,‘tcp‘)
- #80
- #>>>socket.getservbyname(‘telnet‘,‘tcp)
- #23
socket通信 import socket
1. socket()
- 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對象,
示例:
- sk = socket.socket()
- address = (‘127.0.0.1‘,9080)
- sk.bind(address)
- sk.listen(5)
- conn,addr = sk.accept()
- print(sk)
- print(conn)
- print(addr)
- 輸出結果:
- <socket.socket fd=3, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=(‘127.0.0.1‘, 9080)>
- <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)>
- (‘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模塊進行通信 服務端:
- sk = socket.socket()
- address = (‘127.0.0.1‘,9080)
- sk.bind(address)
- sk.listen(5)
- conn,addr = sk.accept()
- data = conn.recv(1024)
- print(str(data,‘utf8‘))
客戶端:
- sk = socket.socket()
- address = (‘127.0.0.1‘,9080)
- sk.connect(address)
- inp = input(‘>>‘)
- sk.send(bytes(inp,‘utf8‘))
python標準庫之【socket】