Java 之网络编程

这篇文章将深入浅出地讲解 Java 网络编程,从基础概念到实战代码,带你逐步了解如何使用 Java 建立网络应用程序。

一、网络编程的基础知识

1. 网络模型:TCP 和 UDP

网络编程的核心在于网络协议,它们规定了网络数据传输的规则,最常见的两种是 TCP (Transmission Control Protocol,传输控制协议) 和 UDP (User Datagram Protocol,用户数据报协议)。

TCP 就像是一个可靠的快递员,它会仔细检查每个包裹,确保包裹完整无缺地送到目的地。特点:

  • 面向连接: 就像打电话一样,在传输数据前需要建立连接,双方确认可以通话才能开始交流。

  • 可靠性高: TCP 实现了数据校验和重传机制,保证数据完整性和顺序。

  • 速度较慢: 由于需要建立连接和数据校验,TCP 速度相对较慢。

  • 适用于: 要求高可靠性的场景,例如文件传输、在线游戏等。

UDP 就像是一个快递员,它只负责将包裹快速送到目的地,而不关心包裹是否完整,也可能丢失包裹。特点:

  • 无连接: 无需建立连接,数据直接发送。

  • 速度快: UDP 效率高,适用于实时性强的应用。

  • 可靠性低: UDP 不保证数据完整性和顺序,可能会丢失数据。

  • 适用于: 实时性要求高、对数据丢失容忍度高的场景,例如视频直播、网络游戏等。

举例说明:

  • 下载电影:使用 TCP 协议,确保文件完整无缺地下载到本地。

  • 在线游戏:使用 UDP 协议,即使偶尔丢包也不会影响游戏的实时性。

2. 网络编程的三要素
  • IP 地址: 网络中每个设备的唯一标识,用于定位设备。就像每个人的身份证号一样,IP 地址用于识别不同的计算机。

  • 端口号: 用于区分不同应用程序,每个应用程序都使用不同的端口号。例如:80 端口用于 HTTP 服务,用来访问网页。

  • 协议: 用于指定数据传输的规则,例如 TCP 和 UDP。

形象比喻:

  • IP 地址:就像你家住的地址,告诉别人你在哪里。

  • 端口号:就像你家门上的门牌号,告诉别人你家是哪个。

  • 协议:就像你的家门口的信箱,决定你收到的信件是平信还是快递。

二、Java 网络编程实战

1. 使用 Socket 类建立 TCP 连接

Socket 类是 Java 中用于建立 TCP 连接的核心类,它代表网络中两个应用程序之间通信的端点。

代码示例:(先运行服务器再运行客户端)

import java.io.*;
import java.net.*;public class TCPClient {public static void main(String[] args) throws IOException {// 1. 创建 Socket 对象,指定服务器 IP 地址和端口号Socket socket = new Socket("127.0.0.1", 8080); // 连接本地服务器 8080 端口// 2. 获取输入流和输出流,用于与服务器通信BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));PrintWriter out = new PrintWriter(socket.getOutputStream(), true); // 设置 autoflush// 3. 发送数据到服务器out.println("Hello, server!");// 4. 接收服务器返回的数据String response = in.readLine();System.out.println("Server response: " + response);// 5. 关闭连接socket.close();}
}

代码解释:

  1. 创建 Socket 对象,传入服务器 IP 地址和端口号,建立连接。

  2. 获取 InputStream 用于接收服务器数据,获取 OutputStream 用于发送数据。

  3. 使用 PrintWriter 将数据写入输出流,true 参数设置自动刷新,确保数据及时发送。

  4. 使用 BufferedReader 从输入流读取服务器返回的数据。

  5. 最后关闭连接,释放资源。

服务器代码:

import java.io.*;
import java.net.*;public class TCPServer {public static void main(String[] args) throws IOException {// 1. 创建 ServerSocket 对象,指定监听端口号ServerSocket serverSocket = new ServerSocket(8080);// 2. 监听连接请求Socket socket = serverSocket.accept(); // 阻塞等待连接请求// 3. 获取输入流和输出流BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));PrintWriter out = new PrintWriter(socket.getOutputStream(), true);// 4. 读取客户端发送的数据String request = in.readLine();System.out.println("Client request: " + request);// 5. 发送数据到客户端out.println("Hello, client!");// 6. 关闭连接socket.close();serverSocket.close();}
}

代码解释:

  1. 创建 ServerSocket 对象,监听指定端口号,等待客户端连接请求。

  2. 使用 accept() 方法阻塞等待客户端连接,一旦连接成功,返回 Socket 对象。

  3. 获取输入流和输出流,用于与客户端通信。

  4. 读取客户端发送的数据。

  5. 向客户端发送数据。

  6. 最后关闭连接,释放资源。

2. 使用 DatagramPacket 类进行 UDP 通信

DatagramPacket 类用于实现 UDP 通信,它代表 UDP 中发送或接收的数据报。

代码示例:(先运行服务器再运行客户端)

import java.io.*;
import java.net.*;public class UDPClient {public static void main(String[] args) throws IOException {// 1. 创建 DatagramSocket 对象,指定端口号DatagramSocket socket = new DatagramSocket();// 2. 创建 DatagramPacket 对象,用于发送数据String message = "Hello, server!";byte[] buffer = message.getBytes();InetAddress address = InetAddress.getByName("127.0.0.1"); // 服务器 IP 地址int port = 8080; // 服务器端口号DatagramPacket sendPacket = new DatagramPacket(buffer, buffer.length, address, port);// 3. 发送数据socket.send(sendPacket);// 4. 创建 DatagramPacket 对象,用于接收数据byte[] receiveBuffer = new byte[1024];DatagramPacket receivePacket = new DatagramPacket(receiveBuffer, receiveBuffer.length);// 5. 接收数据socket.receive(receivePacket);// 6. 解析接收到的数据String response = new String(receivePacket.getData(), 0, receivePacket.getLength());System.out.println("Server response: " + response);// 7. 关闭连接socket.close();}
}

代码解释:

  1. 创建 DatagramSocket 对象,指定端口号。

  2. 创建 DatagramPacket 对象,传入要发送的数据、服务器 IP 地址和端口号。

  3. 使用 send() 方法发送数据。

  4. 创建 DatagramPacket 对象,传入接收数据的缓冲区。

  5. 使用 receive() 方法接收数据。

  6. 解析接收到的数据。

  7. 关闭连接,释放资源。

服务器代码:

import java.io.*;
import java.net.*;public class UDPServer {public static void main(String[] args) throws IOException {// 1. 创建 DatagramSocket 对象,指定监听端口号DatagramSocket socket = new DatagramSocket(8080);// 2. 创建 DatagramPacket 对象,用于接收数据byte[] receiveBuffer = new byte[1024];DatagramPacket receivePacket = new DatagramPacket(receiveBuffer, receiveBuffer.length);// 3. 接收数据socket.receive(receivePacket);// 4. 解析接收到的数据String request = new String(receivePacket.getData(), 0, receivePacket.getLength());System.out.println("Client request: " + request);// 5. 创建 DatagramPacket 对象,用于发送数据String message = "Hello, client!";byte[] buffer = message.getBytes();InetAddress address = receivePacket.getAddress(); // 获取客户端 IP 地址int port = receivePacket.getPort(); // 获取客户端端口号DatagramPacket sendPacket = new DatagramPacket(buffer, buffer.length, address, port);// 6. 发送数据socket.send(sendPacket);// 7. 关闭连接socket.close();}
}

代码解释:

  1. 创建 DatagramSocket 对象,监听指定端口号。

  2. 创建 DatagramPacket 对象,用于接收数据。

  3. 使用 receive() 方法接收数据。

  4. 解析接收到的数据。

  5. 创建 DatagramPacket 对象,传入要发送的数据、客户端 IP 地址和端口号。

  6. 使用 send() 方法发送数据。

  7. 关闭连接,释放资源。

结语:本文详细讲解了 Java 网络编程的基础知识和实战代码,包括 TCP 和 UDP 的区别、网络编程的三要素以及使用 Socket 和 DatagramPacket 类实现网络通信。希望这些内容能够帮助各位看官深入了解 Java 网络编程。感谢各位看官的观看,下期见,谢谢~

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

块匹配算法简介(上)

图像中的运动估计方法大致分为两类:光流法和块匹配算法(BMA,Block Matching Algorithm)。本文将介绍BMA的相关内容,包括基本原理、相似度计算准则与常见的几种搜索方法,如三步法、四步法、钻石搜索法等。 1. 背景 视频中相邻帧往往存在大量的相似内容,即只有局部的一些…

Golang | Leetcode Golang题解之第417题太平洋大西洋水流问题

题目: 题解: type pair struct{ x, y int } var dirs []pair{{-1, 0}, {1, 0}, {0, -1}, {0, 1}}func pacificAtlantic(heights [][]int) (ans [][]int) {m, n : len(heights), len(heights[0])pacific : make([][]bool, m)atlantic : make([][]bool, …

ansible远程自动化运维、常用模块详解

一、ansible是基于python开发的配置管理和应用部署工具;也是自动化运维的重要工具;可以批量配置、部署、管理上千台主机;只需要在一台主机配置ansible就可以完成其它主机的操作。 1.操作模式: 模块化操作,命令行执行…

Vue 依赖注入组件通信:provide / inject 使用详解

引言 在 Vue.js 中,我们经常会遇到组件之间需要共享数据的情况。一种常见的解决方案是通过 props 和 $emit 事件来进行数据传递,但对于多层嵌套的组件结构或共享状态的场景,这种方式显得繁琐而不直观。 幸运的是,Vue.js 提供了一…

web渗透—RCE

一:代码执行 相关函数 1、eval()函数 assert()函数 (1)原理:将用户提交或者传递的字符串当作php代码执行 (2)passby:单引号绕过:闭合注释;开启GPC的话就无法绕过(GPC就是将单引号转换为"反斜杠单引号"&a…

希亦超声波清洗机值得购买吗?百元清洁技术之王,大揭秘!

现代社会的高速发展,很多人由于工作繁忙的原因,根本没有时间去清洗自己的日常物品,要知道这些日常物品堆积灰尘之后是很容易就滋生细菌的,并且还会对人体的健康造成一定的危害!这个时候很多人就会选择购买一台超声波清…

什么是CSRF攻击,该如何防护CSRF攻击

CSRF攻击(跨站请求伪造,Cross-Site Request Forgery)是一种网络攻击手段,攻击者利用已通过身份验证的用户,诱导他们在不知情的情况下执行未授权操作。这种攻击通常发生在用户登录到可信网站并且有活动的会话时&#xf…

Python编码系列—Python组合模式:构建灵活的对象组合

🌟🌟 欢迎来到我的技术小筑,一个专为技术探索者打造的交流空间。在这里,我们不仅分享代码的智慧,还探讨技术的深度与广度。无论您是资深开发者还是技术新手,这里都有一片属于您的天空。让我们在知识的海洋中…

cv2.bitwise_or 提取ROI区域

原图如下所示,想提取圆形ROI区域,红色框 img np.ones(ori_img.shape, dtype"uint8") img img * 255 cv2.circle(img, (50,50), 50, 0, -1) self.bitwiseOr cv2.bitwise_or(ori_img, circle)使用一个和原图尺寸一致的图像做mask,图白圆黑 以…

MySQL:索引02——使用索引

目录 引言 1、自动创建索引 2、手动创建索引 2.1 主键索引 2.2 查看索引信息 2.3 唯一索引 2.4 普通索引 2.5 复合索引 3、删除索引 3.1 主键索引 3.2 其他索引 4、查看执行计划 4.1 不加条件,查询所有 4.2 使用主键查询 4.3 子查询使用索引 4.4 普通索…

【架构设计】多级缓存:应用案例与问题解决策略

【架构设计】多级缓存:应用案例与问题解决策略 多级缓存系统的工作原理及其在提升应用性能方面的关键作用。通过对比本地缓存与分布式缓存的特点 | 原创作者/编辑:凯哥Java | 分类:架构设计系列教程 多级缓存…

在基准测试和规划测试中选Flat还是Ramp-up?

Flat测试和Ramp-up测试是各有优势的,下面我们就通过介绍几种实用的性能测试策略来分析这两种加压策略的着重方向。 基准测试 基准测试是一种测量和评估软件性能指标的活动,通过基准测试建立一个已知的性能水平(称为基准线)&…

WPS生成目录

导航窗格:视图->导航窗格 可修改标题的样式,之后的标题直接套用即可 修改其他标题样式也是这样 添加编号:可以选上面的模版 也可自定义编号 生成目录:引用->目录->选用一个 但是我想把目录插到另一页 当我添加几个标题…

Spark-RDD持久化

一、Spark的三种持久化机制 1、cache 它是persist的一种简化方式,作用是将RDD缓存到内存中,以便后续快速访问,提高计算效率。cache操作是懒执行的,即执行action算子时才会触发。 2、persist 它提供了不同的存储级别&#xff0…

无人机黑飞打击技术详解

随着无人机技术的普及,无人机“黑飞”(未经授权或违反规定的飞行)现象日益严重,对公共安全、隐私保护及重要设施安全构成了严重威胁。为有效应对这一挑战,各国政府和安全机构纷纷研发并部署了一系列无人机黑飞打击技术…

HTML简介

HTML简介 1.HTML概述2.HTML元素3.HTML属性4.HTML 注释5.HTML颜色 1.HTML概述 HTML 是用来描述网页的一种语言。 HTML 指的是超文本标记语言HTML 不是一种编程语言&#xff0c;而是一种标记语言标记语言是一套标记标签HTML 使用标记标签来描述网页 例子&#xff1a; <htm…

Kotlin cancel CoroutineScope.launch的任务后仍运行

Kotlin cancel CoroutineScope.launch的任务后仍运行 import kotlinx.coroutines.*fun main() {runBlocking {val coroutineScope CoroutineScope(Dispatchers.IO)val job coroutineScope.launch {var i 0while (i < Int.MAX_VALUE) {iprintln(i)}}// 2ms 取消协程delay(…

2.计算机网络基础

2. 计算机网络基础 (1) 计算机网络的定义 计算机网络是指将地理位置不同、具有独立功能的多个计算机系统通过通信线路和设备连接起来,以功能完善的网络软件实现网络中资源共享的系统。最简单的定义是:计算机网络是一些互相连接的、自治的计算机系统的集合。最庞大的计算机网…

在 PostGIS 中进行千万级空间数据的空间查询和关键字查询

一、目的 本测试在探究在有限的计算机配置下&#xff0c;如何高效地对千万级的空间数据进行空间查询和关键字查询。通过实际操作和测试&#xff0c;评估不同查询策略的性能&#xff0c;为处理大规模空间数据提供可行的解决方案。 计算机配置如下&#xff1a; 内存&#xff0…

声网SDK脚本运行错误

文章目录 运行步骤无法运行.bat电脑出现警告--更改执行策略若无出现-更新power shell搜索最新版本的 PowerShell安装新版本 仍无法解决-手动下载第三方库 2024-9-9运行步骤 无法运行.bat 电脑出现警告–更改执行策略 若无出现-更新power shell 搜索最新版本的 PowerShell 在…