Python中的TCP
文章目录
- 一. 计算机网络
- 1. 网络的概念
- 2. IP地址
- ① IP地址的概念
- ② IP地址的表现形式
- ③ IP地址的作用
- ④ 网络查询命令
- Ⅰ. ifconfig/ipconfig
- Ⅱ. ping
- 3. 端口和端口号的概念(计算机通信原理)
- ① 端口的概念
- ② 端口号的概念
- 4. socket套接字
- ① socket概念
- ② socket使用场景
- 二. TCP
- 1. TCP协议
- 2. TCP的特点
- ① 面向连接
- ② 可靠传输
- 3. 数据的编码转换
- 三. TCP实战
- 1. TCP客户端程序开发流程(五步走)
- 2. TCP服务端程序开发流程(七步走)
- 3. TCP服务端程序开发-多客户端
- 4. TCP服务端程序开发-面向对象
- 5. TCP端口复用
- 6. TCP注意点
- 四. UDP协议(不靠谱)
一. 计算机网络
1. 网络的概念
网络就是将具有独立功能的多台计算机通过通信线路和通信设备连接起来,在网络管理软件及网络通信协议下,实现资源共享和信息传递的虚拟平台
学习网络的目的就是能够编写基于网络通信的软件或程序,通常来说就是网络编程。
2. IP地址
① IP地址的概念
思考一个问题,当我们在计算机中使用微信和你心中那个“她”聊天时,信息是如何精准的传递到她的计算机中的呢?
答:是通过计算机的IP地址来实现的,IP地址是分配给网络设备上网使用的数字标签,它能够标识网络中唯一的一台设备,好比现实中每个人都有一个手机号。
② IP地址的表现形式
IP地址一共有4位,第1位,1~223,第234位,0~255
注意事项:
① IP地址分为两类 : IPv4和IPv6
② IPv4是目前使用的IP地址
③ IPv6是未来使用的IP地址
③ IP地址的作用
通过IP地址找到网络中唯一一台设备,然后可以跟这个设备进行数据通信。
④ 网络查询命令
命令名 | 说明 |
---|---|
ifconfig/ipconfig | 查看网卡信息 |
ping | 检查网络是否正常 |
Ⅰ. ifconfig/ipconfig
① 172.16.47.199是在网络中的地址,使用ifconfig主要是查看网卡对应网络中的IP地址。
② 127.0.0.1表示本机地址,提示:如果和自己的电脑通信就可以使用该地址。
③ 127.0.0.1该地址对应的域名localhost,域名是ip地址的别名,通过域名能解析出一个对应的ip地址。
Ⅱ. ping
① ping www.baidu.com 检查是否能上公网
② ping 当前局域网的ip地址 检查是否在同一个局域网内
③ ping 127.0.0.1 检查本地网卡是否正常
ping命令其结果是连续的操作,如果想停止,我们可以使用快捷键Ctrl + C终止
3. 端口和端口号的概念(计算机通信原理)
① 端口的概念
问题:如果在一台电脑上使用飞秋给另外一台电脑上的飞秋发送数据并且另外的这台电脑还运行着多个软件,它是如何区分这多个软件把数据给飞秋的呢?
答:其实,每运行一个程序都会有一个端口,想要给对应的程序发送数据,找到对应的端口即可。端口就是传输数据的通道,好比教室的门,是数据传输必经之路。
② 端口号的概念
而且每一个端口都会有一个对应的端口号(操作系统为了统一管理这么多端口,就对端口进行了编号,这就是端口号,端口号其实就是一个数字,好比我们现实生活中的门牌号),想要找到端口通过端口号即可,如:飞秋软件的默认端口号就是2345。
最终通信结果:通过ip地址找到对应的设备,通过端口号找到对应的端口,然后通过端口把数据给应用程序。
① 知名端口号
知名端口号是指众所周知的端口号,范围从0到1023,这些端口号一般固定分配给一些服务,比如21端口分配给FTP(文件传输协议)服务,22端口分配给SSH(安全外壳协议,主要用于远程连接与文件传输),25端口分配给SMTP(简单邮件传输协议)服务,80端口分配给HTTP服务,443端口分配给HTTPS服务等等。
② 动态端口号
一般程序员开发应用程序使用端口号称为动态端口号。
动态端口号的范围是从1024到65535,如果程序员开发的程序没有设置端口号,操作系统会在动态端口号这个范围内随机生成一个给开发的应用程序使用。
注意:
当运行一个程序默认会有一个端口号,当程序退出时,所占用的这个端口号就会被释放。
设置端口建议8000以后
4. socket套接字
① socket概念
到目前为止我们学习了IP地址和端口号,使用这些我们就可以在茫茫的网络海洋中进行畅游了么?
答案是否定的!
那我们需要什么工具呢?答:socket套接字工具,它是计算机之间进行通信的一种约定或一种方式。通过 socket 这种约定,一台计算机可以接收其他计算机的数据,也可以向其他计算机发送数据。
这就好比现实中的电话,当知道了对方的电话号码后需要使用电话才能进行通讯,程序之间想要进行网络通信需要基于这个socket套接字,socket套接字就是程序间进行网络通讯的工具。
② socket使用场景
不夸张的说,只要跟网络相关的应用程序或者软件都使用到了socket。
二. TCP
1. TCP协议
之前我们学习了IP地址和端口号,通过IP地址能够找到对应的设备,然后再通过端口号找到对应的端口,再通过端口把数据传输给应用程序,这里要注意,数据不能随便发送,在发送之前还要选择网络传输方式(传输协议),保证程序之间按照指定的传输规则进行数据的通信。
TCP的英文全拼(Transmission Control Protocol)简称传输控制协议,它是一种面向连接的、可靠的、基于字节流的传输层通信协议。
TCP通信步骤:① 创建连接 ② 传输数据 ③ 关闭连接
TCP通信模型相当于生活中的’打电话‘,在通信开始之前,一定要先建立好连接,才能发送数据,通信结束要关闭连接。
2. TCP的特点
① 面向连接
通信双方必须先建立好连接才能进行数据的传输,并且双方都会为此连接分配必要资源用来记录连接的状态和信息。当数据传输完成后,双方必须断开此连接,以释放系统资源。
② 可靠传输
☆ TCP采用发送应答机制
通过TCP这种方式发送的每个报文段都必须得到接收方的应答才认为这个TCP报文段传送成功
☆ 超时重传
发送端发送一个报文之后就会启动定时器,如果指定时间内没有得到应答就会重新发送这个报文段
☆ 错误校验
TCP用一个校验和函数来校验数据是否有错误,在发送和接收时都要计算校验和☆ 流量控制和阻塞管理
流量控制用来避免发送端发送过快而使得接收方来不及接收
3. 数据的编码转换
在计算机网络中,数据都是以二进制的形式进行传输的。所以在网络传输数据的时候,数据需要先编码转化为二进制(bytes)数据类型
I Love Python => 字符串 => 转换为二进制数据 => 网络中传输
数据转换方法说明:
函数名 | 说明 |
---|---|
encode | 编码 将字符串转化为字节码 |
decode | 解码 将字节码转化为字符串 |
提示:encoed()和decode()函数可以接受参数,encoding是指在编解码过程中使用的编码方案。
字符串编码:
str.encode(encoding=”utf-8”)
二进制解码:
bytes.decode(encoding=“utf-8”)
三. TCP实战
客户端程序是指运行在用户设备上的程序,服务端程序是指运行在服务器设备上的程序,专门为客户端提供数据服务
主动发起建立连接请求的是客户端程序,等待接受连接请求的是服务端程序
1. TCP客户端程序开发流程(五步走)
import socketif __name__ == '__main__':# 1、创建客户端套接字对象# AddressFamily: IP地址类型, 分为IPv4和IPv6#Type: 传输协议类型tcp_client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)# 2、和服务器端套接字建立连接(参数必须是一个元祖)tcp_client_socket.connect(("192.168.124.5", 8080))# 3、发送数据tcp_client_socket.send('hell, itheima'.encode(encoding='utf-8'))# 4、接收数据recv_data = tcp_client_socket.recv(1024).decode('utf-8')print(recv_data)# 5、关闭客户端套接字tcp_client_socket.close()
2. TCP服务端程序开发流程(七步走)
import socketif __name__ == '__main__':# 1、创建服务器端套接字对象tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)# 2、绑定IP地址与端口号tcp_server_socket.bind(("", 8080))# 3、开启监听tcp_server_socket.listen(128)# 4、等待接收客户端连接请求conn_socket, ip_port = tcp_server_socket.accept()print('客户端IP+端口:', ip_port)# 5、接收数据recv_data = conn_socket.recv(1024)print('接收到的数据:', recv_data.decode(encoding="gbk"))# 6、发送数据conn_socket.send("客户端的数据已经收到了".encode(encoding="gbk"))# 7、关闭套接字conn_socket.close()tcp_server_socket.close()
3. TCP服务端程序开发-多客户端
# 导入模块
import socket# 1、创建套接字对象
tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 2、绑定IP与端口
tcp_server_socket.bind(("", 8080))
# 3、设置监听
tcp_server_socket.listen(128)
# 4、等待客户端连接
while True:# 使用try...except捕获连接异常try:new_socket, ip_port = tcp_server_socket.accept()while True:try:# 5、接收客户端发送过来的消息recv_data = new_socket.recv(1024)recv_data = recv_data.decode('gbk')print(f'{ip_port}:{recv_data}')content = input('服务器端消息:').encode('gbk')new_socket.send(content)except ConnectionResetError:print(f'{ip_port}客户端连接已经断开')breaknew_socket.close()except:print('出错,退出服务器监听')break# 关闭套接字对象
tcp_server_socket.close()
4. TCP服务端程序开发-面向对象
# 导入模块
import socket# 创建一个WebServer服务器端类
class WebServer(object):# 定义__init__()魔术方法,用于对象初始化def __init__(self):# 创建套接字对象self.tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)# 绑定IP与端口号self.tcp_server_socket.bind(("", 8090))# 设置监听self.tcp_server_socket.listen(128)# 定义一个handle_client_request()def handle_client_request(self, new_socket, ip_port):# 接收客户端消息recv_data = new_socket.recv(1024)recv_data = recv_data.decode('gbk')print(f'{ip_port}客户端发送过来的消息:{recv_data}')# 返回(发送)消息给客户端content = '信息已收到,over,over!'.encode('gbk')new_socket.send(content)# 处理完成后,关闭新套接字对象# new_socket.close()# 定义一个start方法,用于启动WebServer,接收客户端连接def start(self):while True:# 等待客户端连接new_socket, ip_port = self.tcp_server_socket.accept()# 定义一个方法,用于接收和发送消息self.handle_client_request(new_socket, ip_port)# 创建程序执行入口,实例化WebServer类生成对象
if __name__ == '__main__':# 实例化对象ws = WebServer()# 调用自身方法,用于启动服务ws.start()
5. TCP端口复用
import socketif __name__ == '__main__':# 1、创建服务器端套接字对象tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)# 设置端口复用tcp_server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)# 2、绑定IP地址与端口号tcp_server_socket.bind(("", 8888))# 3、开启监听tcp_server_socket.listen(128)# 4、等待接收客户端连接请求conn_socket, ip_port = tcp_server_socket.accept()print('客户端IP+端口:', ip_port)# 5、接收数据recv_data = conn_socket.recv(1024)print('接收到的数据:', recv_data.decode())# 6、发送数据conn_socket.send("客户端的数据已经收到了".encode())# 7、关闭套接字conn_socket.close()tcp_server_socket.close()
6. TCP注意点
四. UDP协议(不靠谱)
TCP可靠协议(数据可以100%传输)
日常通信、数据传输一定要保证可靠性,使用TCP。
UDP不可靠协议(只能保证速度,但是没办法保证数据传输质量,发送5M => 接收3.75M)
有些情况下,我们对数据的质量没有要求,可以考虑使用UDP,如视频通话。
相关文章:
Python中的TCP
文章目录 一. 计算机网络1. 网络的概念2. IP地址① IP地址的概念② IP地址的表现形式③ IP地址的作用④ 网络查询命令Ⅰ. ifconfig/ipconfigⅡ. ping 3. 端口和端口号的概念(计算机通信原理)① 端口的概念② 端口号的概念 4. socket套接字① socket概念② socket使用场景 二. T…...
CSS(8)高级技巧:精灵图,css三角,用户界面,vertical-align属性应用
一.精灵图 通过css中的background-position属性,将多张图合成为一张图 二.css三角 在网页中,我们可以添加css属性获得三角图标 solid:实心,边框的实心 transparent:透明,图中代码表示只有左边粉色,其余地方为透明 三ÿ…...
Flink新版Source接口源码解析
目录 1. 前言 2. Source解析 2.1 Source类图 2.2 接口和方法说明 2.2.1 Source,> 3. SplitEnumerator解析 3.1 SplitEnumetator类图 3.2 类和方法说明 3.2.1 SplitEnumerator 3.2.2 SimpleVersionedSerializer 4. SourceReader解析 4.1 SourceReader类图 4.2 类…...
SLM561A系列60V10-50mA单通道线性恒流LED驱动芯片,为汽车照明、景观照明助力
SLM561A系列选型参考: SLM561A10ae-7G SOD123 SLM561A15ae-7G SOD123 SLM561A20ae-7G SOD123 SLM561A25ae-7G SOD123 SLM561A30ae-7G SOD123 SLM561A35ae-7G SOD123 SLM561A40ae-7G SOD123 SLM561A45ae-7G SOD123 SLM561A50ae-7G SOD123 S…...
一次失败的wxpython安装macOS M1
WARNING: The scripts libdoc, rebot and robot are installed in /Users/用户名/Library/Python/3.8/bin which is not on PATH. 背景:想在macos安装Robot Framework ,显示pip3不是最新,更新pip3后显示不在PATH上 参看博主文章末尾 MAC系统…...
【大数据技术基础 | 实验十一】Hive实验:新建Hive表
文章目录 一、实验目的二、实验要求三、实验原理四、实验环境五、实验内容和步骤(一)启动Hive(二)创建表(三)显示表(四)显示表列(五)更改表(六&am…...
【yarn】yarn rest api每日job数量分析
一、说明 # 无法制定时间范围!!! yarn application -list 官方文档 rest返回内容(官网案例): {app":{"id":"application_1324057493980_0001","user":"user1&q…...
蓝桥杯单片机第十一届省赛(第一场)
主函数代码 #include<iic.h> #include<intrins.h>sfr P40xc0; sbit R3P3^2; sbit R4P3^3; sbit C4P3^4; sbit C3P3^5;unsigned char code led_nodot[]{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; unsigned char code led_dot[]{0x40,0x79,0x24,0x30,0x…...
hive复杂数据类型Array Map Struct 炸裂函数explode
1、Array的使用 create table tableName( ...... colName array<基本类型> ...... ) 说明:下标从0开始,越界不报错,以null代替 arr1.txtzhangsan 78,89,92,96 lisi 67,75,83,94 王五 23,12 新建表: create table arr1(n…...
FIFO架构专题-FIFO是什么
目录 简介: FIFO参数: 1.宽度WIDTH(一次位数) 2.深度DEEPTH(存多少次) FIFO的分类: 同步FIFO 异步FIFO 读写位宽不同的FIFO FIFO信号介绍 写时钟 写数据 写使能 读时钟 读数据 读…...
Pythony——多线程简单爬虫实现
简单爬虫实现 import requests from bs4 import BeautifulSoup# 生成要爬取的网页地址列表,这里是博客园的分页地址,从第1页到第50页 urls [f"https://www.cnblogs.com/#p{i}" for i in range(1, 50 1)]# 生产者函数——负责下载网页内容 d…...
如何修改 a 链接的样式
在CSS中,你可以使用选择器来针对HTML中的特定元素(例如<a>标签,也就是链接)进行修改样式。以下是一些常见的修改<a>链接样式的方法: 移除下划线: a { text-decoration: none; } 修改链接的…...
第6章 详细设计-6.5 软硬件接口文档设计
6.5 软硬件接口文档设计 一般的产品都包含硬件和软件两部分,产品设计阶段需要确保硬件开发人员和软件开发的沟通准确、高效。所以需要一份书面的文档来承载软件和硬件之间的沟通细节。以下面的细水雾除尘设备为例进行讲解,涉及软件和硬件的接口ÿ…...
【pyspark学习从入门到精通14】MLlib_1
目录 包的概览 加载和转换数据 在前文中,我们学习了如何为建模准备数据。在本文中,我们将实际使用这些知识,使用 PySpark 的 MLlib 包构建一个分类模型。 MLlib 代表机器学习库。尽管 MLlib 现在处于维护模式,即它不再积极开发…...
C++全局构造和初始化
片段摘自程序员的自我修养—链接、装载与库.pdf 11.4 程序在进入main之前,需要对全局对象进行构造初始化。 glibc全局对象进行构造初始化 gibc启动程序时会经过.init段,退出程序时会经过.finit段。这两个段中的代码最终拼接成_init()和_finit(),这两个…...
安全见闻-泷羽sec课程笔记
编程语言 C语言:一种通用的、面向过程的编程语言,广泛应用于系统软件和嵌入式开发。 C:在C语言基础上发展而来,支持面向对象编程,常用于尊戏开发、高性能计算等领域。 Java:一种广泛使用的面问对象编程语言,具有跨平台…...
游戏引擎学习第17天
视频参考:https://www.bilibili.com/video/BV1LPUpYJEXE/ 回顾上一天的内容 1. 整体目标: 处理键盘输入:将键盘输入的处理逻辑从平台特定的代码中分离出来,放入更独立的函数中以便管理。优化消息循环:确保消息循环能够有效处理 …...
【FFmpeg】FFmpeg 内存结构 ③ ( AVPacket 函数简介 | av_packet_ref 函数 | av_packet_clone 函数 )
文章目录 一、av_packet_ref 函数1、函数原型2、函数源码分析3、函数使用代码示例 二、av_packet_clone 函数1、函数原型2、函数源码分析 FFmpeg 4.0 版本源码地址 : GitHub : https://github.com/FFmpeg/FFmpeg/tree/release/4.0GitCode : https://gitcode.com/gh_mirrors/ff…...
【学习笔记】量化概述
Quantize量化概念与技术细节 题外话,在七八年前,一些关于表征的研究,会去做表征的压缩,比如二进制嵌入这种事情,其实做得很简单,无非是找个阈值,然后将浮点数划归为零一值,现在的Qu…...
同步互斥相关习题10道 附详解
PV操作 2016 某系统允许最多10个进程同时读文件F,当同时读文件F的进程不满10个时,欲读该文件的其他文件可立即读,当已有10个进程在读文件F时读,其他欲读文件F的进程必须等待,直至有进程读完后退出方可去读 在实现管…...
【Python · PyTorch】卷积神经网络 CNN(LeNet-5网络)
【Python PyTorch】卷积神经网络 CNN(LeNet-5网络) 1. LeNet-5网络※ LeNet-5网络结构 2. 读取数据2.1 Torchvision读取数据2.2 MNIST & FashionMNIST 下载解包读取数据 2. Mnist※ 训练 LeNet5 预测分类 3. EMnist※ 训练 LeNet5 预测分类 4. Fash…...
Git 拉取指定分支创建项目
一 背景 因为项目过大,只需要部分分支的代码即可。 二 实现 方法一:使用 --single-branch 参数 git clone 支持只拉取指定分支,而不是整个库的所有分支: git clone --branch <branch_name> --single-branch <reposi…...
CF862B Mahmoud and Ehab and the bipartiteness(二分图的性质)
思路:一个二分图是由两个集合组成的,同一个集合中的节点间不能连边,所以一个二分图最多有cnt[1]*cnt[2]条边,题目给出一个树的n-1条边,要我们添加最多的边数使他成为二分图,添加的边数就是cnt[1]*cnt[2]-n1…...
React Native 全栈开发实战班 :数据管理与状态之React Hooks 基础
在 React Native 应用中,数据管理与状态管理是构建复杂用户界面的关键。React 提供了多种工具和模式来处理数据流和状态管理,包括 React Hooks、Context API 以及第三方状态管理库(如 Redux)。本章节将详细介绍 React Hooks 的基础…...
传奇996_22——自动挂机
登录钩子函数中执行 callscript(actor, "../QuestDiary/主界面基础按钮/主界面基础按钮QM", "基础按钮QM")基础按钮QM执行了已下代码 #IF Equal <$CLIENTFLAG> 1 #ACT goto PC端面板加载#IF Equal <$CLIENTFLAG> 2 #ACT goto 移动端面板加载…...
faiss 提供了多种索引类型
faiss 多种索引类型 在 faiss 中,IndexFlatL2 是一个简单的基于 L2 距离(欧几里得距离)进行索引的索引类型,但实际上,faiss 提供了多种索引类型,支持不同的度量方式和性能优化,您可以根据需求选…...
比rsync更强大的文件同步工具rclone
背景 多个复制,拷贝,同步文件场景,最大规模的是每次几千万规模的小文件需要从云上对象存储中拉取到本地。其他的诸如定期数据备份,单次性数据备份。 rsync是单线程的,开源的mrsync是多线程的,但适用范围没…...
《业务流程--穿越从概念到实践的丛林》读后感一:什么是业务流程
1.1 流程和业务流程概念辨析 业务流程建模标准(BPMN)对于业务流程的定义:一个业务流程由为了配合一个组织性或技术环境而一系列活动组成。这些活动共同实现一个业务目标。 业务流程再造最有名的倡导者托马斯.H.达文波特对于流程和业务流程的定义:流程是一组结构化且可度量的…...
解决docker mysql命令行无法输入中文
docker启动时,设置支持中文 docker run --name mysql-container -e MYSQL_ROOT_PASSWORDroot -d mysql:5.7 --character-set-serverutf8mb4 --collation-serverutf8mb4_unicode_ci --default-time-zone8:00 进入docker时,指定LANG即可 docker exec -it …...
基于Java Springboot城市公交运营管理系统
一、作品包含 源码数据库设计文档万字PPT全套环境和工具资源部署教程 二、项目技术 前端技术:Html、Css、Js、Vue、Element-ui 数据库:MySQL 后端技术:Java、Spring Boot、MyBatis 三、运行环境 开发工具:IDEA/eclipse 数据…...
网站分析怎么做/志鸿优化设计电子版
(8位),则应当使用char来存放,因为这样存取的速度就会提高。如果存放的数据长度是变化的,则使用varchar2来存放。3、nchar(n)以Unicode编码来存放字符串,它最大可以存放2000个字符,是定长。举例说明:create …...
网站空间提供/seo推广一年要多少钱
使用VS2015编写驱动时出现的部分错误以及解决方法参考文章: (1)使用VS2015编写驱动时出现的部分错误以及解决方法 (2)https://www.cnblogs.com/Lxk0825/p/10040560.html 备忘一下。...
商城建设公司/seo推广优化
欢迎提出更简单的语法~(文章中案例有两个福利哦,一个是养生,一个是人工智能[ 密码:fqif])先说下感觉,python的编程有点JavaScript的感觉(比如:和“有时候不区别),又感觉像外国版的易语言,整个过…...
dedecms 安防监控行业网站模板/凡科建站收费价目表
telnet命令通常用来远程登录。telnet程序是基于TELNET协议的远程登录客户端程序。Telnet协议是TCP/IP协议族中的一员,是Internet远程登陆服务的标准协议和主要方式。它为用户提供了在本地计算机上完成远程主机工作的 能力。在终端使用者的电脑上使用telnet程序&…...
医疗机构 网站备案/搜索百度
Java内存区域划分、内存分配原理(基于jdk1.7 源自 《深入理解java虚拟机》) 运行时数据区域 Java虚拟机在执行Java的过程中会把管理的内存划分为若干个不同的数据区域。这些区域有各自的用途,以及创建和销毁的时间,有的区域随着虚…...
用笔记本做网站/怎样推广自己的广告
win32api 文件编程Here, we show some example code on Win32. The code are operations on file on Win32 OSes. The code here uses some MFC classes.在这里,我们显示Win32上的一些示例代码。 该代码是Win32 OS上文件上的操作。 这里的代码使用一些MFC类。 Recu…...