当前位置: 首页 > news >正文

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.mrgr.cn/news/30458.html

相关文章:

  • 【菜笔cf刷题日常-1400】C. RationalLee(贪心)
  • vue计算属性 初步使用案例
  • 常见git命令记录
  • git上feature合并到development分支
  • WebRTC视频 01 - 视频采集整体架构
  • android dvr黑屏
  • c++ static(详解)
  • C++中的哑元和内联函数
  • github的使用
  • Redis---卸载Redis
  • PyTorch经典模型
  • java序列化对象后读取数据错误的问题
  • 初学者笔记本电脑玩转大模型系列一:利用ollama跑大模型
  • Ceph官方文档_01_Ceph简介
  • C++ prime plus-4-编程练习
  • 【读书笔记-《30天自制操作系统》-22】Day23
  • 枚举(not二分)
  • 【移动端开发】“明日头条APP”
  • 【Java】网络编程-地址管理-IP协议后序-NAT机制-以太网MAC机制
  • [2025]基于微信小程序慢性呼吸系统疾病的健康管理(源码+文档+解答)
  • 预处理、makefile、静动态库编写、nfs挂载、快捷命令
  • 白酒与朋友聚餐:如何活跃气氛,增进感情?
  • 每日OJ题_牛客_除2!(贪心+堆)
  • 2024.9.19
  • 【C++算法】模拟算法
  • 【MySQL】表的相关操作