1.InetAddress
约 1284 字大约 4 分钟
2025-06-21
[TOC]
概要:...
资料:...
1.InetAddress
InetAddress 是 Java 中用于表示 IP 地址的类。它位于 java.net 包中,提供了用于操作 IP 地址的各种方法。InetAddress 可以表示 IPv4 和 IPv6 地址,并可以通过主机名解析 IP 地址,或从 IP 地址获取主机名。
// 尝试使用 InetAddress 来做一些简单的 IP 操作
import java.net.InetAddress;
import java.net.UnknownHostException;
public class Main {
public static void main(String[] args) {
try {
// 根据远端主机域名和远端主机 IP 返回 InetAddress 对象来使用
InetAddress addressName = InetAddress.getByName("www.baidu.com"); // 根据域名返回 InetAddress 对象(一般推荐使用域名, 因为 IP 时常会被修改, 但是域名大概率不会)
InetAddress addressIp = InetAddress.getByName("157.148.69.74"); // 根据 IP 返回 InetAddress 对象
// 两个对象都可以输出远端主机域名和远端主机 IP
System.out.println("Remote Host Name: " + addressName.getHostName() + " " + addressName.getHostName()); // 输出远端主机域名
System.out.println("Remote IP Address: " + addressIp.getHostAddress() + " " + addressIp.getHostAddress()); // 输出远端主机 IP
// 获取本地主机的 InetAddress 对象
InetAddress localAddress = InetAddress.getLocalHost();
System.out.println("Local Host Name: " + localAddress.getHostName()); // 输出本地主机域名
System.out.println("Local IP Address: " + localAddress.getHostAddress()); // 输出本地主机 IP
// 测试是否可达
boolean reachable = addressName.isReachable(5000); // 超时设置为 5000 毫秒
System.out.println("Is Reachable: " + reachable);
} catch (UnknownHostException e) {
System.out.println("Unknown Host Exception: " + e.getMessage());
} catch (Exception e) {
System.out.println("Exception: " + e.getMessage());
}
}
}补充:在有些地方会把域名叫做主机名...我觉得叫域名会更好。
2.UDP/TCP通信
2.1.UDP 通信
// 服务端代码(使用本地机器模拟)
import java.net.DatagramPacket;
import java.net.DatagramSocket;
public class UDPServer {
public static void main(String[] args) {
DatagramSocket socket = null; // 存储 UDP 套接字, 不直接 new 是因为后面如果出现异常可能需要关闭套接字
try {
// 取得套接字
socket = new DatagramSocket(8080); // 获取套记字实例, 绑定 8080 端口, 一般不用我们设置服务端 IP 的绑定
System.out.println("服务端套接字绑定本地 IP 和本地 PORT: " + socket.getLocalAddress().toString() + ":" + socket.getLocalPort());
// 死循环处理
while (true) {
// 提示运行
System.out.println("服务端正在运行~");
// 接受消息
byte[] receiveData = new byte[1024]; // receiveData[] 用来存储从客户端读取到的数据
DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length); // 创建数据报对象
socket.receive(receivePacket); // 接收客户端发送的数据包
// 处理消息
String message = new String(receivePacket.getData(), 0, receivePacket.getLength()); // 0 表示从字节数组的哪个位置开始转换为字符串
// 发送消息
String capitalizedMessage = "服务端表示收到消息: " + message.toUpperCase();
byte[] sendData = capitalizedMessage.getBytes();
DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, receivePacket.getAddress(), receivePacket.getPort()); // 发送给客户端
socket.send(sendPacket);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (socket != null && !socket.isClosed()) {
socket.close();
}
}
}
}// 客户端代码(使用本地机器模拟)
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
public class UDPClient {
public static void main(String[] args) {
DatagramSocket socket = null; // 存储 UDP 套接字, 不直接 new 是因为后面如果出现异常可能需要关闭套接字
try {
// 取得套接字
socket = new DatagramSocket(); // 获取套记字实例, 一般不用我们设置服务器客户端的 IP 和 PORT
System.out.println("客户端套接字绑定本地 IP 和本地 PORT: " + socket.getLocalAddress().toString() + ":" + socket.getLocalPort());
// 单执行处理
// 提示运行
System.out.println("服务端正在运行~");
// 发送消息
String message = "Hello, UDP Server!";
byte[] sendData = message.getBytes();
InetAddress serverAddress = InetAddress.getByName("127.0.0.1"); // 使用 InetAddress 对象管理我们需要访问的服务端 IP
DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, serverAddress, 8080);
socket.send(sendPacket);
// 接收消息
byte[] receiveData = new byte[1024];
DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
socket.receive(receivePacket);
// 处理消息
String modifiedMessage = new String(receivePacket.getData(), 0, receivePacket.getLength());
System.out.println("收到回复: " + modifiedMessage);
} catch (Exception e) {
e.printStackTrace(); // 由于这是服务端代码, 因此这里应该替换为日志输出更好, 不过这里就先这样...
} finally {
if (socket != null && !socket.isClosed()) {
socket.close();
}
}
}
}吐槽:虽然但是我觉得封装的挺一般,使用上没啥太好的体验...除了套接字确实方便了一些,不过有原生的网络库总比隔壁
Cpp没有(2024-7-17)的好...
2.2.TCP 通信
// 服务端代码(使用本地机器模拟)
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
public class TCPServer {
public static void main(String[] args) {
ServerSocket serverSocket = null; // 存储 TCP 套接字
Socket clientSocket = null; // 存储 Link 套接字
try {
// 取得套接字
serverSocket = new ServerSocket(8080);
// 获取到连接
clientSocket = serverSocket.accept();
System.out.println("客户端已连接: " + clientSocket.getInetAddress().toString() + ":" + clientSocket.getPort());
// 获取得到流
BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream())); // 读取客户端的流
PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true); // 写回客户端的流
// 提示运行
System.out.println("服务端正在运行~");
// 接收消息
String message;
while ((message = in.readLine()) != null) {
// 处理消息
String capitalizedMessage = "服务端表示收到消息: " + message.toUpperCase();
// 发送消息
out.println(capitalizedMessage);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (clientSocket != null) {
clientSocket.close();
}
if (serverSocket != null) {
serverSocket.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
}// 客户端代码(使用本地机器模拟)
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
public class TCPClient {
public static void main(String[] args) {
Socket socket = null;
try {
// 取得套接字
socket = new Socket("127.0.0.1", 8080);
System.out.println("已连接到服务器: " + socket.getInetAddress().toString() + ":" + socket.getPort());
// 获取得到流
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
// 提示运行
System.out.println("客户端正在运行~");
// 发送消息
String message = "Hello, TCP Server!";
out.println(message);
// 接收消息
String modifiedMessage = in.readLine();
// 处理消息
System.out.println("收到回复: " + modifiedMessage);
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (socket != null) {
socket.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
}3.
3.1.
3.2.
结语:...
更新日志
2025/11/24 07:31
查看所有更新日志