標籤:host 轉換 end http 雙向 沒有 accept 資料包 網域名稱
Socket
# 用一個 Socke t表示“開啟了一個網路連接”# 開啟一個 Socket 需要知道目標電腦的IP地址和連接埠號碼,再指定協議類型即可。# TCP# 主動發起串連的是用戶端,被動相應的是伺服器# 1. 建立一個基於 TCP 串連的socketimport sockets = socket.socket(socket.AF_INET, socket.SOCK_STREAM)# AF_INET 指 IPv4 協議。SOCK_STREAM 指面向流的 TCP 協議。# 初始化了一個 socket 執行個體,還沒有建立串連# 2. 串連到伺服器# connect 接受的參數是一個 tuple:(ip, port)。輸入欄位名可以通過DNS自動轉換為IP地址。s.connect(('www.sina.com.cn',80))# 3. 發送資料 send# 下列資料的意思是:請求返回首頁的內容# TCP串連建立的是雙向通道,雙方都可以同時給對方發資料。但是誰先發誰後發,怎麼協調,要根據具體的協議來決定。例如,HTTP協議規定用戶端必須先發請求給伺服器,伺服器收到後才發資料給用戶端。s.send(b'GET / HTTP/1.1\r\nHost: www.sina.com.cn\r\nConnection: close\r\n\r\n')# 4. 接受伺服器發來的資料# 發送完 HTTP 格式請求後,接下來就可以接收新浪伺服器返回的資料了:buffer = []while True: d = s.recv(1024) # 1KB if d: buffer.append(d) else: # 資料讀取完畢或者串連中斷,返回 empty string breakdata = b''.join(buffer) # 這句語句的意思就是使用空位元組把 buffer 這個位元組列表串連在一起,成為一個新的位元組串# b''是一個空位元組,join是串連列表的函數,buffer是一個不斷接受到的串的列表# 例如把[b'ab',b'cd',b'ef']變成 b'abcdef'# 5. 接受完資料,關閉 sockets.close()# 接收到的資料包括HTTP頭和網頁本身# 我們只需要把HTTP頭和網頁分離一下,把HTTP頭列印出來,網頁內容儲存到檔案:header, html = data.split(b'\r\n\r\n',1)print(header.decode('utf-8'))with open('sina.html','wb') as file: file.write(html)
伺服器
# 1. 伺服器處理序綁定一個連接埠,監聽來自用戶端的串連# 四元組來唯一確定一個 socket# 因為伺服器要同時相應多個用戶端的請求,所以,每次串連都需要一個新的進程或者線程來處理。# 我們來編寫一個簡單的伺服器程式,它接收用戶端串連,把用戶端發過來的字串加上Hello再發回去。import sockets = socket.socket(socket.AF_INET, socket.SOCK_STREAM)# 監聽連接埠# 綁到本地地址,連接埠號碼9999# 127.0.0.1是一個特殊的IP地址,表示本機地址,如果綁定到這個地址,用戶端必須同時在本機運行才能串連,也就是說,外部的電腦無法串連進來。s.bind(('127.0.0.1', 9999))# 調用listen()方法開始監聽連接埠,傳入的參數指定等待串連的最大數量:s.listen(5)print('Waiting for connection...')# 伺服器程式通過一個永久迴圈來接受來自用戶端的串連# accept()會等待並返回一個指示用戶端串連的socket 和用戶端 ip 地址:import threadingimport timedef tcplink(sock, addr): print('Accept new connection from %s...' % addr) sock.send(b'Welcome!') while True: data = sock.recv(1024) time.sleep(1) if not data or data.decode('utf-8') == 'exit': break sock.send(('Hello, %s!' % data.decode('utf-8')).encode('utf-8')) sock.close() print('Connection from %s closed.' % addr)while True: # 接受一個新串連: sock, addr = s.accept() # 建立新線程來處理TCP串連: t = threading.Thread(target=tcplink, args=(sock, addr)) t.start()
用戶端
import sockets = socket.socket(socket.AF_INET, socket.SOCK_STREAM)# 建立串連:s.connect(('127.0.0.1', 9999))# 接收歡迎訊息:print(s.recv(1024).decode('utf-8'))for data in [b'Chang', b'KangKang', b'Wangbin']: # 發送資料: s.send(data) print(s.recv(1024).decode('utf-8'))s.send(b'exit')s.close()
python learning Network Programming.py