Java 网络编程

网络编程让不同主机上的程序互相通信。java.net 包基于 TCPUDP 两种协议提供支持: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 像浏览器一样直接读取网络资源。

笔记加载中…