Python爬蟲 socket庫實踐——模擬連接發送接收數據

Python爬蟲(八)

學習Python爬蟲過程中的心得體會以及知識點的整理,方便我自己查找,也希望可以和大家一起交流。

—— socket庫實踐 模擬連接發送接收數據 ——

1.基於TCP協議的模擬服務端

  1. 引入socket庫。

    import socket
    
  2. 設置socket,主機和端口,並將主機名和端口綁定在一起,同時開啓偵聽。

    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    host = socket.gethostname()
    port = 1234
    s.connect((host, port))
    s.listen(5)
    
  3. 設置一個循環,確保可以接受多個申請。

    while True:
    	connection, address = s.accept()
    	print ('Got connection from', address)
    
  4. 可以設置Socket超時時間。

    	connection.settimeout(5)
    
  5. 設置接受數據,並規定接受數據的長度,防止接收包過大。

    	buf = connection.recv(1024)
    
  6. 轉換類型,由於Python 3 的新規定,發送的必須是bytes類型,所以我們需要把str類型轉換爲bytes。

    	str1 ='Thank you for connecting'
    	str1 = str1.encode()
    	str2 ='Go away!'
    	str2 = str2.encode()
    	str3 ='1'
    	str3 = str3.encode()
    
  7. 繼續循環,進行判斷,依據接收數據判斷返回數據。

    	if buf == str3:
        	connection.send(str1)
        else:
        	connection.send(str2)
    	connection.close()
    s.close()
    

2.基於TCP協議的模擬客戶端訪問服務端

  1. 引入socket庫和time庫。

    import socket
    import time
    
  2. 設置socket,主機和端口,並將主機名和端口綁定在一起確定發送目標。

    s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    host = socket.gethostname()
    port = 1234
    s.connect((host, port))
    
  3. 轉換類型,由於Python 3 的新規定,發送的必須是bytes類型,所以我們需要把str類型轉換爲bytes。

    str01 = '1'
    str01 = str01.encode()
    
  4. 設置發送睡眠間隔時間

    time.sleep(1)
    
  5. 發送數據,並將接收的數據打印出來。

    s.send(str01)
    print (s.recv(1024))
    s.close()
    

效果演示:

  1. 啓動服務端,並開始接收數據。
    socket庫實踐
  2. 啓動客戶端,併發送數據。
    socket庫實踐
  3. 可以看到返回數據和接收數據都是成功的,並且此時服務端依然還在運行。
    socket庫實踐

3.基於UDP協議的模擬服務端

  1. 大部分和基於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協議的模擬客戶端訪問服務端

  1. 大部分和基於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()
    

效果演示:

  1. 啓動服務端,並開始接收數據。
    socket庫實踐
  2. 啓動客戶端,併發送數據。
    socket庫實踐
  3. 服務端也接收到客戶端的數據了。

socket庫實踐

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章