第三課3 python網路編程
udp
udp網路程序-發送數據
- 創建客戶端套接字
- 發送/接收數據
- 關閉套接字
#coding=utf-8from socket import *#1. 創建套接字udpSocket = socket(AF_INET, SOCK_DGRAM)#2. 準備接收方的地址sendAddr = (192.168.1.103, 8080)#3. 從鍵盤獲取數據sendData = raw_input("請輸入要發送的數據:")#4. 發送數據到指定的電腦上udpSocket.sendto(sendData, sendAddr)#5. 關閉套接字udpSocket.close()
綁定埠號
#coding=utf-8from socket import *#1. 創建套接字udpSocket = socket(AF_INET, SOCK_DGRAM)#2. 綁定本地的相關信息,如果一個網路程序不綁定,則系統會隨機分配bindAddr = (, 7788) # ip地址和埠號,ip一般不用寫,表示本機的任何一個ipudpSocket.bind(bindAddr)#3. 等待接收對方發送的數據recvData = udpSocket.recvfrom(1024) # 1024表示本次接收的最大位元組數#4. 顯示接收到的數據print recvData#5. 關閉套接字udpSocket.close()from socket import *def main(): udpSocket = socket(AF_INET, SOCK_DGRAM) udpSocket.bind(("192.168.199.243", 6789)) # ip為空表示所有ip #收,列印 while True: recvInfor = udpSocket.recvfrom(1024) # print(recvInfor) print("[%s]:%s"%(str(recvInfor[1]), recvInfor[0].decode("gb2312")))if __name__ == "__main__": main()
聊天室:
from threading import Threadfrom socket import *#1. 收數據,然後列印def recvData(): while True: recvInfo = udpSocket.recvfrom(1024) print(">>%s:%s"%(str(recvInfo[1]), recvInfo[0]))#2. 檢測鍵盤,發數據def sendData(): while True: sendInfo = input("<<") udpSocket.sendto(sendInfo.encode("utf—8"), (destIp, destPort))udpSocket = NonedestIp = ""destPort = 0def main(): global udpSocket global destIp global destPort destIp = input("對方的ip:") destPort = int(input("對方的port:")) udpSocket = socket(AF_INET, SOCK_DGRAM) udpSocket.bind(("", 6789)) tr = Thread(target=recvData) ts = Thread(target=sendData) tr.start() ts.start() tr.join() ts.join()if __name__ == "__main__": main()
wireshark抓包工具使用
總結,如果是處理HTTP,HTTPS 還是用Fiddler,其他協議比如TCP,UDP 就用wireshark.
1、選擇網卡
2、很多數據,抓了很多廣播
TFTP
udp通信模型中,在通信開始之前,不需要建立相關的鏈接,只需要發送數據即可,類似於生活中,"寫信""
udp通信模型中,在通信開始之前,一定要先建立相關的鏈接,才能發送數據,類似於生活中,"打電話""
tcp伺服器的功能,需要的流程如下:
- socket創建一個套接字
- bind綁定ip和port
- listen使套接字變為可以被動鏈接
- accept等待客戶端的鏈接
- recv/send接收發送數據
一個很簡單的tcp伺服器如下:
#coding=utf-8from socket import *# 創建sockettcpSerSocket = socket(AF_INET, SOCK_STREAM)# 綁定本地信息address = (, 7788)tcpSerSocket.bind(address)# 使用socket創建的套接字默認的屬性是主動的,使用listen將其變為被動的,這樣就可以接收別人的鏈接了tcpSerSocket.listen(5)# 如果有新的客戶端來鏈接伺服器,那麼就產生一個新的套接字專門為這個客戶端伺服器# newSocket用來為這個客戶端服務# tcpSerSocket就可以省下來專門等待其他新客戶端的鏈接newSocket, clientAddr = tcpSerSocket.accept()# 接收對方發送過來的數據,最大接收1024個位元組recvData = newSocket.recv(1024)print 接收到的數據為:,recvData# 發送一些數據到客戶端newSocket.send("thank you !")# 關閉為這個客戶端服務的套接字,只要關閉了,就意味著為不能再為這個客戶端服務了,如果還需要服務,只能再次重新連接newSocket.close()# 關閉監聽套接字,只要這個套接字關閉了,就意味著整個程序不能再接收任何新的客戶端的連接tcpSerSocket.close()
tcp客戶端
#coding=utf-8from socket import *clientSocket = socket(AF_INET, SOCK_STREAM)clientSocket.connect(("192.168.199.139", 7788))#注意:# 1. tcp客戶端已經鏈接好了伺服器,所以在以後的數據發送中,不需要填寫對方的iph和port----->打電話# 2. udp在發送數據的時候,因為沒有之前的鏈接,所依需要 在每次的發送中 都要填寫接收方的ip和port----->寫信 clientSocket.send("haha".encode("gb2312"))recvData = clientSocket.recv(1024)print("recvData:%s"%recvData)clientSocket.close()
packet tracer
每台pc都會有一個arp緩存表,用來記錄IP所對應的的MAC
arp -a(all) arp -d(del) route print
路由器雙網卡
每經過一次路由器,那麼TTL值就會減一
有了ip為何要有mac地址?
不同路由器mac會變(經過節點多了認不到),ip地址通信過程不會變化
訪問百度:
三次握手
tcp會回答ack確認,所以穩定,udp發了不管
短連接:瀏覽器,發一個東西就3次握手關閉(頁面)
長連接:優酷,發很多次數據才握手關閉(視頻)
推薦閱讀:
※Python 官方的第三方軟體存儲庫——PyPI 上發現10個惡意庫
※U.S Pollution Data
※入門:用Python抓取網頁上的免費賬號(五)
※深入描述符