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 socket

if __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 socket

if __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}客户端连接已经断开')
                break
        new_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 socket

if __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,如视频通话。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/918639.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

本地部署Apache Answer搭建高效的知识型社区并一键发布到公网流程

文章目录 前言1. 本地安装Docker2. 本地部署Apache Answer2.1 设置语言选择简体中文2.2 配置数据库2.3 创建配置文件2.4 填写基本信息 3. 如何使用Apache Answer3.1 后台管理3.2 提问与回答3.3 查看主页回答情况 4. 公网远程访问本地 Apache Answer4.1 内网穿透工具安装4.2 创建…

【数据结构】线性表——栈与队列

写在前面 栈和队列的关系与链表和顺序表的关系差不多,不存在谁替代谁,只有双剑合璧才能破敌万千~~😎😎 文章目录 写在前面一、栈1.1栈的概念及结构1.2、栈的实现1.2.1、栈的结构体定义1.2.2、栈的初始化栈1.2.3、入栈1.2.4、出栈…

科技改变工作方式:群晖NAS安装内网穿透实现个性化办公office文档分享(1)

文章目录 前言1. 本地环境配置2. 制作本地分享链接3. 制作公网访问链接4. 公网ip地址访问您的分享相册5. 制作固定公网访问链接 前言 本文将详细介绍如何在群晖NAS上安装Synology Office和Synology Drive Server,并利用Cpolar内网穿透工具为本地文档配置固定的公网…

无插件H5播放器EasyPlayer.js网页web无插件播放器选择全屏时,视频区域并没有全屏问题的解决方案

EasyPlayer.js H5播放器,是一款能够同时支持HTTP、HTTP-FLV、HLS(m3u8)、WS、WEBRTC、FMP4视频直播与视频点播等多种协议,支持H.264、H.265、AAC、G711A、MP3等多种音视频编码格式,支持MSE、WASM、WebCodec等多种解码方…

rocketmq5源码系列--(一)--搭建调试环境

说在前头:阿里的rocketmq的文档是真他妈的烂的1b,很多东西都不说,全靠自己看源码,摸索,草,真的要吐血了 rocketmq的版本5而不是版本4,版本5比版本4多了个proxy rocketmq5 三个组件:…

【网页设计】CSS3 进阶(动画篇)

1. CSS3 2D 转换 转换(transform)是CSS3中具有颠覆性的特征之一,可以实现元素的位移、旋转、缩放等效果 转换(transform)你可以简单理解为变形 移动:translate旋转:rotate缩放&#xf…

django安装与项目创建

一、安装 在终端输入 pip install django //或者()指定安装版本 pip install django2.2 二、创建项目 2.1创建项目 django-admin startproject 项目名 2.2Django 项目中的关键文件 _init_.py:将目录标识为python包setting.py:核心配置文件,定义项目…

【redis】—— 初识redis(redis基本特征、应用场景、以及重大版本说明)

序言 本文将引导读者探索Redis的世界,深入了解其发展历程、丰富特性、常见应用场景、使用技巧等,最后会对Redis演进过程中具有里程碑意义的版本进行详细解读。 目录 (一)初始redis (二)redis特性 &#…

SpringBoot学习记录(三)之多表查询

SpringBoot学习记录(三)之多表查询 一、多表查询概述1、数据准备2、介绍3、分类 二、内连接三、外连接四、子查询1、标量子查询2、列子查询3、行子查询4、表子查询 三、案例1、准备环境2、需求实现3、(附)数据准备 一、多表查询概…

泰矽微重磅发布超高集成度车规触控芯片TCAE10

市场背景 智能按键和智能表面作为汽车智能化的重要部分,目前正处于快速发展阶段,电容式触摸按键凭借其操作便利性与小体积的优势,在汽车内饰表面的应用越来越广泛。对于空调控制面板、档位控制器、座椅扶手、门饰板、车顶控制器等多路开关的…

HarmonyOs学习笔记-布局单位

鸿蒙开发中布局存在很多单位 鸿蒙的默认单位是vp 下方先展示一下在RrkTsUI中我们应该怎么书写,然后讲一下各大单位具体的含义。 Text("这是一个文本, 用默认单位进行展示,也就是vp") .width(100) .height(100);//此段代码与上方代码是一样的…

操作系统实验 C++实现生产者-消费者问题

实验目的 1、进一步加深理解进程同步的概念 2、加深对进程通信的理解 3、了解Linux下共享内存的使用方法 实验内容 1、按照下面要求,写两个c程序,分别是生产者producer.c以及customer.c 2、一组生产者和一组消费者进程共享一块环形缓冲区 使用共…

Easyexcel(1-注解使用)

文章链接&#xff1a; Easyexcel&#xff08;1-注解使用&#xff09; 版本依赖 <dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>3.3.3</version> </dependency>ExcelProperty 指定…

最新版xAI LLM 模型Grok-2 上线

xAI&#xff01;Grok-2 最新版开启公测&#xff01;”。这是我注册成功的截图&#xff0c;使用国内的邮箱就可以注册使用了&#xff01; Grok API公测与免费体验: Grok API开启公测&#xff0c;提供免费体验128k上下文支持&#xff0c;。Grok-Beta与马斯克: 马斯克庆祝特朗普当…

css数据不固定情况下,循环加不同背景颜色

<template><div><p v-for"(item, index) in items" :key"index" :class"getBackgroundClass(index)">{{ item }}</p></div> </template><script> export default {data() {return {items: [学不会1, …

MySQL的聚簇索引和二级索引

索引按照物理实现方式&#xff0c;索引可以分为 2 种&#xff1a;聚簇&#xff08;聚集&#xff09;和非聚簇&#xff08;非聚集&#xff09;索引。也可以把非聚集索引称为二级索引或者辅助索引。 一.聚簇索引 聚簇索引并不是一种单独的索引类型&#xff0c;而是一种数据存储方…

【Pytorch】torch.nn.functional模块中的非线性激活函数

在使用torch.nn.functional模块时&#xff0c;需要导入包&#xff1a; from torch.nn import functional 以下是常见激活函数的介绍以及对应的代码示例&#xff1a; tanh (双曲正切) 输出范围&#xff1a;(-1, 1) 特点&#xff1a;中心对称&#xff0c;适合处理归一化后的数据…

神经网络11-TFT模型的简单示例

Temporal Fusion Transformer (TFT) 是一种用于时间序列预测的深度学习模型&#xff0c;它结合了Transformer架构的优点和专门为时间序列设计的一些优化技术。TFT尤其擅长处理多变量时间序列数据&#xff0c;并且能够捕捉到长期依赖关系&#xff0c;同时通过自注意力机制有效地…

学习threejs,使用TWEEN插件实现动画

&#x1f468;‍⚕️ 主页&#xff1a; gis分享者 &#x1f468;‍⚕️ 感谢各位大佬 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍⚕️ 收录于专栏&#xff1a;threejs gis工程师 文章目录 一、&#x1f340;前言1.1 ☘️THREE.PLYLoader PLY模型加…

世界坐标系、相机坐标系、图像物理坐标系、像素平面坐标系

坐标系及其转换在计算机视觉领域占据核心地位。理解如何从一个坐标系转换到另一个坐标系&#xff0c;不仅是理论上的需要&#xff0c;也是实际应用中不可或缺的技能。 一、世界坐标系的定义 世界坐标系是一个全局的坐标系统&#xff0c;用于定义场景中物体的位置。在这个坐标…