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

devtools/2024/9/22 18:15:47/

1. 网络编程介绍

1.1 初始网络编程

1.2 网络编程三要素

1.2.1 IP

InetAddress 的使用

java">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协议 (发送数据)

java">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协议 (接收数据)

java">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协议 (聊天室)
java">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三种通讯方式

① 单播: 一对一

② 组播: 一对多

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

java">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();}
}
java">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 通信程序

java">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();}
}
java">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 三次握手和四次挥手


http://www.ppmy.cn/devtools/20904.html

相关文章

IDEA:运行 Tomcat 报错 “1099”

1、报错的结果 报错 就很明显啊 localhost:1099 端口号被使用了 2、报错原因 tomcat的端口已经被使用,与运行的起了冲突。强制结束项目,但端口号没有被释放短时间内频繁运行tomcat服务器。 3、解决方法 win R 输入 cmd 打开命令框 黑窗口输…

Elasticsearch集群部署(Linux)

1. 准备环境 这里准备三台Linux虚拟机,用于配置Elasticsearch集群和部署可视化工具Kibana。 角色IP域名集群名称节点名称版本操作系统ES192.168.243.100linux100cluster-eses-node-1007.12.0CentOS 7192.168.243.101linux101cluster-eses-node-101192.168.243.102…

Rabbitmq消息应答,持久化,权重分配(7)

消息应答 概览 消息应答机制是 RabbitMQ 中确保消息处理的可靠性和一致性的重要机制之一。当消费者从队列中接收到消息并处理完成后,通常需要向 RabbitMQ 发送一个明确的消息应答,以告知 RabbitMQ 消息已经被处理,并可以安全地从队列中移除…

设计模式:开放-封闭原则(Open-Closed Principle,OCP)介绍

开放-封闭原则(Open-Closed Principle,OCP)是面向对象设计原则之一,它指导我们编写可扩展和易维护的代码。该原则的核心思想是: 软件实体(类、模块、函数等)应该对扩展开放,对修改封…

PyTorch深度学习实战(41)——循环神经网络与长短期记忆网络

PyTorch深度学习实战(41)——循环神经网络与长短期记忆网络 0. 前言1. 循环神经网络1.1 传统文本处理方法的局限性1.2 RNN 架构2.3 RNN 内存机制 2. RNN 的局限性3. 长短期记忆网络3.1 LSTM 架构3.2 构建 LSTM 小结系列链接 0. 前言 循环神经网络 (Recu…

K8s 使用 CephFS 作为后端存储(静态供给、动态供给)

一、K8s 使用 CephFS CephFS是 Ceph 中基于RADOS(可扩展分布式对象存储)构建,通过将文件数据划分为对象并分布到集群中的多个存储节点上来实现高可用性和可扩展性。 首先所有 k8s 节点都需要安装 ceph-common 工具: yum -y ins…

ArgoCD集成部署到Kubernetes

1:环境 kubernetes1.23.3ArgoCD2.3.3 2:ArgoCD介绍 Argo CD is a declarative, GitOps continuous delivery tool for Kubernetes. Argo CD是一个基于Kubernetes的声明式的GitOps工具。 那么,什么是GitOps呢? GitOps是以Git为基…

Java中的异常处理

一、异常概述: 异常指的是在程序执行过程中出现的非正常情况,如果不处理最终会导致JVM的非正常停止;异常并不是指的语法错误和逻辑错误; 1.异常抛出的机制: Java中把不同的异常用不同的类表示,一旦发生某种异常,就创建该异常类…