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

每日分享:

冬至是北半球一年之中夜晚最长的一天,愿你在这个长夜能融化掉这一年所有的不快乐!!

目录:

  1. IP地址的介绍
  2. 端口和端口号的介绍
  3. TCP的介绍
  4. socket的介绍
  5. TCP网络应用程序开发流程
  6. TCP客户端程序开发
  7. TCP服务端程序开发
  8. TCP网络应用程序的注意点
  9. socket中send和recv原理剖析

一、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通信步骤:(类似于文件操作)

  1. 创建连接
  2. 传输数据
  3. 关闭连接

注意:

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客户端程序开发流程的介绍

步骤:

  1. 创建客户端套接字对象
  2. 和服务端套接字建立连接
  3. 发送数据
  4. 接收数据
  5. 关闭客户端套接字

3. TCP服务器端程序开发流程的介绍

步骤:

  1. 创建服务端套接字对象
  2. 绑定端口号
  3. 设置监听
  4. 等待接收客户端的连接请求
  5. 接收数据
  6. 发送数据
  7. 关闭套接字

4. 小结

  1. TCP网络应用程序开发分为客户端程序开发和服务端程序开发
  2. 主动发起建立连接请求的是客户端程序
  3. 等待接收连接请求的是服务端程序

六、TCP客户端程序开发

1. 开发TCP客户端程序步骤

  1. 创建客户端套接字对象
  2. 和服务端套接字建立连接
  3. 发送数据
  4. 接收数据
  5. 关闭客户端套接字

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

import socket
if __name__ == '__main__':# 1.创建tcp客户端套接字# AF_INET:ipv4  SOCK_STREAM:tcp传输协议tcp_client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)# 2.和服务端应用程序建立连接tcp_client_socket.connect(("127.0.0.1", 8080))# 3.准备发送的数据(win是gbk,linux是utf-8)send_data = "你好服务端,我是客户端小白".encode('gbk')# 4.发送数据tcp_client_socket.send(send_data)# 5.接收数据,每次接收数据最大字节数是1024recv_data = tcp_client_socket.recv(1024)# 6.返回的是服务端程序发送的二进制数据print(recv_data)# 7.对数据进行解码recv_content = recv_data.decode('gbk')print(recv_content)# 8.关闭套接字tcp_client_socket.close()

运行后如下图:

可以看到py程序并没有结束,它在等待服务器端返回给他数据:

 可以看到我们成功接收到了数据 “你好!”

 说明:

  1. str.encode(编码格式)表示把字符串编码成为二进制
  2. data.decode(编码格式)表示把二进制解码成为字符串

其中网络调试助手充当服务端程序:

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. 服务端程序开发步骤

  1. 创建服务端套接字对象
  2. 绑定端口号
  3. 设置监听
  4. 等待接受客户端的连接请求
  5. 接受数据
  6. 发送数据
  7. 关闭套接字

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分钟

解决:

  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网络应用程序的注意点

  1. 当TCP客户端程序想要和TCP服务端程序进行通信的时候必须要先建立连接
  2. TCP客户端程序一般不需要绑定端口号,因为客户端是主动发起建立连接的
  3. TCP服务端程序必须绑定端口号,否则客户端找不到这个TCP服务端程序
  4. listen之后,之前的套接字就成了被动套接字,只负责接收新的客户端的连接请求,不能收发消息
  5. 当TCP客户端程序和TCP服务端程序连接成功后,TCP服务端程序会产生一个新的套接字,收发客户端消息使用该套接字
  6. 关闭accept返回的套接字意味着和这个客户端通信完毕
  7. listen后,关闭之前的套接字意味着服务端的套接字关闭了,会导致新的客户端不能连接服务端,但是之前已经连接成功的客户端还能正常通信
  8. 当客户端的套接字调用close后,服务器的recv会解阻塞,返回的数据长度为0,服务端可以通过返回数据的长度来判断客户端是否已经下线,反之服务端关闭套接字,客户端的recv也会解阻塞,返回的数据长度也为0

九、socket中send和recv原理剖析

1. 认识TCP socket的发送和接收缓冲区

当创建一个TCP socket对象的时候,会有一个发送缓冲区和一个接收缓冲区这个发送和接收缓冲区指的就是内存中的一片空间

2. send原理剖析

send是不是直接把数据发送给服务端?

不是,想要发送数据,必须得通过网卡发送数据,应用程序是无法直接通过网卡发送数据的,它需要调用操作系统接口,也就是说,应用程序把发送的数据先写入到发送缓冲区(内存中的一片空间),再由操作系统控制网卡把发送缓冲区的数据发送给服务端网卡

3. recv原理剖析

recv是不是直接从客户端接收数据?

不是,应用软件是无法直接通过网卡接收数据的,它需要调用操作系统接口,由操作系统通过网卡接收数据,把接收的数据写入到接收缓冲区(内存中的一片空间),应用程序再从接收缓冲区获取客户端发送的数据

4. send和recv原理剖析图

说明:

  • 发送数据是发送到发送缓冲区
  • 接收数据是从接收缓冲区获取

5. 小结

不管是recv还是send都不是直接接收到对方的数据和发送数据到对方,发送数据会写入到发送缓冲区,接收数据是从接收缓冲区来读取,发送数据和接收数据最终是由操作系统控制网卡来完成

web中网络编程详解相关推荐

  1. Linux网络编程---详解TCP

    Linux网络编程---详解TCP的三次握手和四次挥手_shanghx_123的博客-CSDN博客_tcp的协议数据单元被称为 TCP协议详解(TCP报文.三次握手.四次挥手.TIME_WAIT状态. ...

  2. python编程入门与案例详解-Pythony运维入门之Socket网络编程详解

    Socket是什么? Socket 是电脑网络中进程间数据流的端点Socket 是操作系统的通信机制应用程序通过Socket进行网络数据的传输 首先,简单了解一下TCP通信过程: TCP三次握手(面试 ...

  3. JS中函数式编程详解版(FunctionalProgramming,FP)

    函数式编程详解 函数式编程的认识 函数式编程前置知识 函数是一等公民(First-class Function) 高阶函数 闭包 函数式编程基础 纯函数 lodash 模块 柯里化 函数组合 函子 函 ...

  4. Netty从使用到源码3_NIO网络编程详解

    关于BIO(即Java传统的网络编程,参考) NIO网络编程 1.逐步演变 1.单线程阻塞模式 创建服务器 import java.net.InetSocketAddress; import java ...

  5. android 网络编程实现,Android开发使用HttpURLConnection进行网络编程详解【附源码下载】...

    本文实例讲述了Android开发使用HttpURLConnection进行网络编程.分享给大家供大家参考,具体如下: --HttpURLConnection URLConnection已经可以非常方便 ...

  6. python网络编程项目_python网络编程详解

    最近在看<UNIX网络编程 卷1>和<FREEBSD操作系统设计与实现>这两本书,我重点关注了TCP协议相关的内容,结合自己后台开发的经验,写下这篇文章,一方面是为了帮助有需要 ...

  7. unet网络python代码详解_python网络编程详解

    最近在看<UNIX网络编程 卷1>和<FREEBSD操作系统设计与实现>这两本书,我重点关注了TCP协议相关的内容,结合自己后台开发的经验,写下这篇文章,一方面是为了帮助有需要 ...

  8. 14.网络编程详解-狂神笔记

    01.什么是计算机网络 网络编程 打电话 – 连接 – 接了电话 – 通话 (TCP) 发短信 – 发送了就完事了 – 接收 (UDP) 计算机网络: 计算机网络是指将地理位置不同的具有独立功能的多台 ...

  9. Linux系统中网络配置详解

    从linux诞生的那一天起,就注定了它的网络功能空前地强大.所以在linux系统中如何配置网络,使其高效,安全的工作就显得十分重要.下面我们就从网络设备的安装,网络服务的设置和网络安全性三个方面来介绍 ...

最新文章

  1. java中List深拷贝的简单实例
  2. 实践|超简单实现OCR文字识别应用
  3. EL之Bagging:kaggle比赛之利用泰坦尼克号数据集建立Bagging模型对每个人进行获救是否预测
  4. pythonrequest得替代_Python爬虫通过替换http request header来欺骗浏览器实现登录功能...
  5. 如何得知mysql表结构发生变化了呢?
  6. webview取java的参数值_Android 显示 WebView ,加载URL 时,向webview的 header 里面传递参数...
  7. node.js JavaScript 严格模式
  8. 数学之美:45幅耀眼夺目的分形艺术作品欣赏
  9. 解决SSM项目下静态资源(img、js、css)无法引用的问题
  10. 再硬写一个最简单的HTTPSERVER
  11. Atitit数据库层次架构表与知识点 attilax 总结
  12. 三维重建:基于RGB-D相机的三维重建总览(静态动态)
  13. 一本笔记,看懂《未来简史》!
  14. 怎样选择适合自己的视频加密软件方案?
  15. 伪原创文章需要注意的地方有哪些
  16. mac版MySQL初始密码修改
  17. 嵌入式分享合集112
  18. 基于Redis的分布式锁真的安全吗?
  19. 学习黑客必须要掌握的DOS命令全集
  20. SQL经典案例(学生表,课程表,选课表,教师表) 练习

热门文章

  1. 刀切水果(平面和空间切割问题)
  2. C/C++Linux后台开发(入门到精通) 学习路线-架构师篇
  3. python初中数学建模培训_中学生数学建模训练营精品班
  4. 哪些行业的物联网前景比较好?
  5. 微信小程序:拍照画布指定区域生成图片
  6. 黑苹果隔空投送无法双向传输解决
  7. SQL SERVER 2000安装win7系统时不出现安装界面
  8. jqGrid实现当前页列合计与总计
  9. 短视频自导自演,分镜脚本如何设计
  10. 网络版本计算器(再谈“协议“)