网络编程_TCP/UDP编程

2023-05-16

网络编程

一、网络通信要素

1.1 IP地址

1.1.1 概述

IP指互联网协议地址(Internet Protocol Address),俗称IP。IP地址用来给一个网络中的计算机设备做唯一的编号。

1.1.2 分类

IP地址分类方式1

  • IPv4:是一个32位的二进制数,通常被分为4个字节,表示成a.b.c.d 的形式,例如192.168.65.100 。其中a、b、c、d都是0~255之间的十进制整数,那么最多可以表示42亿个。
  • IPv6:采用128位地址长度,每16个字节一组,分成8组十六进制数,表示成ABCD:EF01:2345:6789:ABCD:EF01:2345:6789

IP地址分类方式2

公网地址(万维网使用)和私有地址(局域网使用)。192.168.开头的就是私有址址,范围即为192.168.0.0–192.168.255.255,专门为组织机构内部使用。

1.2 端口号

​ IP地址可以唯一标识网络中的设备端口号就可以唯一标识设备中的进程(应用程序)。

​ **端口号:用两个字节表示的整数,它的取值范围是065535**。其中,01023之间的端口号用于一些知名的网络服务和应用,普通的应用程序需要使用1024以上的端口号。如果端口号被另外一个服务或应用所占用,会导致当前程序启动失败。

1.3 网络通信协议

1.3.1 概述

​ **网络通信协议:**通过计算机网络可以使多台计算机实现连接,位于同一个网络中的计算机在进行连接和通信时需要遵守一定的规则,(对速率、传输代码、代码结构、传输控制步骤、出错控制等制定标准)。

TCP/IP协议: 传输控制协议/因特网互联协议( Transmission Control Protocol/Internet Protocol),是Internet最基本、最广泛的协议。它定义了计算机如何连入因特网,以及数据如何在它们之间传输的标准。它的内部包含一系列的用于处理数据通信的协议,并采用了4层的分层模型,每一层都呼叫它的下一层所提供的协议来完成自己的需求。

参考模型如下图:

上图中,TCP/IP协议中的四层分别是应用层、传输层、网络层和链路层,每层分别负责不同的通信功能。
链路层:链路层是用于定义物理传输通道,通常是对某些网络连接设备的驱动协议,例如针对光纤、网线提供的驱动。
网络层:网络层是整个TCP/IP协议的核心,它主要用于将传输的数据进行分组,将分组数据发送到目标计算机或者网络。
运输层:主要使网络程序进行通信,在进行网络通信时,可以采用TCP协议,也可以采用UDP协议。
应用层:主要负责应用程序的协议,例如HTTP协议、FTP协议等。

1.3.2 协议分类

  • UDP协议

    • 将数据、源、目的封装成数据包,不需要建立连接。
    • 每个数据报的大小限制在64K内。
    • 发送不管对方是否准备好,接收方收到也不确认,故是不可靠的。
    • 可以广播发送。
    • 发送数据结束时无需释放资源,开销小,速度快。
  • TCP协议

    • 使用TCP协议前,须先建立TCP连接,形成传输数据通道。
    • 传输前,采用“三次握手”方式,点对点通信,是可靠的。
    • TCP协议进行通信的两个应用进程:客户端、服务端。
    • 在连接中可进行大数据量的传输。
    • 传输完毕,需释放已建立的连接,效率低。
  • 三次握手:TCP协议中,在发送数据的准备阶段,客户端与服务器之间的三次交互,以保证连接的可靠。

    • 第一次握手,客户端向服务器端发出连接请求,等待服务器确认。
    • 第二次握手,服务器端向客户端回送一个响应,通知客户端收到了连接请求。
    • 第三次握手,客户端再次向服务器端发送确认信息,确认连接。整个交互过程如下图所示。

​ 利用协议+IP地址+端口号 三元组合,就可以标识网络中的进程了,那么进程间的通信就可以利用这个标识与其它进程进行交互。

二、TCP编程

2.1 概述

TCP通信能实现两台计算机之间的数据交互,通信的两端,要严格区分为客户端(Client)与服务端(Server)。

两端通信时步骤:

  1. 服务端程序,需要事先启动,等待客户端的连接。
  2. 客户端主动连接服务器端,连接成功才能通信。服务端不可以主动连接客户端。

在Java中,提供了两个类用于实现TCP通信程序:

  1. 客户端:java.net.Socket 类表示。创建Socket对象,向服务端发出连接请求,服务端响应请求,两者建立连接开始通信。
  2. 服务端:java.net.ServerSocket 类表示。创建ServerSocket对象,相当于开启一个服务,并等待客户端的连接。

2.2 socket类

Socket 类:该类实现客户端套接字,套接字指的是两台设备之间通讯的端点。

2.2.1 构造方法

  • public Socket(String host, int port) :创建套接字对象并将其连接到指定主机上的指定端口号。如果指定的host是null ,则相当于指定地址为回送地址。

2.2.2 成员方法

  • public InputStream getInputStream() : 返回此套接字的输入流。
    • 如果此Scoket具有相关联的通道,则生成的InputStream 的所有操作也关联该通道。
    • 关闭生成的InputStream也将关闭相关的Socket。
  • public OutputStream getOutputStream() : 返回此套接字的输出流。
    • 如果此Scoket具有相关联的通道,则生成的OutputStream 的所有操作也关联该通道。
    • 关闭生成的OutputStream也将关闭相关的Socket。
  • public void close() :关闭此套接字。
    • 一旦一个socket被关闭,它不可再使用。
    • 关闭此socket也将关闭相关的InputStream和OutputStream 。
  • public void shutdownOutput() : 禁用此套接字的输出流。
    • 任何先前写出的数据将被发送,随后终止输出流。

2.3 ServerSocket类

ServerSocket类:这个类实现了服务器套接字,该对象等待通过网络的请求。

2.3.1 构造方法

  • public ServerSocket(int port) :使用该构造方法在创建ServerSocket对象时,就可以将其绑定到一个指定的端口号上,参数port就是端口号。

2.3.2 成员方法

  • public Socket accept() :侦听并接受连接,返回一个新的Socket对象,用于和客户端实现通信。该方法会一直阻塞直到建立连接。

2.4 编程步骤

客户端Socket的工作过程包含以下四个基本的步骤

  1. 创建 Socket:根据指定服务端的 IP 地址或端口号构造 Socket 类对象。若服务器端
    响应,则建立客户端到服务器的通信线路。若连接失败,会出现异常。
  2. 打开连接到 Socket 的输入/出流: 使用 getInputStream()方法获得输入流,使用
    getOutputStream()方法获得输出流,进行数据传输
  3. 按照一定的协议对 Socket 进行读/写操作:通过输入流读取服务器放入线路的信息
    (但不能读取自己放入线路的信息),通过输出流将信息写入线程。
  4. 关闭 Socket:断开客户端到服务器的连接,释放线路

服务器程序的工作过程包含以下四个基本的步骤

  1. 调用 ServerSocket(int port) :创建一个服务器端套接字,并绑定到指定端口
    上。用于监听客户端的请求。
  2. 调用 accept():监听连接请求,如果客户端请求连接,则接受连接,返回通信
    套接字对象。
  3. 调用 该Socket类对象的 getOutputStream()getInputStream ()获取输出
    流和输入流,开始网络数据的发送和接收。
  4. 关闭ServerSocket和Socket对象:客户端访问结束,关闭通信套接字。

2.5 简单TCP通信代码演示

客户端:

public class TCPClient {
    public static void main(String[] args) throws IOException {
        InetAddress inet = InetAddress.getByName("127.0.0.1");
        Socket socket = new Socket(inet, 9999);

        OutputStream os = socket.getOutputStream();
        os.write("你好我是客户端".getBytes());

        os.close();
        socket.close();
        System.out.println("传输完毕!");
    }
}

服务端:

public class TCPServer {
    public static void main(String[] args) throws IOException {
        System.out.println("服务器已开启...");
        ServerSocket ss = new ServerSocket(9999);
        Socket accept = ss.accept();
        InputStream is = accept.getInputStream();
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        byte[] bytes = new byte[20];
        int len = 0;
        while ((len = is.read(bytes)) != -1) {
            baos.write(bytes, 0, len);
        }
        System.out.println(baos.toString());
        baos.close();
        is.close();
        accept.close();
        ss.close();
    }
}

三、UDP编程

3.1 概述

DatagramSocketDatagramPacket 实现了基于 UDP 协议网络程序。UDP数据报通过数据报套接字 DatagramSocket 发送和接收,系统不保证UDP数据报一定能够安全送到目的地,也不能确定什么时候可以抵达。

3.2 DatagramSocket类

3.2.1 构造方法

  • public DatagramSocket(int port):创建数据报套接字并将其绑定到本地主机上的指定端口。

3.2.2 成员方法

  • public void send(DatagramPacket p):从此套接字发送数据报包。DatagramPacket 包含的信息指示:将要发送的数据、其长度、远程主机的IP地址和远程主机的端口号。
  • public void receive(DatagramPacket p):从此套接字接收数据报包。
  • public InetAddress getLocalAddress():获取套接字绑定的本地地址。
  • public int getLocalPort():返回此套接字绑定的本地主机上的端口号。

3.3 DatagramPacket类

3.2.1 构造方法

  • public DatagramPacket(byte[] buf,int length):构造 DatagramPacket,用来接收长度为 length 的数据包。
  • public DatagramPacket(byte[] buf,int length,InetAddress address,int port):构造数据报包,用来将长度为 length 的包发送到指定主机上的指定端口号。

3.2.2 成员方法

  • public InetAddress getAddress():返回某台机器的 IP 地址,此数据报将要发往该机器或者是从该机器接收到的。
  • public byte[] getData():返回数据缓冲区。接收到的或将要发送的数据从缓冲区中的偏移量 offset 处开始,持续 length 长度。
  • public int getLength():返回将要发送或接收到的数据的长度。

3.3 编程步骤

流 程:

  1. DatagramSocketDatagramPacket
  2. 建立发送端,接收端
  3. 建立数据包
  4. 调用Socket的发送、接收方法
  5. 关闭Socket

3.4 简单UDP通信代码演示

客户端:

public class UDPClient {
    public static void main(String[] args) throws IOException {
        DatagramSocket socket = new DatagramSocket();

        String str="我是UDP方式发送的信息";
        byte[] bytes = str.getBytes();
        InetAddress inet = InetAddress.getByName("localhost");
        DatagramPacket packet = new DatagramPacket(bytes,bytes.length,inet,8888);

        socket.send(packet);

        socket.close();
    }
}

服务端:

public class UDPServer {
    public static void main(String[] args) throws IOException {
        DatagramSocket socket = new DatagramSocket(8888);
        byte[] bytes = new byte[1024];
        DatagramPacket packet = new DatagramPacket(bytes,bytes.length);
        socket.receive(packet);
        System.out.println(new String(packet.getData(),0,packet.getLength()));
        socket.close();
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

网络编程_TCP/UDP编程 的相关文章

随机推荐

  • teleop_twist_joy 游戏手柄ros使用

    参考 xff1a wiki官网链接 https github com ros teleop teleop twist joy git 查看每个按钮和轴对应的索引以及键值 span class token comment 1 通过话题查看 s
  • ROS melodic+opencv4 修改cv_bridge配置文件

    参考 xff1a Ubuntu18 04 43 ROS melodic 43 opencv4 修改cv bridge配置文件 xff0c 解决ROS使用不同版本opencv的冲突问题 Ubuntu18 04 ros melodic open
  • 使用ROS调用YOLO_V5(非darknet),利用ros-yolov5配置

    参考 xff1a 源码 安装YOLO V5环境以及测试 NVIDIA Jetson Xavier AGX平台 0 ros yolo5介绍 实现yolo作为service的server 发送sensor Imge 图片 得到yolo检测的结果
  • ROS仿真环境配置Husky+32线激光雷达+深度相机+imu+gps

    0 参考 wiki HUSKY 官网 git HUSKY HUSKY gazebo Tutorials 代码资源 husky base xff1a 与板载MCU通信的硬件驱动程序 husky bringup xff1a 调出启动文件和脚本
  • ros中使用Docker(2)VNC

    使用paopao机器人的ros vnc 镜像 dockerhub xff1a paopaorobot ros vnc网址 按照官网操作即可 下载镜像 span class token function docker span pull pa
  • winform窗体应用程序

    在C 编程环境中 xff1a winform窗体应用程序是一种客户端程序 xff0c 可以用来获取和显示数据 首先新建一个窗体应用程序项目 xff0c 在建完一个项目后可以看到有两个 cs类库文件 xff1a Form1 cs 和Progr
  • 3D目标跟踪(2)点云聚类

    点云聚类流程
  • GCAN -212(R2) can转网 使用记录

    GCAN 212 R2 使用udp模式 在配置软件进行配置 选择udp模式 xff1b 选择Remote IP 为本机PC的IP地址 xff1b 编写ROS程序 未完成 参考程序1 参考程序2 节点数据驱动 xff1a 主线程udp接收数据
  • 分卷压缩与分卷解压

    span class token comment 1 分卷压缩 span span class token function tar span cvzpf myfile span class token operator span span
  • java 域的概念_java中的域,静态域,实例域

    1 java中的域 所谓的域 xff0c 翻译成英文就是field xff0c 也就是我们常说的字段 xff0c 或者说是属性 比如类的字段 属性 xff0c 局部的 xff0c 全局的 所谓域 xff0c 其实是 field 的翻译 然后
  • mysql 字段最右匹配_【MySQL】-索引优化

    优化口诀 xff1a 全值匹配我最爱 xff0c 最左前缀要遵守 xff1b 带头大哥不能死 xff0c 中间兄弟不能断 xff1b 索引列上少计算 xff0c 范围之后全失效 xff1b Like百分写最右 xff0c 覆盖索引不写星 x
  • Meta-learning:Learn to learn

    基于李宏毅教授的ML课程做的笔记 xff0c 主要供自己复习 xff0c 所以就留下了一些自己想多看的东西 xff0c b站有全面的课程视频 引言 xff1a 为什么few shot任务常常提及元学习meta learning xff1f
  • Hadoop----hdfs dfs常用命令

    span class token operator span mkdir 创建目录 hdfs dfs span class token operator span mkdir span class token punctuation spa
  • 如何处罚被客户投诉的项目经理?

    没有被客户投诉过的项目经理很难体会到客户满意度的重要性 项目经理被客户投诉 xff0c 一定要执行合适的处罚 xff0c 否则项目管理将失去基本游戏规则 自由是有限度的 xff0c 项目经理一定不能突破客户投诉的红线 如同不断的抛接球 xf
  • k8s kube-router+ipvs pod网络分析

    集群中的每个节点上都有一个kube bridge网桥 xff0c 是部署k8s时创建的网桥 xff0c 用于pod间通信k8s 利用veth pair和网桥实现容器通信 xff0c 一端与pod绑定 xff0c 一端绑定到kube brid
  • 面试官常问的Promise问题

    1 Promise 有几种状态 xff1f 3种 pending 初始化状态 resolved 当调用成功时的状态 reject 当调用失败时的状态 2 Promise得状态是否可变 不可变 3 Promise如何解决地狱回调 xff1f
  • vnc连接linux服务器,用 TigerVNC 实现 Linux 远程桌面

    tigervnc 配置 1 确认 SSH 在运行 2 安装 TigerVNC Server yum install tigervnc server 已经安装过的 yum info tigervnc server 可以查看已安装的情况 3 配
  • 51单片机的轮胎气压监测系统_基于单片机的胎压监测设计毕业设计论文.doc

    PAGE 4 存档日期 xff1a 存档编号 xff1a 本科生毕业设计 论文 论 文 题 目 xff1a 基于单片机的胎压监测系统设计 姓 名 xff1a 学 院 xff1a 电气工程及自动化 专 业 xff1a 电气工程及其自动化 班
  • ros2foxy中gazebo11中导入soildworks中模型

    由于ros2中不能像ros1中一样使用soildworks导出urdf文件直接打开 xff0c 所以之前使用的下面的方法没有用了 https blog csdn net weixin 42454034 article details 106
  • 网络编程_TCP/UDP编程

    网络编程 一 网络通信要素 1 1 IP地址 1 1 1 概述 IP指互联网协议地址 xff08 Internet Protocol Address xff09 xff0c 俗称IP IP地址用来给一个网络中的计算机设备做唯一的编号 1 1