python网络编程难点_python之路网络编程总结(三)
2018-9-22 20:58:25
1. 端口
1.1知名端口是眾所周知的端口,范圍從0-1023
例: 80端口分配給HTTP服務
21 端口分配給FTP服務
1.2動態端口 : 范圍從1024 - 65535
2. 什么是socket?
socket(簡稱 套接字) 是進程間通信的一種方式,它與其他進程間通信的一個主要不同的是:
它能實現不同主機間的進程間通信,我們網絡上各種各樣的服務器大多都是基于Socket來完成
通訊的
#創建一個tcp socket (tcp套接字)
importsocket
socket=socket.socket(socket.AF_INET, socket.SOCK_STREAM)print("Socket Created")
創建一個udp socket(udp套接字)importsocket
socket=socket.socket(socket.AF_INET, socket.SOCKET_DGRAM)print("Socket Created")
3. 一個多線程QQ聊天Demo
from threading importThreadfrom socket import *
#1.接收數據,然后打印
defrecvDate():whileTrue:
recvInfo= udpSocket.recvfrom(1024)print(">>%s:%s"%(str(recvInfo[1]),recvInfo[0]))#2.檢測鍵盤,發送數據
defsendDate():whileTrue:
sendInfo= input("<<")
udpsocket.sendto(sendInfo.endcode("gb2312"),(destIp,destPort))
udpSocket=None #存儲對象時默認為None
destIp = ""destPort=0defmain():globaludpSocketglobaldestIpglobaldestPost#創建udp套接字
destIp = input("對方的IP:")
destPort= input(("對方的接口"))
udpSocket=socket(AF_INET,SOCK_DGRAM)
udpSocket.bind(("",4567))#創建兩個線程
tr = Thread(target=recvDate())
ts= Thread(target=sendDate())
tr.start()
ts.start()
tr.join()
ts.join()if __name__ == "__main__":
main()
4.socket 的客戶端與服務端
#服務端端:
from socket import *
#tcp參數是SOCK_STREAM
socket =socket.socket(AF_INET, SOCK_STREAM)#綁定IP和端口
socket.bind("127.0.0.1",8080)#監聽端口
socket.listen(5)#返回是一個元組, 接受 新的客戶端, addr 表示 新的客戶端的IP和port
conn, addr =socket.accept()
recv= conn.recv(1024)#像IO操作一樣,執行完畢后關閉:
conn.close()
socket.close()#tcp 客戶端
from socket import *
#創建一個套接字
socket =socket(AF_INET,SOCK_STREAM)
socket.connect(("127.0.0.1",8000))#發送消息#注意:#1.tcp客戶端已經連接好了服務器,所以在喲戶的數據發送中,不需要填寫對方的ip和port-->打電話#2.udp在發送數據的時候,因為沒有之前的連接,所依需要,在每次的發送中,都要填寫接受方的ip和port---->寫信
socket.send("haha".encode("gb2312"))#接收消息
recv = socket.recv(1024)
socket.close()
5.TCP部分內容
TCP的三次握手!!!!!!!
關于TCP的三次握手 參考連接:https://0x9.me/JB3NX https://0x9.me/L5XlQ
OSI模型:就是七層物理層
ICMP: 我ping你的時候要用,不僅要知道ip地址和網卡號mac地址
ARP : 在我和你通訊前不知道的mac地址需要廣播一下,當我說的是你的時候就回消息!獲取mac地址(根據ip找mac)
rarp :根據mac地址找IP
路由器:能夠鏈接不同的網絡使他們之間能夠通信
mac:就是手拉手傳輸數據用的
DNS : 解析域名
DHCP:一種協議,自動分配ip 發現局域網中沒有ip的電腦分配ip
短連接:數據少,直接發送
長連接:持續發送據,視頻網站
6. 面試題: 訪問百度的整個過程
打開瀏覽器,訪問百度的過程:
1.我的電腦確定有無網關,arp得到默認網管mac地址, 如果用IP訪問 三次握手,客戶端發送請求數據,對方返回數據
2. 域名訪問:
1.先要解析出baidu.com對應的ip地址
1.1先知道默認網關的mac
1.1.1使用arp獲取默認網管的mac地址
2.組織數據 發送給默認網關(ip還是dns的ip,但是mac地址是默認網關的地址)
3.默認網關擁有轉發數據的能力,把數據轉發給路由器
4.路由器根據自己的路由協議,來選擇一個適合的較快路徑轉發數據給目的網關
5.目的網關(dns服務器所在的網關),把數據轉發給dns服務器
6.dns服務器查詢解析出baidu.com對應的ip地址,并發它原路返回,請求這個域名的client
2.得到了baidu.com對應的IP地址之后,會發送tcp的3次握手,進行連接
3.使用http協議發送請求數據給web服務器
4.web服務器收到數據請求后,通過查詢自己的服務器得到相應的結果,原路返回給瀏覽器
5.瀏覽器接收到數據后,通過瀏覽器自己的渲染功能來顯示這個網頁
6.瀏覽器關閉 tcp連接,即4次揮手
完成整個訪問過程
7. Web服務器內容: web服務器的原理!!就是 sockeSever! 其實為了后面學Django好理解!
.
#服務端
'''創建一個靜態服務器訪問指定頁面
http://127.0.0.1:8000/'''
importsocketfrom multiprocessing importProcess
HTML_ROOT_DIR= ""
defhandle_client(client_socket):'''處理客戶端請求'''
#獲取客戶端請求數據
request_data = client_socket.recv(1024)print("request_data:",request_data)#構造相應數據
response_start_line = "HTTP/1.1 200 OK\r\n"response_headers= "Sever:My server\r\n"response_body= "hello itcast"response= response_start_line+response_headers+"\r\n"+response_bodyprint("response data:",response)#向客戶端返回響應數據
client_socket.send(bytes(reponse,"utf-8"))#關閉客戶端連接
client_socket.close()defmain():#tcp socket 服務端
server_socket =socket.socket(socket.AF_INET,socket.SOCK_STREAM)
server_socket.bind(("",8003))
server_socket.listen(128)whileTrue:
client_socket,client_address=server_socket.accept()print("")#創建一個進程
handle_client_process = Process(target=handle_client,args=(client_socket,))
handle_client_process.start()
client_socket.close()if __name__ == '__main__':
main()
#客戶端!
'''創建一個靜態服務器訪問指定頁面
http://127.0.0.1:8000/index.html'''
importsocketimportrefrom multiprocessing importProcess#設置靜態文件根目錄 常量全大寫
HTML_ROOT_DIR = "./html"
defhandle_client(client_socket):'''處理客戶端請求'''
#獲取客戶端請求數據
request_data = client_socket.recv(1024)print("request_data:",request_data)
request_lines=request_data.splitines()for line inrequest_lines:print(line)#解析請求報文
#'GET?HTTP/1.1'
request_start_line =request_lines[0]#使用正則,拿到 index.html
file_name = re.match(r"\w+ +(/[^ ]*)",request_start_line.decode(utf-8)).group(1)#判斷反過來寫,防止少寫一個等號 不可變的寫在左邊
if "/" ==file_name:
file_name="/index.html"
#打開文件,讀取內容
try:
file= open(HTML_ROOT_DIR+file_name,"rb")exceptIOError:
response_start_line="HTTP/1.1 404 NOt Found\r\n"response_headers= "server: My Sever\r\n"response_body= "The file is not found!"
else:
file_data= file.read().decode("utf-8")
file.close()#構造相應數據
response_start_line = "HTTP/1.1 200 OK\r\n"response_headers= "Sever:My server\r\n"response_body=file_datafinally:
response= response_start_line+response_headers+"\r\n"+response_bodyprint("response data:",response)#向客戶端返回響應數據 python3需要轉換成字節
client_socket.send(bytes(reponse,"utf-8"))#關閉客戶端連接
client_socket.close()defmain():#tcp socket 服務端
server_socket =socket.socket(socket.AF_INET,socket.SOCK_STREAM)#設置socket參數
server_socket.setsockopt(socket.SOL_SOCKET,socket.SOL_REUSEADDR,1)
server_socket.bind(("",8000))
server_socket.listen(128)whileTrue:
client_socket,client_address=server_socket.accept()print("")#創建一個進程
handle_client_process = Process(target=handle_client,args=(client_socket,))
handle_client_process.start()
client_socket.close()if __name__ == '__main__':
main()
# 2018-9-22 20:44:38
# python網絡編程最主要的 就是socket 下面開始進行 多線程部分!
# 其他的 網絡編程后續再補充!
總結
以上是生活随笔為你收集整理的python网络编程难点_python之路网络编程总结(三)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux命令行挂载NTFS文件系统的移
- 下一篇: C语言 小球碰撞