日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) >

web中网络编程详解

發(fā)布時(shí)間:2024/3/26 52 豆豆
生活随笔 收集整理的這篇文章主要介紹了 web中网络编程详解 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

今天是冬至,不知道大家有沒有吃餃子啊!

每日分享:

冬至是北半球一年之中夜晚最長(zhǎng)的一天,愿你在這個(gè)長(zhǎng)夜能融化掉這一年所有的不快樂!!

目錄:

  • IP地址的介紹
  • 端口和端口號(hào)的介紹
  • TCP的介紹
  • socket的介紹
  • TCP網(wǎng)絡(luò)應(yīng)用程序開發(fā)流程
  • TCP客戶端程序開發(fā)
  • TCP服務(wù)端程序開發(fā)
  • TCP網(wǎng)絡(luò)應(yīng)用程序的注意點(diǎn)
  • socket中send和recv原理剖析
  • 一、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通信步驟:(類似于文件操作)

  • 創(chuàng)建連接
  • 傳輸數(shù)據(jù)
  • 關(guān)閉連接
  • 注意:

    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ā)流程的介紹

    步驟:

  • 創(chuàng)建客戶端套接字對(duì)象
  • 和服務(wù)端套接字建立連接
  • 發(fā)送數(shù)據(jù)
  • 接收數(shù)據(jù)
  • 關(guān)閉客戶端套接字
  • 3. TCP服務(wù)器端程序開發(fā)流程的介紹

    步驟:

  • 創(chuàng)建服務(wù)端套接字對(duì)象
  • 綁定端口號(hào)
  • 設(shè)置監(jiān)聽
  • 等待接收客戶端的連接請(qǐng)求
  • 接收數(shù)據(jù)
  • 發(fā)送數(shù)據(jù)
  • 關(guān)閉套接字
  • 4. 小結(jié)

  • TCP網(wǎng)絡(luò)應(yīng)用程序開發(fā)分為客戶端程序開發(fā)和服務(wù)端程序開發(fā)
  • 主動(dòng)發(fā)起建立連接請(qǐng)求的是客戶端程序
  • 等待接收連接請(qǐng)求的是服務(wù)端程序
  • 六、TCP客戶端程序開發(fā)

    1. 開發(fā)TCP客戶端程序步驟

  • 創(chuàng)建客戶端套接字對(duì)象
  • 和服務(wù)端套接字建立連接
  • 發(fā)送數(shù)據(jù)
  • 接收數(shù)據(jù)
  • 關(guān)閉客戶端套接字
  • 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

    import socket if __name__ == '__main__':# 1.創(chuàng)建tcp客戶端套接字# AF_INET:ipv4 SOCK_STREAM:tcp傳輸協(xié)議tcp_client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)# 2.和服務(wù)端應(yīng)用程序建立連接tcp_client_socket.connect(("127.0.0.1", 8080))# 3.準(zhǔn)備發(fā)送的數(shù)據(jù)(win是gbk,linux是utf-8)send_data = "你好服務(wù)端,我是客戶端小白".encode('gbk')# 4.發(fā)送數(shù)據(jù)tcp_client_socket.send(send_data)# 5.接收數(shù)據(jù),每次接收數(shù)據(jù)最大字節(jié)數(shù)是1024recv_data = tcp_client_socket.recv(1024)# 6.返回的是服務(wù)端程序發(fā)送的二進(jìn)制數(shù)據(jù)print(recv_data)# 7.對(duì)數(shù)據(jù)進(jìn)行解碼recv_content = recv_data.decode('gbk')print(recv_content)# 8.關(guān)閉套接字tcp_client_socket.close()

    運(yùn)行后如下圖:

    可以看到py程序并沒有結(jié)束,它在等待服務(wù)器端返回給他數(shù)據(jù):

    ?可以看到我們成功接收到了數(shù)據(jù) “你好!”

    ?說明:

  • str.encode(編碼格式)表示把字符串編碼成為二進(jìn)制
  • data.decode(編碼格式)表示把二進(jìn)制解碼成為字符串
  • 其中網(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ā)步驟

  • 創(chuàng)建服務(wù)端套接字對(duì)象
  • 綁定端口號(hào)
  • 設(shè)置監(jiān)聽
  • 等待接受客戶端的連接請(qǐng)求
  • 接受數(shù)據(jù)
  • 發(fā)送數(shù)據(jù)
  • 關(guān)閉套接字
  • 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分鐘

    解決:

  • 更換服務(wù)端端口號(hào)
  • 設(shè)置端口號(hào)復(fù)用
  • 端口號(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)

  • 當(dāng)TCP客戶端程序想要和TCP服務(wù)端程序進(jìn)行通信的時(shí)候必須要先建立連接
  • TCP客戶端程序一般不需要綁定端口號(hào),因?yàn)榭蛻舳耸侵鲃?dòng)發(fā)起建立連接的
  • TCP服務(wù)端程序必須綁定端口號(hào),否則客戶端找不到這個(gè)TCP服務(wù)端程序
  • listen之后,之前的套接字就成了被動(dòng)套接字,只負(fù)責(zé)接收新的客戶端的連接請(qǐng)求,不能收發(fā)消息
  • 當(dāng)TCP客戶端程序和TCP服務(wù)端程序連接成功后,TCP服務(wù)端程序會(huì)產(chǎn)生一個(gè)新的套接字,收發(fā)客戶端消息使用該套接字
  • 關(guān)閉accept返回的套接字意味著和這個(gè)客戶端通信完畢
  • listen后,關(guān)閉之前的套接字意味著服務(wù)端的套接字關(guān)閉了,會(huì)導(dǎo)致新的客戶端不能連接服務(wù)端,但是之前已經(jīng)連接成功的客戶端還能正常通信
  • 當(dāng)客戶端的套接字調(diào)用close后,服務(wù)器的recv會(huì)解阻塞,返回的數(shù)據(jù)長(zhǎng)度為0,服務(wù)端可以通過返回?cái)?shù)據(jù)的長(zhǎng)度來判斷客戶端是否已經(jīng)下線,反之服務(wù)端關(guān)閉套接字,客戶端的recv也會(huì)解阻塞,返回的數(shù)據(jù)長(zhǎng)度也為0
  • 九、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)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。