Java 网络编程
网络编程让不同主机上的程序互相通信。java.net 包基于 TCP 与 UDP 两种协议提供支持:TCP 面向连接、可靠有序(先三次握手再传输),适合文件下载、网页访问;UDP 无连接、只管发不管到,速度快但可能丢包,适合直播、游戏。端口(0~65535)是主机内区分服务的编号,如 HTTP 默认 80、MySQL 默认 3306,通信时用"IP 地址 + 端口号"精确定位目标程序。
InetAddress 获取地址
InetAddress 封装 IP 地址,可获取本机或任意域名对应的地址(片段需放进 main 方法中运行):
InetAddress local = InetAddress.getLocalHost();
System.out.println(local.getHostAddress()); // 输出:本机 IP,如 192.168.1.10
System.out.println(local.getHostName()); // 输出:本机主机名
System.out.println(local.isReachable(3000)); // 输出:本机是否可达
服务器端 ServerSocket
服务器用 ServerSocket 绑定端口,accept() 会阻塞等待客户端连入,连上后返回该连接的 Socket:
import java.io.*;
import java.net.*;
public class TcpServer {
public static void main(String[] args) throws Exception {
ServerSocket server = new ServerSocket(8888); // 监听 8888 端口
System.out.println("服务器已启动,等待连接...");
Socket socket = server.accept(); // 阻塞直到有客户端连入
BufferedReader in = new BufferedReader(
new InputStreamReader(socket.getInputStream()));
System.out.println("收到消息:" + in.readLine()); // 读取一行文本
socket.close();
server.close();
}
}
客户端 Socket
客户端用 Socket 连接服务器的 IP 与端口,连上后即可通过流收发数据:
import java.io.*;
import java.net.*;
public class TcpClient {
public static void main(String[] args) throws Exception {
Socket socket = new Socket("127.0.0.1", 8888); // 连接本机 8888 端口
PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
out.println("你好,服务器!"); // 发送一行文本
socket.close();
}
}
先启动 TcpServer 再启动 TcpClient,服务器控制台输出 收到消息:你好,服务器!,这就是最简 TCP 通信。真实服务器通常用 while 循环反复 accept,并为每个连接开一个线程处理。
UDP DatagramSocket 简介
UDP 用 DatagramPacket 打包数据、DatagramSocket 发送接收,全程不建立连接(片段需放进 main 方法中运行):
DatagramSocket ds = new DatagramSocket();
byte[] data = "UDP 数据".getBytes();
DatagramPacket p = new DatagramPacket(data, data.length,
InetAddress.getByName("127.0.0.1"), 9999);
ds.send(p); // 发出即完成,不关心对方是否收到
ds.close();
接收端用 new DatagramSocket(9999) 绑定同一端口,调用 receive(packet) 阻塞接收数据并取出打印。
URL/URLConnection 访问网页
URL 指向网络资源,openStream() 可直接读取网页内容(片段需放进 main 方法中运行):
URL url = new URL("https://www.runoob.com");
try (BufferedReader in = new BufferedReader(new InputStreamReader(
url.openStream(), "UTF-8"))) {
String line;
while ((line = in.readLine()) != null) {
System.out.println(line); // 输出:网页 HTML 源码
}
}
小结:TCP 编程的固定套路是 ServerSocket.accept() 接收 + Socket 连接后用流收发;UDP 用 DatagramSocket 更快但不可靠;URLConnection 让 Java 像浏览器一样直接读取网络资源。