InetAddress
package com.example.demo1;import java.net.InetAddress;
import java.net.UnknownHostException;public class a {public static void main(String[] args) {try {// 1. 使用主机名获取IP地址(以百度为例)InetAddress baiduAddr = InetAddress.getByName("www.baidu.com");System.out.println("百度主机名: " + baiduAddr.getHostName()); // getHostName()System.out.println("百度IP地址: " + baiduAddr.getHostAddress()); // getHostAddress()// 2. 使用IP地址字符串获取InetAddress对象(以本地回环地址为例)InetAddress localAddr = InetAddress.getByName("127.0.0.1");System.out.println("\n本地主机名: " + localAddr.getHostName()); System.out.println("本地IP地址: " + localAddr.getHostAddress());// 3. 直接获取本地主机的InetAddress对象(等价于getByName("localhost"))InetAddress localHost = InetAddress.getLocalHost();System.out.println("\n本机真实主机名: " + localHost.getHostName()); System.out.println("本机真实IP地址: " + localHost.getHostAddress());} catch (UnknownHostException e) {System.out.println("错误:无法解析主机地址 - " + e.getMessage());}}
}
UDP通信示例
UDP数据发送端
package com.example.demo1;import java.net.*;public class UdpSender {public static void main(String[] args) {// 使用无参构造创建DatagramSocket(自动绑定本地可用端口)try (DatagramSocket senderSocket = new DatagramSocket()) {// 要发送的数据String message = "Hello UDP!";byte[] sendData = message.getBytes();// 创建数据包:目标地址(本机测试用127.0.0.1),目标端口8888InetAddress targetAddr = InetAddress.getByName("127.0.0.1");int targetPort = 8888;DatagramPacket sendPacket = new DatagramPacket(sendData, // 数据缓冲区sendData.length,// 发送长度targetAddr, // 目标地址targetPort // 目标端口);// 发送数据报包senderSocket.send(sendPacket);System.out.println("UDP数据已发送:" + message);} catch (Exception e) {e.printStackTrace();}// try-with-resources自动调用close()关闭套接字}
}
UDP数据接收端
package com.example.demo1;import java.net.*;public class UdpReceiver {public static void main(String[] args) {// 绑定8888端口(需与发送端目标端口一致)try (DatagramSocket receiverSocket = new DatagramSocket(8888)) {// 创建接收用的数据包(缓冲区大小1024字节)byte[] receiveBuf = new byte[1024];DatagramPacket receivePacket = new DatagramPacket(receiveBuf, // 数据缓冲区receiveBuf.length // 最大接收长度);System.out.println("UDP接收端已启动,等待数据...");// 阻塞等待接收数据(会一直等待直到收到数据包)receiverSocket.receive(receivePacket);// 从数据包中提取实际接收的数据byte[] actualData = receivePacket.getData(); // 获取缓冲区int dataLength = receivePacket.getLength(); // 获取实际接收长度String receivedMessage = new String(actualData, 0, dataLength);System.out.println("收到UDP数据:" + receivedMessage);System.out.println("数据来自:" + receivePacket.getAddress() + ":" + receivePacket.getPort());} catch (Exception e) {e.printStackTrace();}// try-with-resources自动调用close()关闭套接字}
}
TCP通信示例
TCP客户端
package com.example.demo1;import java.net.*;
import java.io.*;public class TcpClient {public static void main(String[] args) {// 连接本机8889端口的TCP服务器try (Socket clientSocket = new Socket("127.0.0.1", 8889)) {// 获取输出流(向服务器发送数据)OutputStream out = clientSocket.getOutputStream();String message = "Hello TCP!";out.write(message.getBytes());out.flush(); // 强制刷新缓冲区确保数据发送// 获取输入流(接收服务器响应)InputStream in = clientSocket.getInputStream();byte[] response = new byte[1024];int len = in.read(response);System.out.println("收到服务器响应:" + new String(response, 0, len));} catch (Exception e) {e.printStackTrace();}// Socket关闭时会自动关闭关联的流}
}
TCP服务器端
package com.example.demo1;import java.net.*;
import java.io.*;public class TcpServer {public static void main(String[] args) {// 绑定8889端口监听try (ServerSocket serverSocket = new ServerSocket(8889)) {System.out.println("TCP服务器已启动,等待连接...");// 阻塞等待客户端连接(返回客户端的Socket对象)try (Socket clientSocket = serverSocket.accept()) {// 获取输入流(接收客户端数据)InputStream in = clientSocket.getInputStream();byte[] request = new byte[1024];int len = in.read(request);System.out.println("收到客户端数据:" + new String(request, 0, len));// 获取输出流(向客户端发送响应)OutputStream out = clientSocket.getOutputStream();String response = "已收到你的消息!";out.write(response.getBytes());out.flush();} catch (IOException e) {e.printStackTrace();}} catch (IOException e) {e.printStackTrace();}}
}