Python爬蟲(八)
學習Python爬蟲過程中的心得體會以及知識點的整理,方便我自己查找,也希望可以和大家一起交流。
—— socket庫實踐 模擬連接發送接收數據 ——
文章目錄
1.基於TCP協議的模擬服務端
-
引入socket庫。
import socket
-
設置socket,主機和端口,並將主機名和端口綁定在一起,同時開啓偵聽。
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) host = socket.gethostname() port = 1234 s.connect((host, port)) s.listen(5)
-
設置一個循環,確保可以接受多個申請。
while True: connection, address = s.accept() print ('Got connection from', address)
-
可以設置Socket超時時間。
connection.settimeout(5)
-
設置接受數據,並規定接受數據的長度,防止接收包過大。
buf = connection.recv(1024)
-
轉換類型,由於Python 3 的新規定,發送的必須是bytes類型,所以我們需要把str類型轉換爲bytes。
str1 ='Thank you for connecting' str1 = str1.encode() str2 ='Go away!' str2 = str2.encode() str3 ='1' str3 = str3.encode()
-
繼續循環,進行判斷,依據接收數據判斷返回數據。
if buf == str3: connection.send(str1) else: connection.send(str2) connection.close() s.close()
2.基於TCP協議的模擬客戶端訪問服務端
-
引入socket庫和time庫。
import socket import time
-
設置socket,主機和端口,並將主機名和端口綁定在一起確定發送目標。
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) host = socket.gethostname() port = 1234 s.connect((host, port))
-
轉換類型,由於Python 3 的新規定,發送的必須是bytes類型,所以我們需要把str類型轉換爲bytes。
str01 = '1' str01 = str01.encode()
-
設置發送睡眠間隔時間
time.sleep(1)
-
發送數據,並將接收的數據打印出來。
s.send(str01) print (s.recv(1024)) s.close()
效果演示:
- 啓動服務端,並開始接收數據。
- 啓動客戶端,併發送數據。
- 可以看到返回數據和接收數據都是成功的,並且此時服務端依然還在運行。
3.基於UDP協議的模擬服務端
- 大部分和基於TCP的一樣,但是要注意,UDP不需要三次握手,所以不需要listen和accept,也要注意發送數據的類型是bytes。
#coding:utf-8 import socket s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) host = socket.gethostname() port = 1234 s.bind((host, port)) while True: recv,client_addr = s.recvfrom(1024) if not recv: break print('[Client %s:%s said]:%s' % (client_addr[0],client_addr[1],recv)) str1 ='tcpServer has received your message' str1 = str1.encode() s.sendto(str1,client_addr)
4.2.基於UDP協議的模擬客戶端訪問服務端
-
大部分和基於TCP的一樣,但是要注意,UDP不需要三次握手,所以不需要listen和accept,也要注意發送數據的類型是bytes。
import socket import time s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) host = socket.gethostname() port = 1234 s.connect((host, port)) str01 = '1' str01 = str01.encode() time.sleep(1) s.send(str01) print (s.recv(1024)) s.close()
效果演示:
- 啓動服務端,並開始接收數據。
- 啓動客戶端,併發送數據。
- 服務端也接收到客戶端的數據了。