网络编程TCP/IP和UDP以及HTTP协议

2023-05-16

OSI的七层模型和TCP/IP的四层模型:

TCP/IP协议是从OSI的七层模型中简化出来的:

四层模型的详图:

 

什么是HTTP协议:

HTTP称为 超文本传输协议 是一种基于应用层的通信协议,它允许将超文本标记语言(HTML)文档从Web服务器传送到客户端的浏览器,

所有的WWW文件都必须遵守这个标准. 目前我们使用的是HTTP/1.1 版本.

通常,由HTTP客户端发起一个请求,建立一个到服务器指定端口(默认是80端口)的TCP连接。HTTP服务器则在那个端口监听客户端发送过来的请求。一旦收到请求,服务器(向客户端)发回一个状态行,比如"HTTP/1.1 200 OK",和(响应的)消息,消息的消息体可能是请求的文件、错误消息、或者其它一些信息。

HTTP协议的网页 HTTP协议的网页

HTTP使用TCP而不是UDP的原因在于(打开)一个网页必须传送很多数据,而TCP协议提供传输控制,按顺序组织数据,和错误纠正。

什么是TCP/IP协议:

TCP协议是面向连接的通信协议,即在传输数据前先在发送端和接收端建立逻辑连接,然后再传输数据,它提供了两台计算机之间可靠无差错的数据传输。

追求安全、稳定或想控制流量的的时候可以使用TCP协议,如文件传输FTP,超文本链接HTTP。

在TCP连接中必须要明确客户端与服务器端,由客户端向服务端发出连接请求,每次连接的创建都需要经过“三次握手”。

确认连接的三次握手:

第一次握手,客户端向服务器端发出连接请求,等待服务器确认,

第二次握手,服务器端向客户端回送响应确认,通知客户端收到了连接请求,

第三次握手,客户端再次向服务器端发送确认信息,确认连接。

整个交互过程如下图所示:

 

 服务端code:



import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

/**
 * 实现TCP协议的服务器端
 * 便是服务器程序的类: java.net.ServerSocket
 * 构造方法:
 *    ServerSocket(int port) 传递端口号
 *
 * 服务端无法自己创建Socket类,需要获取到客户端的Socket套接字对象
 * (服务端接收到很多客户端链接申请,无法知道是那个客户端的申请,所以需要服务端获取到客户端的Socket套接字对象.来确定那个客户端的申请)
 * 方法:
 *   Socket accept()
 */
public class TCPServerSocket {
    public static void main(String []args)throws IOException {
        //创建服务器程序类.
        ServerSocket serversocket = new ServerSocket(7777);
        //使用服务器程序类Socket accept()方法获取客户端套接字Socket类对象
        Socket socket = serversocket.accept();
        //通过套接字获取到,字节输入流对象
        InputStream ips = socket.getInputStream();
        //创建字节数组,存储输入流读取客户端的字节数据
        byte[] bytes = new byte[1024];
        int len = ips.read(bytes);
        System.out.println(new String(bytes,0,len));
        //向客户端传递数据
        OutputStream pts = socket.getOutputStream();
        pts.write("服务器".getBytes());
        //关闭资源
        pts.close();
        ips.close();
        socket.close();
    }
}

客户端code:

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;

/**
 * 此类实现TCP协议的客户端,链接到服务器
 * 和服务器实现数据交换
 * 实现TCP客户端程序类 java.net.Socket
 *
 * 构造方法:
 *   Socket(String host,int port) 传递服务器IP和端口号
 *   注意构造器一旦运行就会和服务器进行链接,链接失败,抛出异常
 *
 * 由于是在互联网传输数据使用的字节输出流和字节输入流必须使用Socket类的getxxxxx()方法返回的字节输出流和输入流对象
 * Socket 被称呼为套接字
 *
 * 输出流和输入方法:
 *    OutputStream getOutputStream() 返回套接字的输出流
 *    作用:将数据输出,输出到服务器 (服务器运行Socket方法获取到套接字输出流则输出到Socket对象客户端)
 *
 *    InputStream getInputStream() 返回套接字输入流
 *    作用:从服务端中读取数据 (服务器运行Socket方法获取到套接字输入流则读取客户端数据)
 */
public class TCPSocket {
    public static void main(String []args)throws IOException{
        //创建Socket类对象,链接服务器
        Socket socket = new Socket("127.0.0.1",7777);
        //通过客户端套接字对象Socket方法,获取字节输出流,将数据写入服务器
        OutputStream ops = socket.getOutputStream();
        //字节输出流,传递只能是字节,传递字节数组
        ops.write("客户端".getBytes());
        //读取服务器传递的数据
        InputStream ips = socket.getInputStream();
        byte[] bytes = new byte[1024];
        int len = ips.read(bytes);
        System.out.println(new String(bytes,0,len));
        //关闭资源
        ips.close();
        ops.close();
        socket.close();
    }
}

 

断开连接的四次挥手

由于TCP连接是全双工的,因此每个方向都必须单独进行关闭。原则是主动关闭的一方(如已传输完所有数据等原因)发送一个FIN报文来表示终止这个方向的连接,收到一个FIN意味着这个方向不再有数据流动,但另一个方向仍能继续发送数据,直到另一个方向也发送FIN报文。四次挥手的具体过程如下:

  • 客户端发送一个FIN报文(报文4)给服务器,表示我将关闭客户端到服务器端这个方向的连接。
  • 服务器收到报文4后,发送一个ACK报文(报文5)给客户端,序号为报文4的序号加1。
  • 服务器发送一个FIN报文(报文6)给客户端,表示自己也将关闭服务器端到客户端这个方向的连接。
  • 客户端收到报文6后,发回一个ACK报文(报文7)给服务器,序号为报文6的序号加1。

简述:

第一次挥手: 客户端请求断开连接,等待服务器端确认(FIN)

第二次挥手: 服务端向客户端响应一个确认(ACK)

第三次挥手: 服务端向客户端发送断开连接,等待客户端确认,(FIN)

第四次挥手: 客户端响应给服务端确认(ACK)

什么是UDP协议:

UDP是无连接通信协议,即在数据传输时,数据的发送端和接收端不建立逻辑连接。简单来说,当一台计算机向另外一台计算机发送数据时,发送端不会确认接收端是否存在,就会发出数据,同样接收端在收到数据时,也不会向发送端反馈是否收到数据。

由于使用UDP协议消耗资源小,通信效率高,所以通常都会用于音频、视频和普通数据的传输例如视频会议都使用UDP协议,因为这种情况即使偶尔丢失一两个数据包,也不会对接收结果产生太大影响。

但是在使用UDP协议传送数据时,由于UDP的面向无连接性,不能保证数据的完整性,因此在传输重要数据时不建议使用UDP协议。UDP的交换过程如下图所示。

 在Java代码上实现:

UDP是一种面向无连接的协议,因此,在通信时发送端和接收端不用建立连接。UDP通信的过程就像是货运公司在两个码头间发送货物一样。在码头发送和接收货物时都需要使用集装箱来装载货物,UDP通信也是一样,发送和接收的数据也需要使用“集装箱”进行打包,为此JDK中提供了一个DatagramPacket类,该类的实例对象就相当于一个集装箱,用于封装UDP通信中发送或者接收的数据。

DatagramPacket 集装箱

DatagramPacket 集装箱的构造器:

  • 使用该构造方法在创建DatagramPacket对象时,指定了封装数据的字节数组和数据的大小,没有指定IP地址和端口号。很明显,这样的对象只能用于接收端,不能用于发送端。因为发送端一定要明确指出数据的目的地(ip地址和端口号),而接收端不需要明确知道数据的来源,只需要接收到数据即可。 

  • 使用该构造方法在创建DatagramPacket对象时,不仅指定了封装数据的字节数组和数据的大小,还指定了数据包的目标IP地址(addr)和端口号(port)。该对象通常用于发送端,因为在发送数据时必须指定接收端的IP地址和端口号,就好像发送货物的集装箱上面必须标明接收人的地址一样。 

DatagramPacket 集装箱的函数:

 DatagramSocket 码头:

然而运输货物只有“集装箱”是不够的,还需要有码头。在程序中需要实现通信只有DatagramPacket数据包也同样不行,为此JDK中提供的一个DatagramSocket类。DatagramSocket类的作用就类似于码头,使用这个类的实例对象就可以发送和接收DatagramPacket数据包,发送数据的过程如下图所示。

DatagramSocket 码头的构造器:

  • 该构造方法用于创建发送端的DatagramSocket对象,在创建DatagramSocket对象时,并没有指定端口号,此时,系统会分配一个没有被其它网络程序所使用的端口号。

  • 该构造方法既可用于创建接收端的DatagramSocket对象,又可以创建发送端的DatagramSocket对象,在创建接收端的DatagramSocket对象时,必须要指定一个端口号,这样就可以监听指定的端口。

DatagramSocket 码头的函数:

 

发送端code:

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

/**
 * 实现UDP协议的发送端
 *  UDP发送端和接收端必须有DatagramPacket类对象和DatagramSocket类对象
 *  发送端使用DatagramPacket类封装数据包使用DatagramSocket类发送数据包
 *  接收端需要DatagramSocket类接收数据包使用DatagramPacket类拆封数据包
 *
 *      实现封装数据类 java.net.DatagramPacket  将数据封装为数据包
 *      实现数据包传输类 java.net.DatagramSocket 将数据包发出去
 *
 * 实现步骤:
 *  1.创建DatagramPacket 对象封装数据,接收的地址和端口
 *  2.创建DatagramSocket 对象
 *  3.调用DatagramSocket 类send(DatagramPacket dp)方法传递数据包,发送数据包
 *  4.关闭资源close();
 *
 *  DatagramPacket构造方法:
 *     DatagramPacket(byte[] buf,int length,InetAddress address,int port)
 *     buf: 字节数组
 *     length: 需要传递的数组元素个数
 *     address: 需要发送的主机地址
 *     port: 端口号
 *
 *  DatagramSocket构造方法:
 *     DatagramSocket()
 *     方法:send(DatagramPacket dp)
 */
public class UDPSend {
    public static void main(String []args)throws IOException{
        //创建数据包对象,封装要发送的数据,接收端ip,端口
        byte[] data = "UDP发送".getBytes();
        InetAddress address = InetAddress.getByName("127.0.0.1");//ip: 127.0.0.1 是指本机
        //封装数据包
        DatagramPacket dp = new DatagramPacket(data,data.length,address,6000);
        //创建发送数据包
        DatagramSocket ds = new DatagramSocket();
        //调用发送数据包方法传递数据包对象
        ds.send(dp);
        //关闭资源
        ds.close();
    }
}

接收端code:



import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

/**
 * 实现UDP接收端
 *      实现拆封数据包 java.net.DatagramPacket 调用方法对数据包拆包
 *      实现接收数据包 java.net.DatagramSocket 接收数据包端口调用方法封装数据包到DatagramPacket类对象
 *
 * 实现步骤:
 *   1.创建DatagramSocket对象,绑定端口号  必须要和发送端(发送数据包到的端口号)一致
 *   2.创建字节数组,接收发来的数据
 *   3.创建DatagramPacket类对象
 *   4.调用DatagramSocket对象方法  receive(DatagramPacket dp) 接收数据,将数据封装到数据包对象中
 *   5.拆包
 *      发送端ip地址
 *        数据包对象DatagramPacket类方法getAddress()返回封装ip地址对象
 *      接收到的字节个数
 *        数据包对象DatagramPacket类方法getLength() 返回数据包中的字节数组长度
 *      发送方的端口
 *        数据包对象DatagramPacket类方法getport() 返回发送或接收端的端口号
 *   6.关闭资源
 */
public class UDPReceive {
    public static void main(String []args)throws IOException{
        //在构造方法中指定端口号
        DatagramSocket ds = new DatagramSocket(6000);
        //由于是接收,所以只指定数组长度 一般指定数组长度为 64kb(也就是1024*64)
        byte[] bytes = new byte[1024];//但是由于我们发送的信息少所以数组长度指定为1kb
        //第一个参数传递字节数组用于接收拆封数据包后的数据 第二个参数传递需要接收的数组长度
        DatagramPacket dp = new DatagramPacket(bytes,bytes.length);
        //调用接收端方法接收数据,传递封装数据包对象
        ds.receive(dp);

        //调用getAddress() 返回主机地址对象(数据包中封装了发送端的主机ip和名字)
        InetAddress ip = dp.getAddress();
        System.out.println(ip.getHostAddress()+"  "+ip.getHostName());

        //获取接收到的字节个数
        int length = dp.getLength();
        System.out.println(length);
        //获取发送方的端口号
        int port = dp.getPort();
        System.out.println(port);

        //使用字符串格式打印字节数组
        System.out.println(new String(bytes,0,length));//由于我们接收端的数组长度过长造成资源浪费所以使用字符串的构造方法指定数组中间段的数据
        //关闭资源
        ds.close();
    }
}

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

网络编程TCP/IP和UDP以及HTTP协议 的相关文章

  • 基本矩阵、本质矩阵和单应矩阵

    两幅视图存在两个关系 xff1a 第一种 xff0c 通过对极几何一幅图像上的点可以确定另外一幅图像上的一条直线 xff1b 另外一种 xff0c 通过上一种映射 xff0c 一幅图像上的点可以确定另外一幅图像上的一个点 xff0c 这个点
  • 矩阵零空间

    矩阵A的零空间就Ax 61 0的解的集合 零空间的求法 xff1a 对矩阵A进行消元求得主变量和自由变量 xff1b 给自由变量赋值得到特解 xff1b 对特解进行线性组合得到零空间 假设矩阵如下 xff1a 对矩阵A进行高斯消元得到上三角
  • VIO学习总结

    VIO xff08 visual inertial odometry xff09 即视觉惯性里程计 xff0c 有时也叫视觉惯性系统 xff08 VINS xff0c visual inertial system xff09 xff0c 是
  • 单应性(Homography)变换

    我们已经得到了像素坐标系和世界坐标系下的坐标映射关系 xff1a 其中 xff0c u v表示像素坐标系中的坐标 xff0c s表示尺度因子 xff0c fx fy u0 v0 xff08 由于制造误差产生的两个坐标轴偏斜参数 xff0c
  • senmantic slam mapping

    basicStructure hpp common h 定义一些常用的结构体 以及各种可能用到的头文件 xff0c 放在一起方便include 相机内参模型 增加了畸变参数 xff0c common headers h各种可能用到的头文件
  • Ubuntu 20.04 VNC 安装与设置

    原链接 VNC是一个远程桌面协议 按照本文的说明进行操作可以实现用VNC对Ubuntu 20 04进行远程控制 一般的VNC安装方式在主机没有插显示器的时候是无法使用的 下面的操作可以在主机有显示器和没有显示器时都能够正常工作 首先安装x1
  • opencv中类型转换问题

    记录一下最近困惑我的问题 方便以后查阅 在学习立体匹配算法中BM算法时 xff0c 出现在了关于类型转换的问题 xff1a disp convertTo disp8u CV 8U 255 numberOfDisparities 16 不知道
  • 最大似然估计MLE与贝叶斯估计

    最大似然估计 Maximum Likehood Estimation MLE 最大似然估计的核心思想是 xff1a 找到参数 的一个估计值 xff0c 使得当前样本出现的可能性最大 用当年博主老板的一句话来说就是 xff1a 谁大像谁 xf
  • 大疆Livox_mid 40雷达初体验

    为了解决无人车上镭神雷达FOV小而导致的车前3m内无法看到锥形桶问题 东家给公司邮寄了一台大疆的mid40雷达 不得不说 颜值真的高 光看颜值 就甩镭神几条街 昨天重新配置镭神的激光雷达 官方给的配置软件 真的是 用的我心碎啊 算了 不提了
  • 地铁供电系统的构成

    地铁供电系统一般划分为以下几部分 xff1a 外部电源 xff1b 主变电所 xff1b 牵引供电系统 xff1b 动力照明系统和杂散电流腐蚀防护系统 xff1b 电力监控系统 外部电源地铁供电系统的外部电源就是地铁供电系统主变电所供电的外
  • C++ Vector常用函数

    C 43 43 Vector常用函数 begin 函数 原型 xff1a iterator begin const iterator begin 功能 xff1a 返回一个当前vector容器中起始元素的迭代器 end 函数 原型 xff1
  • STM32使用ADC获取内部温度传感器数据输出(直接读取/DMA两种方式实现)

    STM32使用ADC获取内部温度传感器数据输出 xff08 直接读取 DMA两种方式实现 xff09 前言一 内部温度传感器的使用 xff1f 二 代码操作讲解1 直接读取2 DMA处理 总结 前言 STM32F1系列 xff08 本代码基
  • fp32/fp64精度,4/8字节16进制转float/double十进制

    1 IEEE 754 32位单精度浮点数 xff08 4字节 xff09 1 1 32位单精度浮点数 其中 xff0c 32位16进制数包括1位符号位 SIGN xff0c 8位指数位 EXPONENT 和 23位尾数位 MANTISSA
  • SVG绘制圆环进度条

    在我们的大屏可视化项目中 xff0c 经常会用到各种各样的图表 与传统的表格展示 枯燥的文字阐述相比 xff0c 图表展示则使用户看起来更加直观 数据的展示则更加一目了然 本文基于svg绘图技术结合前端技术栈vue xff0c 以工作中常用
  • Canvas绘制地图

    在我们的大屏可视化项目中 xff0c 地图数据可视化是最常见功能 地图数据可视化目前的实现方案有很多 xff0c 其中最具有代表性的莫过于使用echarts xff0c 引入一个js文件 xff0c 再加上一些简单的配置 xff0c 这样一
  • 滚动动画(跑马灯动画)的几种实现方式

    在大屏可视化应用中 xff0c 滚动动效 xff08 跑马灯效果 xff09 也是常见的一种数据展现方式 xff0c 本章节针对字幕滚动和列表滚动效果做一个小小的总结 xff0c 结合vue框架 xff0c 具体展示效果如下 xff0c 从
  • 如何在Ubuntu上安装CUDA

    原链接 在Ubuntu上安装CUDA一直是比较麻烦的事情 由于不同版本的CUDA对显卡驱动有着不同的需求 而在有些电脑上安装最新的Nvidia闭源显卡驱动会导致无法进入图形界面 CUDA中也自带了Nvidia的显卡驱动 xff0c 但是如果
  • 加载loading动画

    提起加载 xff08 loading xff09 效果 xff0c 想必大家都不会陌生 xff0c 在目前的移动端 PC端 各类app均广泛使用 xff0c 使用loading动画能显著提升用户的交互体检 xff0c 尤其是在页面加载速度比
  • CSS锥形渐变实现环形进度条

    10月份因为疫情原因 又开启了居家办公模式 xff0c 空闲之余 xff0c 与其选择 躺平 xff0c 不如去做一些有意义的事情 xff0c 内心的想法驱使着我去做些什么 xff0c 但是又没有合适的素材 xff0c 直到接手了最近的一个
  • CSS实现个性化水球图

    在可视化应用中 xff0c 水球图也是一种常见的数据展示形式 xff0c 关于使用CSS实现个性化水球 xff0c 在相当长的一段时间并没有找到比较简洁的实现方式 xff0c 因此在以往的可视化作品中 xff0c 大多采用echarts插件

随机推荐

  • CSS实现3D球面字符云

    在大屏可视化应用中 xff0c 使用3D的场景有很多 xff0c 复杂的交互动画通常是使用Three js或echarts gl来实现 xff0c 但是在一些简单的3D场景中 xff0c CSS也可以实现一些不错的展示效果 本文使用CSS相
  • CSS实现渐变仪表盘的简单尝试

    在 CSS锥形渐变实现环形进度条 一章中 xff0c 讲解了实现渐变进度条的一点思路 xff0c 基于此思路 xff0c 本章节尝试性的使用CSS实现一个简单的渐变仪表盘 xff0c 给大家提供一些借鉴 实现角向渐变 xff0c 不得不提一
  • 【opencv】OpenCV开发环境配置(C++)

    软件版本 opencv 4 7 0 windowsvisual studio 2022 环境配置 1 创建项目 打开VS 2022 xff0c 点击创建新项目 点击项目 gt 点击属性 2 添加包含目录 点击VC 43 43 目录 gt 点
  • 1、什么是网络前缀

    基础知识 xff1a 1 已知一个IP地址 xff0c 如何区分它是A类地址还是B类或者C类地址呢 A类地址 1 0 0 0 到126 0 0 0 0 0 0 0 和127 0 0 0保留 B 类地址 128 1 0 0到191 254 0
  • ZYNQ petalinux设置固定IP地址

    背景 xff1a zynq petalinux在开机自启动以后ifconfig设置ip xff0c 然后运行应用程序 xff1b 如果设备没有串口且程序在启动过程中用Wireshark抓取不到信息 xff0c 这时 xff0c 就要使用固定
  • 10、IEEE802.3和Ethernet II帧的区别, 0x0806 ARP协议分析

    一 IEEE802 3和Ethernet II帧的区别 概念 xff1a 1 以太网上使用两种标准帧格式 第一种是上世纪80年代提出的DIX v2格式 xff0c 即Ethernet II格式 第二种是1983年提出的IEEE 802 3格
  • W10: Warning: Changing a readonly file使用vi/vim报错问题解决(使用管理员也不能修改)

    使用vi vim编辑文件的时候出现W10 Warning Changing a readonly file报错 解决方法 xff1a 一 强制保存退出 xff1a wq 二 ll 查询文件属主 xff0c 使用属主赋予权限 chmod u
  • 使用Galileo SDK跨局域网遥控机器人

    原链接 GalileoSDK是由我们开发的机器人导航系统SDK 通过SDK用户能够方便的操控机器人 现在小强用户已经可以免费体验到SDK的功能了 SDK内部集成了物联网连接功能 设置完成后用户能够通过SDK跨局域网遥控和获取机器人状态 下面
  • zcu102网口不通

    新建工程采用的板子默认配置 xff0c 启动后执行命令 xff1b dmesg grep ethernet 1 545671 macb ff0e0000 ethernet Not enabling partial store and for
  • zcu102开发板实现 虚拟jtag

    开发板zcu102 xff1b petalinux2020 1 需要自备一个FMC转JTAG的子卡 xff1b 此篇记录自己实现的过程 xff0c 以备查询 xff1b 1 整个流程连接 xff1a https xilinx wiki at
  • 查看ubuntu系统的版本信息、内存大小及使用、磁盘大小等常用命令

    一 ubuntu系统的版本信息 xff1a 方法 步骤 xff1a 1 进入Ubuntu系统 xff0c 点击左侧图标栏中的黑框 xff0c 打开终端 xff1b 2 左侧没有终端图标的情况 xff0c 可以搜索按钮 图中左侧第一个 xff
  • CentOS7 无法进入图形界面 黑屏

    问题现象描述 xff1a CentOS有界面的系统 xff0c 开机后进入界面 xff0c 在开机界面背景为 7 的地方卡住 xff0c 然后界面就黑掉 解决办法 xff1a 1 开机后 xff0c 按下 ctrl 43 alt 43 F2
  • 重装win10提示“Windows无法安装到这个磁盘,选中的磁盘具有MBR分区表,在EFI系统上,windows只能安装...”

    背景 xff1a 因为GHOST系统会捆绑大量软件 xff0c 主页被强制修改 xff0c 并且系统还可能存在删减的可能性 xff0c 所以越来越多的用户考虑安装官方MSDN原版系统 xff0c 但是呢 xff0c 近期总是有用户称自己在安
  • 在petalinux下提示:Failed to menu config project component....

    现象 xff1a 在petalinux下配置硬件描述语言时 xff0c 提示错误 xff1a 命令 xff1a petalinux config get hw description 61 hdf path 错误提示 xff1a ERROR
  • petalinux下修改系统空间笔记

    该文档是自己记录的笔记 xff0c 方便后面自己查看 在petalinux设置系统空间中需要注意的点 xff01 1 在menuconfig界面下设置系统空间为了在内核启动输出显示 xff1b Subsystem AUTO Hardware
  • PetaLinux 去除用户登陆 (Login into target without pass word)

    PetaLinux 自动登录登陆 1 初始化 PetaLinux 运行环境 xff1a source PetaLinux安装目录 settings sh 2 更改 PetaLinux 配置 xff1a 1 cd 到项目工程目录下 xff1b
  • PetaLinux 使用外部代码 (u-boot)

    背景 xff1a 在petalinux编译工程时 xff0c 我们可能有修改u boot源码的需求 xff0c 这时就需要我们使用外部的代码进行编译 实现步骤 xff1a 在配置前 xff0c 请确认我们已经在github上把对应的uboo
  • 异常的抛出和处理

    自定义输出异常 package error import java util ArrayList public class Exception public static void main String args TODO Auto ge
  • 在ROS中使用UDP进行通信

    原链接 ROS的网络通信提供了两种方式 xff0c 一种是TCP协议 xff0c 一种是UDP协议 默认采用TCP进行通信 但是在实际的WIFI网络使用中发现用户经常反馈客户端和机器人连接中断且无法重新建立连接 在ROS wiki中官方也有
  • 网络编程TCP/IP和UDP以及HTTP协议

    OSI的七层模型和TCP IP的四层模型 TCP IP协议是从OSI的七层模型中简化出来的 四层模型的详图 什么是HTTP协议 HTTP称为 超文本传输协议 是一种基于应用层的通信协议 xff0c 它允许将超文本标记语言 HTML 文档从W