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