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

相关文章

Java Predicate接口定义详解

《JavaPredicate接口定义详解》Predicate是Java中的一个函数式接口,它代表一个判断逻辑,接收一个输入参数,返回一个布尔值,:本文主要介绍JavaPredicate接口的定义... 目录Java Predicate接口Java lamda表达式 Predicate<T>、BiFuncti

Nginx中配置HTTP/2协议的详细指南

《Nginx中配置HTTP/2协议的详细指南》HTTP/2是HTTP协议的下一代版本,旨在提高性能、减少延迟并优化现代网络环境中的通信效率,本文将为大家介绍Nginx配置HTTP/2协议想详细步骤,需... 目录一、HTTP/2 协议概述1.HTTP/22. HTTP/2 的核心特性3. HTTP/2 的优

Spring Security基于数据库的ABAC属性权限模型实战开发教程

《SpringSecurity基于数据库的ABAC属性权限模型实战开发教程》:本文主要介绍SpringSecurity基于数据库的ABAC属性权限模型实战开发教程,本文给大家介绍的非常详细,对大... 目录1. 前言2. 权限决策依据RBACABAC综合对比3. 数据库表结构说明4. 实战开始5. MyBA

Spring Security方法级安全控制@PreAuthorize注解的灵活运用小结

《SpringSecurity方法级安全控制@PreAuthorize注解的灵活运用小结》本文将带着大家讲解@PreAuthorize注解的核心原理、SpEL表达式机制,并通过的示例代码演示如... 目录1. 前言2. @PreAuthorize 注解简介3. @PreAuthorize 核心原理解析拦截与

一文详解JavaScript中的fetch方法

《一文详解JavaScript中的fetch方法》fetch函数是一个用于在JavaScript中执行HTTP请求的现代API,它提供了一种更简洁、更强大的方式来处理网络请求,:本文主要介绍Jav... 目录前言什么是 fetch 方法基本语法简单的 GET 请求示例代码解释发送 POST 请求示例代码解释

Java图片压缩三种高效压缩方案详细解析

《Java图片压缩三种高效压缩方案详细解析》图片压缩通常涉及减少图片的尺寸缩放、调整图片的质量(针对JPEG、PNG等)、使用特定的算法来减少图片的数据量等,:本文主要介绍Java图片压缩三种高效... 目录一、基于OpenCV的智能尺寸压缩技术亮点:适用场景:二、JPEG质量参数压缩关键技术:压缩效果对比

Java调用C++动态库超详细步骤讲解(附源码)

《Java调用C++动态库超详细步骤讲解(附源码)》C语言因其高效和接近硬件的特性,时常会被用在性能要求较高或者需要直接操作硬件的场合,:本文主要介绍Java调用C++动态库的相关资料,文中通过代... 目录一、直接调用C++库第一步:动态库生成(vs2017+qt5.12.10)第二步:Java调用C++

springboot+dubbo实现时间轮算法

《springboot+dubbo实现时间轮算法》时间轮是一种高效利用线程资源进行批量化调度的算法,本文主要介绍了springboot+dubbo实现时间轮算法,文中通过示例代码介绍的非常详细,对大家... 目录前言一、参数说明二、具体实现1、HashedwheelTimer2、createWheel3、n

关于WebSocket协议状态码解析

《关于WebSocket协议状态码解析》:本文主要介绍关于WebSocket协议状态码的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录WebSocket协议状态码解析1. 引言2. WebSocket协议状态码概述3. WebSocket协议状态码详解3

Java利用docx4j+Freemarker生成word文档

《Java利用docx4j+Freemarker生成word文档》这篇文章主要为大家详细介绍了Java如何利用docx4j+Freemarker生成word文档,文中的示例代码讲解详细,感兴趣的小伙伴... 目录技术方案maven依赖创建模板文件实现代码技术方案Java 1.8 + docx4j + Fr