java网络编程、TCP和UDP、三次握手和四次挥手

news2024/10/6 14:26:13

一、网络编程入门

 (1)概念

在网络通信协议下,不同计算机上运行的程序,可以进行数据传输

(2)网络编程三要素:

IP地址

        设备在网络中的地址,是唯一的标识。全称”互联网协议地址,也称IP地址。是分配给上网设备的数字标签。常见的IP分类为:ipv4ipv6

端口

        应用程序在设备中唯一的标识。

协议

 数据在网络中传输的规则,常见的协议有 UDP 协议和 TCP 协议。

(3)InetAddress的使用

为了方便我们对IP地址的获取和操作,Java提供了一个类InetAddress 供我们使用

InetAddress:此类表示Internet协议(IP)地址

(4)端口

端口:应用程序在设备中唯一的标识。

端口号:用两个字节表示的整数,它的取值范围是0~65535

              其中0~1023之间的端口号用于一些知名的网络服务或者应用。

             我们自己使用1024以上的端口号就可以了。

注意:一个端口号只能被一个应用程序使用。

 (5)协议

协议:计算机网络中,连接和通信的规则被称为网络通信协议

UDP协议

用户数据报协议 (User Datagram Protocol)
UDP 面向无连接 通信协议。

       速度快,有大小限制一次最多发送64K,数据不安全,易丢失数据。

TCP协议

传输控制协议 (Transmission Control Protocol)
TCP 协议是 面向连接 的通信协议。

       速度慢,没有大小限制,数据安全。

二、UDP通信 

(1)发送数据

创建发送端的DatagramSocket对象 

创建数据,并把数据打包(DatagramPacket)

调用DatagramSocket对象的方法发送数据

释放资源

(2)接收数据

创建接收端的DatagramSocket对象

创建一个箱子,用于接收数据

调用DatagramSocket的方法接收数据并将数据放入箱子中 

解析数据包

释放资源

(3)例子

UDP发送数据:数据来自于键盘录入,直到输入的数据是886,发送数据结束

public class SendDemo {
    public static void main(String[] args) throws IOException {
        //创建发送端的Socket对象(DatagramSocket)
        DatagramSocket ds = new DatagramSocket();
        //键盘录入数据
        Scanner sc = new Scanner(System.in);
        while (true) {
          	String s = sc.nextLine();
            //输入的数据是886,发送数据结束
            if ("886".equals(s)) {
                break;
            }
            //创建数据,并把数据打包
            byte[] bys = s.getBytes();
            DatagramPacket dp = new DatagramPacket(bys, bys.length, InetAddress.getByName("192.168.1.10"), 12345);

            //调用DatagramSocket对象的方法发送数据
            ds.send(dp);
        }
        //关闭发送端
        ds.close();
    }
}

UDP接收数据:因为接收端不知道发送端什么时候停止发送,故采用死循环接收

public class ReceiveDemo {
    public static void main(String[] args) throws IOException {
        //创建接收端的Socket对象(DatagramSocket)
        DatagramSocket ds = new DatagramSocket(12345);
        while (true) {
            //创建一个数据包,用于接收数据
            byte[] bys = new byte[1024];
            DatagramPacket dp = new DatagramPacket(bys, bys.length);
            //调用DatagramSocket对象的方法接收数据
            ds.receive(dp);
            //解析数据包,并把数据在控制台显示
            System.out.println("数据是:" + new String(dp.getData(), 0, dp.getLength()));
        }
        //关闭接收端
//        ds.close();
    }
}

(4)udp的三种通讯方式

1、单播

  单播用于两个主机之间的端对端通信

2、 组播

  组播用于对一组特定的主机进行通信

组播地址:224.0.0.0 ~ 239.255.255.255

                 其中224.0.0.0 ~ 224.0.0.255 为预留的组播地址

  + 发送端
  1. 创建发送端的Socket对象(DatagramSocket)
  2. 创建数据,并把数据打包(DatagramPacket)
  3. 调用DatagramSocket对象的方法发送数据(在单播中,这里是发给指定IP的电脑但是在组播当中,这里是发给组播地址)
  4. 释放资源

public class ClinetDemo {
    public static void main(String[] args) throws IOException {
        // 1. 创建发送端的Socket对象(DatagramSocket)
        DatagramSocket ds = new DatagramSocket();
        String s = "hello 组播";
        byte[] bytes = s.getBytes();
        InetAddress address = InetAddress.getByName("224.0.1.0");
        int port = 10000;
        // 2. 创建数据,并把数据打包(DatagramPacket)
        DatagramPacket dp = new DatagramPacket(bytes,bytes.length,address,port);
        // 3. 调用DatagramSocket对象的方法发送数据(在单播中,这里是发给指定IP的电脑但是在组播当中,这里是发给组播地址)
        ds.send(dp);
        // 4. 释放资源
        ds.close();
    }
}

+ 接收端
  1. 创建接收端Socket对象(MulticastSocket)
  2. 创建一个箱子,用于接收数据
  3. 把当前计算机绑定一个组播地址
  4. 将数据接收到箱子中
  5. 解析数据包,并打印数据
  6. 释放资源

public class ServerDemo {
    public static void main(String[] args) throws IOException {
        // 1. 创建接收端Socket对象(MulticastSocket)
        MulticastSocket ms = new MulticastSocket(10000);
        // 2. 创建一个箱子,用于接收数据
        DatagramPacket dp = new DatagramPacket(new byte[1024],1024);
        // 3. 把当前计算机绑定一个组播地址,表示添加到这一组中.
        ms.joinGroup(InetAddress.getByName("224.0.1.0"));
        // 4. 将数据接收到箱子中
        ms.receive(dp);
        // 5. 解析数据包,并打印数据
        byte[] data = dp.getData();
        int length = dp.getLength();
        System.out.println(new String(data,0,length));
        // 6. 释放资源
        ms.close();
    }
}

3、广播

  广播用于一个主机对整个局域网上所有主机上的数据通信

+ 发送端
    1. 创建发送端Socket对象(DatagramSocket)
    2. 创建存储数据的箱子,将广播地址封装进去
    3. 发送数据
    4. 释放资源
public class ClientDemo {
    public static void main(String[] args) throws IOException {
      	// 1. 创建发送端Socket对象(DatagramSocket)
        DatagramSocket ds = new DatagramSocket();
		// 2. 创建存储数据的箱子,将广播地址封装进去
        String s = "广播 hello";
        byte[] bytes = s.getBytes();
        InetAddress address = InetAddress.getByName("255.255.255.255");
        int port = 10000;
        DatagramPacket dp = new DatagramPacket(bytes,bytes.length,address,port);
		// 3. 发送数据
        ds.send(dp);
		// 4. 释放资源
        ds.close();
    }
}
+ 接收端
    1. 创建接收端的Socket对象(DatagramSocket)
    2. 创建一个数据包,用于接收数据
    3. 调用DatagramSocket对象的方法接收数据
    4. 解析数据包,并把数据在控制台显示
    5. 关闭接收端
public class ServerDemo {
    public static void main(String[] args) throws IOException {
        // 1. 创建接收端的Socket对象(DatagramSocket)
        DatagramSocket ds = new DatagramSocket(10000);
        // 2. 创建一个数据包,用于接收数据
        DatagramPacket dp = new DatagramPacket(new byte[1024],1024);
        // 3. 调用DatagramSocket对象的方法接收数据
        ds.receive(dp);
        // 4. 解析数据包,并把数据在控制台显示
        byte[] data = dp.getData();
        int length = dp.getLength();
        System.out.println(new String(data,0,length));
        // 5. 关闭接收端
        ds.close();
    }
}

三、TCP通信 

(1)概念

TCP通信协议是一种可靠的网络协议,它在通信的两端各建立一个Socket对象。

通信之前要保证连接已经建立。

通过Socket产生IO流来进行网络通信。

(2)发送数据

创建客户端的 Socket 对象 (Socket) 与指定服务端连接

Socket​(String host, int port)

获取输出流,写数据

OutputStream getOutputStream​()

释放资源

void close​()

(3)接收数据 

创建服务器端的 Socket 对象 (ServerSocket)

ServerSocket​(int port)

监听客户端连接,返回一个 Socket 对象

Socket accept​()

获取输入流,读数据,并把数据显示在控制台

InputStream getInputStream​()

释放资源

void close​()

(4)示例 

接收

public class ClientDemo {
    public static void main(String[] args) throws IOException {
        //创建客户端的Socket对象(Socket)
        //Socket(String host, int port) 创建流套接字并将其连接到指定主机上的指定端口号
        Socket s = new Socket("127.0.0.1",10000);

        //获取输出流,写数据
        //OutputStream getOutputStream() 返回此套接字的输出流
        OutputStream os = s.getOutputStream();
        os.write("hello,tcp,我来了".getBytes());

        //释放资源
        s.close();
    }
}

发送

public class ServerDemo {
    public static void main(String[] args) throws IOException {
        //创建服务器端的Socket对象(ServerSocket)
        //ServerSocket(int port) 创建绑定到指定端口的服务器套接字
        ServerSocket ss = new ServerSocket(10000);

        //Socket accept() 侦听要连接到此套接字并接受它
        Socket s = ss.accept();

        //获取输入流,读数据,并把数据显示在控制台
        InputStream is = s.getInputStream();
        byte[] bys = new byte[1024];
        int len = is.read(bys);
        String data = new String(bys,0,len);
        System.out.println("数据是:" + data);

        //释放资源
        s.close();
        ss.close();
    }
}

 (5)注意事项

1. accept方法是阻塞的,作用就是等待客户端连接
2. 客户端创建对象并连接服务器,此时是通过三次握手协议,保证跟服务器之间的连接
3. 针对客户端来讲,是往外写的,所以是输出流
   针对服务器来讲,是往里读的,所以是输入流
4. read方法也是阻塞的
5. 客户端在关流的时候,还多了一个往服务器写结束标记的动作
6. 最后一步断开连接,通过四次挥手协议保证连接终止

(6)三次握手和四次挥手

三次
四次

 

 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

value_counts()方法--Pandas

1. 函数功能 返回DataFrame中值与计算组成的Series 2. 函数语法 DataFrame.value_counts(subsetNone, normalizeFalse, sortTrue, ascendingFalse, dropnaTrue)3.函数参数 参数含义subset可选参数,标签或者标签列表 ,计算时要用的列normalize布尔值&…

android原生工程测试opencv库与opencl功能

1.jni原生工程main文件夹中创建jniLibs 2.复制opencv库到jniLibs 3.复制opencv头文件 头文件库导入后如下: 头文件与库路径包含 头文件直接复制出来外面,不然识别不了 断点调试

Jetson nano中使用tensorrt推理yolov5

克隆下载yolov5项目 准备yolov5项目, 从仓库下载5 5.0版本 git clone -b v5.0 https://github.com/ultralytics/yolov5.git下载权重地址 https://github.com/ultralytics/yolov5/releases/tag/v5.0自行安装必要的库 pip3 install -r requirements.txt准备tensorrtx项目 下载后可…

88、基于STM32单片机学习型搬运机器人四自由度机械臂机械手遥感控制设计(程序+原理图+PCB源文件+参考论文+硬件设计资料+元器件清单等)

单片机主芯片选择方案 方案一:AT89C51是美国ATMEL公司生产的低电压,高性能CMOS型8位单片机,器件采用ATMEL公司的高密度、非易失性存储技术生产,兼容标准MCS-51指令系统,片内置通用8位中央处理器(CPU)和Flash存储单元&a…

VR智慧景区:数字文旅新模式,你体验了吗?

传统的旅游行业如果想要破局,就势必要发展线上业务,VR智慧文旅就是一个很好的发展选择。随着5G技术的发展,我们该如何进一步的探索数字文旅的新趋势、新机遇和新发展呢? VR智慧景区可以帮助文旅行业实现全景漫游、实景导航、电子沙…

UG\NX二次开发 获取基准面的点和方向

文章作者:里海 来源网站:https://blog.csdn.net/WangPaiFeiXingYuan 简介: 获取基准面的点和方向,包括坐标系上的基准面。 效果: 代码: #include "me.hpp" #include <stdio.h> #include <string.h> #include <uf.h> #include <uf_ui.h&…

《CAPL编程语言》来啦!!!

目标人群 想入门CAPL编程的 想提高CAPL编程能力的 想系统性学习CAPL编程语言的 时长 30小时 报名方式 联系作者微信 内容 &#xff01;&#xff01;&#xff01;始于CAPL&#xff0c;又不止于CAPL&#xff01;&#xff01;&#xff01; 这里不只有CAPL语法介绍&#xf…

力扣 216. 组合总和 III

题目来源&#xff1a;https://leetcode.cn/problems/combination-sum-iii/description/ C题解&#xff1a;由 进入for循环进行回溯&#xff0c;到 ......&#xff0c;以此类推。 递归法&#xff1a; 确定递归函数参数&#xff1a;要求集合的个数k&#xff0c;目标和n&#x…

ES6模块化的基本语法

ES6模块化的基本语法 1、默认导出与默认导入2、按需导出和按需导入3、直接导入并执行模块中的代码 1、默认导出与默认导入 默认导出的语法 export default 默认导出的成员示例 let n110let n220function show(){}export default{n1,show }默认导入的语法 import 接收名称 f…

基于Java学生事务处理系统设计实现(源码+lw+部署文档+讲解等)

博主介绍&#xff1a;✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专…

vue2【监听器】

目录 1&#xff1a;监听器的作用 2&#xff1a;语法格式 3&#xff1a;示例 4&#xff1a;应用场景 4.1&#xff1a;axios发送请求 4.2&#xff1a;JQuery发送请求 5&#xff1a;监听器的格式&#xff1a; 5.1&#xff1a;函数格式的监听器&#xff1a; 缺点一&#x…

MySQL数据库、表、用户的基础操作

根据两个实例进行练习 1&#xff09;创建库 mysql> create database Market; Query OK, 1 row affected (0.00 sec) 2&#xff09;创建表 mysql> create table customers (-> c_num int(11) PRIMARY KEY AUTO_INCREMENT,-> c_name varchar(50) ,-> c_contact…

F103串口和DMA配合使用总结

常规的串口使用是这样的&#xff1a;先配置基本的GPIO和串口&#xff0c;然后调用发送和接收函数&#xff0c;如果需要中断&#xff0c;可以根据情况配置发送中断和接收中断。 比如&#xff1a; //PB10:UT3_TX //PB11:UT3_RX void lcd_usart_init(uint32_t bound) {//GPIO端口…

Linux内核模块开发 第 7 章

The Linux Kernel Module Programming Guide Peter Jay Salzman, Michael Burian, Ori Pomerantz, Bob Mottram, Jim Huang译 断水客&#xff08;WaterCutter&#xff09;源 LKMPG 7 /proc 文件系统 Linux 中有一个额外的机制——/proc file system&#xff0c;用于支持内核…

Linux学习之分区挂载

VMWare 16虚拟机添加一块硬盘 点击“硬盘&#xff08;SCSI&#xff09;”&#xff0c;在弹出来的窗口点击“硬盘&#xff08;SCSI&#xff09;”之后添加。 选择硬盘之后&#xff0c;点击下一步。 虚拟磁盘类型&#xff0c;就选择默认的SCSI(S)。 选择“创建新虚拟机磁盘…

SpringBoot整合minio笔记

SpringBoot整合minio笔记 物料准备&#xff1a; 1.引入minio以及 spring-file-storage 相关依赖 2.配置yml 3.配置 FileRecorder实现类 4.启用EnableFileStorage注解 5.测试上传 引入minio以及 spring-file-storage 相关依赖 minio是一个OSS云存储服务&#xff0c;mini…

web 页面布局:(二)float 浮动布局

web 页面布局&#xff1a;&#xff08;二&#xff09;float 浮动布局 页面宽度使用样式居中 使用浮动浮动元素外的剩余空间使用浮动的高度细节 页面宽度 在很早很早的时期&#xff0c;各大网站的底部都会有这么类似的一句声明&#xff1a;最佳分辨率 sss x ttt&#xff0c;比如…

web前端设计师的具体职责

web前端设计师的具体职责 web前端设计师负责将设计图转化成页面&#xff0c;并实现页面动态效果&#xff0c;并配合后端程序员嵌入数据。下面是学习啦小编整理的web前端设计师的具体职责。 web前端设计师的具体职责1 职责&#xff1a; 1.负责网站页面的整体美工创意、设计与…

redis 笔记

文章学习参考&#xff1a;Redis 教程 | 菜鸟教程 (runoob.com) 1、安装并执行 1.1 安装 下载地址&#xff1a;https://github.com/tporadowski/redis/releases 点击下面的压缩文件下载&#xff0c;版本不一定是这个。 1.2 执行redis 打开cmd窗口&#xff0c;跳转到redis解压的…

void QWidget::stackUnder(QWidget *w)

Places the widget under w in the parent widgets stack. To make this work, the widget itself and w must be siblings. 在父窗口的栈中&#xff0c;放置widget在w下面。 为了生效&#xff0c;widget和w必须是兄弟。 什么意思呢&#xff1f; widget和w的父窗口必须是同一个…