web中网络编程详解
今天是冬至,不知道大家有沒有吃餃子啊!
每日分享:
冬至是北半球一年之中夜晚最長的一天,愿你在這個長夜能融化掉這一年所有的不快樂!!
目錄:
一、IP地址的介紹
1.IP地址的概念
IP地址就是標識網絡設備(如電腦)的一個地址,就類似于家庭住址
2.IP地址的表現形式
?說明:
- IP地址分為兩類:IPv4和IPv6
- IPv4是當前使用的ip地址
- IPv6是未來使用的ip地址
- ipv4是由點分割、十進制組成
- ipv6是由冒號分割、十六進制組成
3.ip地址的作用
ip地址的作用是標識網絡中唯一的一臺設備,也就是通過ip地址能夠找到網絡中的某臺設備
4.查看ip地址
- linux和mac OS使用ifconfig命令
- Windows使用ipconfig命令
?5.檢查網絡是否正常
使用命令ping
例:ping www.baidu.com?
說明:
- ping www.baidu.com檢查是否能上公網
- ping 當前局域網的ip地址 檢查是否在同一個局域網內
- ping 127.0.0.1 檢查本地網卡是否正常
6.小結
- ip地址的作用是標識網絡中唯一的一臺設備
- ip地址的表現形式:ipv4、ipv6
- 查看網卡信息:ipconfig
- 檢查網絡:ping
二、端口和端口號的介紹
每運行一個網絡程序都會有一個端口,想要給對應的程序發送數據,找到對應的端口即可
1. 什么是端口
端口是傳輸數據的通道,就好比是教室的門,是數據的必經之路
那么如何找到對應的端口?
每一個端口都會有一個對應的端口號,就好比每一個教室的門都有一個門牌號,可以通過端口號來找到端口
2. 什么是端口號
操作系統為了統一管理這么多端口,就對端口進行了編號,這就是端口號,端口號其實就是一個數字,好比我們現實生活中的門牌號
端口號共有65536(2的16次方)個:(0~65535)
數據通信流程:通過ip地址找到對應的設備,通過端口號找到對應的端口,然后通過端口把數據傳輸給應用程序
3. 端口與端口號的關系
端口號可以標識唯一的一個端口
4. 端口號的分類
- 知名端口號
- 動態端口號
知名端口號:
知名端口號是指眾所周知的端口號,范圍:0~1023
? ? ? ? 這些端口號一般固定分配給一些服務,比如21端口號分配給FTP(文件傳輸協議)服務,25端口號分配給SMTP(簡單郵件傳輸協議)服務,80端口號分配給HTTP服務
動態端口號:
一般程序員開發應用程序使用端口號稱為動態端口號,范圍:1024~65535
- 如果程序員開發的程序沒有設置端口號,操作系統會在動態端口號這個范圍內隨機生成一個給開發的應用程序使用
- 當運行一個程序默認會有一個端口號,當這個程序退出時,所占用的這個端口號就會被釋放
5. 小結
- 端口的作用就是給運行的應用程序提供傳輸數據的通道
- 端口號的作用就是用來區分和管理不同端口的,通過端口號能找到唯一的一個端口
- 端口號可以分為兩類:知名端口號 和 動態端口號
- 知名端口號的范圍:0~1023
- 動態端口號的范圍:1024~65535
三、TCP的介紹
1. 網絡應用程序之間的通信流程
通過ip地址能夠找到對應的設備,然后通過端口號找到對應的端口,在通過端口把數據傳輸給應用程序。但數據不能隨便發送,在發送之前還需要選擇一個對應的傳輸協議,保證程序之間按照指定的傳輸規則進行數據的通信,而這個傳輸協議就是我們今天學習的TCP
2. TCP的概念
TCP(Transmission Control Protocol)簡稱傳輸控制協議,它是一種面向連接的、可靠的、基于字節流的傳輸層通信協議
TCP通信步驟:(類似于文件操作)
注意:
TCP通信模型相當于生活中的‘打電話’,在通信之前,一定要先建立好連接,才能發送數據,通信結束要關閉連接
3. TCP的特點
- 面向連接
- 通信雙方必須先建立好連接才能進行數據的傳輸,數據傳輸完成之后,雙方必須斷開此連接,以釋放系統資源
- 可靠傳輸
- TCP采用發送應答機制
- 超時重傳
- 錯誤校驗
- 流量控制和阻塞管理
4. 總結
TCP是一個穩定、可靠的傳輸協議,常用于對數據進行準確無誤的傳輸,比如:文件下載、瀏覽器上網
四、socket的介紹
通信數據是通過socket來完成的
1. socket的概念
socket(套接字)是進程之間通信的一個工具,就好比生活中的插座,所有的家用電器要想工作都是基于插座進行的,進程之間想要通過網絡通信需要基于這個socket
2. socket的作用
負責進程之間的網絡數據傳輸,好比數據的搬運工
3. socket使用場景
和網絡相關的應用程序或軟件都使用到了socket
4. 小結
進程之間網絡數據的傳輸可以通過socket來完成,socket就是進程間網絡數據通信的工具
五、網絡應用程序開發流程
1. TCP網絡應用程序開發流程介紹
TCP網絡應用程序開發分為:
- TCP客戶端程序開發
- TCP服務端程序開發
說明:
客戶端程序是指運行在用戶設備上的程序,服務端程序是指運行在服務器設備上的程序,專門為客戶端提供數據服務
2. TCP客戶端程序開發流程的介紹
步驟:
3. TCP服務器端程序開發流程的介紹
步驟:
4. 小結
六、TCP客戶端程序開發
1. 開發TCP客戶端程序步驟
2. socket類的介紹
導入socket模塊:import socket
創建客戶端socket對象:socket.socket(AddressFamily, Type)
參數說明:
- AddressFamily 表示ip地址類型,分為ipv4和ipv6
- Type 表示傳輸協議類型
方法說明:
- connect((host,port))表示和服務器套接字建立連接,host是服務器ip地址,port是應用程序的端口號
- send(data)表示發送數據,data是二進制數據
- recv(buffersize)表示接收數據,buffersize是每次接收數據的最大長度
3. TCP客戶端程序開發示例
在這之前我們需要一個軟件:網絡調試助手(充當服務端)
可以去網上搜索下載或者百度網盤提取鏈接:??????https://pan.baidu.com/s/1_lqcDOPI0n8zsPB6vx_JYw?
提取碼:2fxa
運行后如下圖:
可以看到py程序并沒有結束,它在等待服務器端返回給他數據:
?可以看到我們成功接收到了數據 “你好!”
?說明:
其中網絡調試助手充當服務端程序:
?4. 小結
1. 導入socket模塊
2. 創建TCP套接字‘socket’
- 參數1:‘AF_INET’,表示ipv4地址類型
- 參數2:‘SOCK_STREAM’,表示TCP傳輸協議類型
3. 發送數據‘send’
- 參數1:要發送的二進制數據,字符串需要進行encode方法進行編碼
4. 接收數據‘recv’
- 參數1:表示每次接收數據最大為多少,單位:字節
5. 關閉套接字‘socket’表示通信完成
七、TCP服務端程序開發
1. 服務端程序開發步驟
2. socket類的介紹
導入socket模塊
import socket
創建服務端socket對象
socket.socket(AddressFamily, Type)
參數說明:
- AddressFamily表示IP地址類型,分為ipv4和ipv6
- Type表示傳輸協議類型
方法說明:
- bind((host,port))表示綁定端口,host是ip地址,port是端口號,ip地址一般不指定,表示本機的任何一個ip地址都可以
- listen(backing)表示設置監聽,backing參數表示最大等待建立連接的個數
- accept()表示等待接收客戶端的連接請求
- send(data)表示發送數據,data是二進制數據
- recv(buffersize)表示接收數據,buffersize是每次接收數據的最大長度
3. TCP服務端程序開發示例
import socketif __name__ == '__main__':# 1.創建tcp服務端套接字# AF_INET:ipv4 AF_INET6:ipv6 SOCK_STREAM:tcp協議tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)# 設置端口號復用,程序退出,端口號立即釋放tcp_server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)# 2.綁定端口號# 第一個參數表示ip地址,一般不用指定,表示本機的任何一個ip都可# 第二個參數表示端口號tcp_server_socket.bind(("", 8080))# 3.設置監聽# 128(可自定義)表示最大等待建立連接的個數tcp_server_socket.listen(128)# 4.等待接收客戶端的連接請求# 每次客戶端和服務端建立連接成功都會返回一個新的套接字# tcp_server_socket只負責等待接收客戶端的連接請求,收發消息不使用它new_client, ip_port = tcp_server_socket.accept()# 代碼執行至此表示連接成功print("客戶端的ip和端口號:", ip_port)# 5.接收客戶端的數據recv_data = new_client.recv(1024)# 對二進制數據進行解碼變成字符串recv_content = recv_data.decode('gbk')print("接收客戶端的數據:", recv_content)# 6.發送數據到客戶端send_content = '問題處理中...'# 二進制編碼send_data = send_content.encode('gbk')new_client.send(send_data)# 結束本次服務new_client.close()# 7.關閉服務端套接字,表示服務端以后不在接收等待接收客戶端的連接請求tcp_server_socket.close()結果:
?當客戶端和服務端建立連接之后,服務端程序退出后端口號不會立即釋放,需要大概等待1~2分鐘
解決:
端口號復用代碼:
tcp_server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)
參數1:表示當前套接字
參數2:設置端口號復用選項
參數3:設置端口號復用選項對應的值
在這,網絡調試助手充當客戶端程序
?4. 小結
1. 導入socket模塊
2. 創建TCP套接字‘socket’
- 參數1:‘AF_INET’,表示ipv4地址類型
- 參數2:‘SOCK_STREAM’,表示tcp傳輸協議類型
3. 綁定端口號‘bind’
- 參數:元組,(ip地址,端口號)
4. 設置監聽‘listen’
- 參數:元組,最大等待建立連接的個數
5. 等待接收客戶端的連接請求‘accept’
6. 發送數據‘send’
- 參數:要發送的二進制數據,字符串需要用encode方法進行編碼
7. 接收數據‘recv’
- 參數:表示每次接收數據的最大的大小,單位是字節,解碼用decode方法
8. 關閉套接字‘socket’表示通信完成
八、TCP網絡應用程序的注意點
九、socket中send和recv原理剖析
1. 認識TCP socket的發送和接收緩沖區
當創建一個TCP socket對象的時候,會有一個發送緩沖區和一個接收緩沖區,這個發送和接收緩沖區指的就是內存中的一片空間
2. send原理剖析
send是不是直接把數據發送給服務端?
不是,想要發送數據,必須得通過網卡發送數據,應用程序是無法直接通過網卡發送數據的,它需要調用操作系統接口,也就是說,應用程序把發送的數據先寫入到發送緩沖區(內存中的一片空間),再由操作系統控制網卡把發送緩沖區的數據發送給服務端網卡
3. recv原理剖析
recv是不是直接從客戶端接收數據?
不是,應用軟件是無法直接通過網卡接收數據的,它需要調用操作系統接口,由操作系統通過網卡接收數據,把接收的數據寫入到接收緩沖區(內存中的一片空間),應用程序再從接收緩沖區獲取客戶端發送的數據
4. send和recv原理剖析圖
?說明:
- 發送數據是發送到發送緩沖區
- 接收數據是從接收緩沖區獲取
5. 小結
不管是recv還是send都不是直接接收到對方的數據和發送數據到對方,發送數據會寫入到發送緩沖區,接收數據是從接收緩沖區來讀取,發送數據和接收數據最終是由操作系統控制網卡來完成
總結
以上是生活随笔為你收集整理的web中网络编程详解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 《完美应用Ubuntu》第3版 何晓龙
- 下一篇: tengine监控