Day17-Java进阶-网络编程(IP, 端口, 协议)TCP和UDP三次握手和四次挥手

本文主要是介绍Day17-Java进阶-网络编程(IP, 端口, 协议)TCP和UDP三次握手和四次挥手,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1. 网络编程介绍

1.1 初始网络编程

1.2 网络编程三要素

1.2.1 IP

InetAddress 的使用

package com.itheima.Inetaddress;import java.net.InetAddress;
import java.net.UnknownHostException;public class InetAddressDemo1 {/*static InetAddress getByName(String host) 确定主机名称的IP地址, 主机名称可以是机器名称, 也可以是IP地址String getHostName()                      获取此IP地址的主机名String getHostAddress()                   返回文本显示中的IP地址字符串*/public static void main(String[] args) throws UnknownHostException {// 1. 获取InetAddress的对象 -- IP的对象 --> 一台电脑的对象InetAddress address = InetAddress.getByName("联想小新笔记本");System.out.println(address);String name = address.getHostName();System.out.println(name);String ip = address.getHostAddress();System.out.println(ip);}
}

1.2.2 端口号

1.2.3 协议

(1) UDP协议 (发送数据)

package com.itheima.udp;import java.io.IOException;
import java.net.*;public class SendMessageDemo {/*发送数据1. 创建DatagramSocket对象(快递公司)细节:绑定端口, 以后通过这个端口往外发送空参: 所有可用的端口中随机一个进行使用有参: 指定端口号进行绑定2. 打包数据3. 发送数据4. 释放资源*/public static void main(String[] args) throws IOException {// 1. 创建DatagramSocket对象(快递公司)DatagramSocket ds = new DatagramSocket();// 2. 打包数据String str = "你好威呀!!!";byte[] bytes = str.getBytes();InetAddress address = InetAddress.getByName("127.0.0.1");int port = 10086;DatagramPacket dp = new DatagramPacket(bytes,bytes.length,address,port);// 3. 发送数据ds.send(dp);// 4. 释放资源ds.close();}
}

因UDP协议是面向无连接的, 只顾发出, 不考虑是否被正确接收.

(2) UDP协议 (接收数据)

package com.itheima.udp;import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;public class ReceiveMessageDemo {/*接收数据:1. 创建DatagramSocket对象(快递公司)细节:1. 接收的时候, 一定要绑定端口2. 绑定的端口, 一定要跟发送的端口保持一致3. 解析数据包4. 释放资源*/public static void main(String[] args) throws IOException {// 1. 创建DatagramSocket对象(快递公司)DatagramSocket ds = new DatagramSocket(10086);// 2. 接收数据包byte[] bytes = new byte[1024];DatagramPacket dp = new DatagramPacket(bytes, bytes.length);// 该方法时阻塞的, 程序在执行到这一步时, 会一直在这里死等, 等发送端发送消息System.out.println(111111);ds.receive(dp);System.out.println(2222);// 3. 解析数据包byte[] data = dp.getData();int len = dp.getLength();InetAddress address = dp.getAddress();int port = dp.getPort();System.out.println("接收到数据" + new String(data, 0, len));System.out.println("该数据是从" + address + "这台电脑中的" + port + "这个端口发出的");// 4. 释放资源ds.close();}
}

(3) UDP协议 (聊天室)
package com.itheima.udpdemo2;import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;public class ReceiveMessageDemo {/*按照下面的要求实现程序UDP发送数据: 数据来自于键盘录入, 直到输入的数据是886, 发送数据结束UDP接收数据: 因为接受端不知道发送端什么时候停止发送, 故采用死循环接收*/public static void main(String[] args) throws IOException {// 1. 创建DatagramSocket的对象DatagramSocket ds = new DatagramSocket(10086);// 2. 接收数据包byte[] bytes = new byte[1024];DatagramPacket dp = new DatagramPacket(bytes, bytes.length);while (true) {ds.receive(dp);// 3. 解析数据包byte[] data = dp.getData();int len = dp.getLength();String ip = dp.getAddress().getHostAddress();String name = dp.getAddress().getHostName();// 4. 打印数据System.out.println("ip为: " + ip + ", 主机名为: " + name + "的人, 发送了数据: " + new String(data, 0, len));}}
}

1.3 UDP三种通讯方式

① 单播: 一对一

② 组播: 一对多

③ 广播: 可以给局域网中所有的电脑发送数据

package com.itheima.udpdemo3;import java.io.IOException;
import java.net.DatagramPacket;
import java.net.InetAddress;
import java.net.MulticastSocket;public class SendMessageDemo {/*组播发送端代码*/public static void main(String[] args) throws IOException {// 1. 创建MulticastSocket的对象MulticastSocket ms = new MulticastSocket();// 2. 打包数据String str = "你好你好!";byte[] bytes = str.getBytes();InetAddress address = InetAddress.getByName("224.0.0.1");int port = 10000;DatagramPacket dp = new DatagramPacket(bytes, bytes.length, address, port);// 3. 发送数据ms.send(dp);// 4. 释放资源ms.close();}
}
package com.itheima.udpdemo3;import java.io.IOException;
import java.net.DatagramPacket;
import java.net.InetAddress;
import java.net.MulticastSocket;public class ReceiveMessageDemo1 {/*组播接收端代码*/public static void main(String[] args) throws IOException {// 1. 创建MulticastSocket的对象MulticastSocket ms = new MulticastSocket(10000);// 2. 将当前本机, 添加到224.0.0.1的这一组当中InetAddress address = InetAddress.getByName("224.0.0.1");ms.joinGroup(address);// 3. 创建DatagramPacket数据包对象byte[] bytes = new byte[1024];DatagramPacket dp = new DatagramPacket(bytes, bytes.length);// 4. 接受数据ms.receive(dp);// 5. 解析数据包byte[] data = dp.getData();int len = dp.getLength();String ip = dp.getAddress().getHostAddress();String name = dp.getAddress().getHostName();// 打印数据System.out.println("ip为: " + ip + ", 主机名为: " + name + "的人, 发送了数据: " + new String(data, 0, len));// 6. 释放资源ms.close();}
}

1.4 TCP 通信程序

package com.itheima.tcpdemo;import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;public class Client {/*TCP协议, 发送数据1. 创建Socket对象细节:在创建对象的同时会连接服务器若连接不上, 代码会报错*/public static void main(String[] args) throws IOException {// 1. 创建Socket对象Socket socket = new Socket("127.0.0.1",10000);// 2. 可以从连接通道中获取输出流OutputStream os = socket.getOutputStream();// 写出数据os.write("你好你好啊".getBytes()); // 一个字符占3个字节, 共12个字节// 3. 释放资源os.close();socket.close();}
}
package com.itheima.tcpdemo;import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;public class Server {/*TCP协议, 接收数据*/public static void main(String[] args) throws IOException {// 1. 创建Socket对象ServerSocket ss = new ServerSocket(10000);// 2. 监听客户端的连接Socket socket = ss.accept();// 3. 从连接通道中获取输入流读取数据(字节流)/*InputStream is = socket.getInputStream();// 将字节流转换成字符流isrInputStreamReader isr = new InputStreamReader(is);// 包一个缓冲流提升读取效率BufferedReader br = new BufferedReader(isr);*/BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));int b;while ((b = br.read()) != -1){System.out.print((char) b);}// 4. 释放资源socket.close(); // 相当于断开跟客户端的连接ss.close(); // 相当于关闭服务器}
}

1.5 三次握手和四次挥手

这篇关于Day17-Java进阶-网络编程(IP, 端口, 协议)TCP和UDP三次握手和四次挥手的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/933902

相关文章

SpringBoot中SM2公钥加密、私钥解密的实现示例详解

《SpringBoot中SM2公钥加密、私钥解密的实现示例详解》本文介绍了如何在SpringBoot项目中实现SM2公钥加密和私钥解密的功能,通过使用Hutool库和BouncyCastle依赖,简化... 目录一、前言1、加密信息(示例)2、加密结果(示例)二、实现代码1、yml文件配置2、创建SM2工具

Spring WebFlux 与 WebClient 使用指南及最佳实践

《SpringWebFlux与WebClient使用指南及最佳实践》WebClient是SpringWebFlux模块提供的非阻塞、响应式HTTP客户端,基于ProjectReactor实现,... 目录Spring WebFlux 与 WebClient 使用指南1. WebClient 概述2. 核心依

Spring Boot @RestControllerAdvice全局异常处理最佳实践

《SpringBoot@RestControllerAdvice全局异常处理最佳实践》本文详解SpringBoot中通过@RestControllerAdvice实现全局异常处理,强调代码复用、统... 目录前言一、为什么要使用全局异常处理?二、核心注解解析1. @RestControllerAdvice2

Spring IoC 容器的使用详解(最新整理)

《SpringIoC容器的使用详解(最新整理)》文章介绍了Spring框架中的应用分层思想与IoC容器原理,通过分层解耦业务逻辑、数据访问等模块,IoC容器利用@Component注解管理Bean... 目录1. 应用分层2. IoC 的介绍3. IoC 容器的使用3.1. bean 的存储3.2. 方法注

Spring事务传播机制最佳实践

《Spring事务传播机制最佳实践》Spring的事务传播机制为我们提供了优雅的解决方案,本文将带您深入理解这一机制,掌握不同场景下的最佳实践,感兴趣的朋友一起看看吧... 目录1. 什么是事务传播行为2. Spring支持的七种事务传播行为2.1 REQUIRED(默认)2.2 SUPPORTS2

怎样通过分析GC日志来定位Java进程的内存问题

《怎样通过分析GC日志来定位Java进程的内存问题》:本文主要介绍怎样通过分析GC日志来定位Java进程的内存问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、GC 日志基础配置1. 启用详细 GC 日志2. 不同收集器的日志格式二、关键指标与分析维度1.

Java进程异常故障定位及排查过程

《Java进程异常故障定位及排查过程》:本文主要介绍Java进程异常故障定位及排查过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、故障发现与初步判断1. 监控系统告警2. 日志初步分析二、核心排查工具与步骤1. 进程状态检查2. CPU 飙升问题3. 内存

Linux中压缩、网络传输与系统监控工具的使用完整指南

《Linux中压缩、网络传输与系统监控工具的使用完整指南》在Linux系统管理中,压缩与传输工具是数据备份和远程协作的桥梁,而系统监控工具则是保障服务器稳定运行的眼睛,下面小编就来和大家详细介绍一下它... 目录引言一、压缩与解压:数据存储与传输的优化核心1. zip/unzip:通用压缩格式的便捷操作2.

java中新生代和老生代的关系说明

《java中新生代和老生代的关系说明》:本文主要介绍java中新生代和老生代的关系说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、内存区域划分新生代老年代二、对象生命周期与晋升流程三、新生代与老年代的协作机制1. 跨代引用处理2. 动态年龄判定3. 空间分

Java设计模式---迭代器模式(Iterator)解读

《Java设计模式---迭代器模式(Iterator)解读》:本文主要介绍Java设计模式---迭代器模式(Iterator),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录1、迭代器(Iterator)1.1、结构1.2、常用方法1.3、本质1、解耦集合与遍历逻辑2、统一