在当今互联网应用中,网络编程是 Java 开发者必须掌握的一项关键技能。无论是构建聊天系统、文件传输、物联网交互,还是服务端 API 通信,Java 的网络编程提供了强大的支持。
本文将从基础的 Socket 通信开始,逐步深入到多线程服务器开发,并提供图文实例帮助理解。
Java 网络编程主要依赖于以下核心类:
类名 | 用途 |
---|---|
Socket | 客户端通信套接字 |
ServerSocket | 服务器监听套接字 |
InetAddress | IP 地址解析与封装 |
DatagramSocket | UDP 发送与接收 |
URLConnection | 基于 HTTP 的网络通信(高层) |
📌 本文聚焦 TCP 通信,即通过 Socket
与 ServerSocket
实现可靠连接。
java复制编辑import java.io.*;
import java.net.*;
public class SimpleServer {
public static void main(String[] args) throws IOException {
ServerSocket server = new ServerSocket(8888);
System.out.println("服务器启动,等待连接...");
Socket socket = server.accept();
System.out.println("客户端连接成功:" + socket.getInetAddress());
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String msg = in.readLine();
System.out.println("收到消息:" + msg);
socket.close();
server.close();
}
}
java复制编辑import java.io.*;
import java.net.*;
public class SimpleClient {
public static void main(String[] args) throws IOException {
Socket client = new Socket("127.0.0.1", 8888);
BufferedWriter out = new BufferedWriter(new OutputStreamWriter(client.getOutputStream()));
out.write("你好,服务端!\n");
out.flush();
client.close();
}
}
🖼️ 图示:客户端 → 发送数据 → 服务端 → 接收 & 输出
让服务端回传客户端发来的数据:
java复制编辑// EchoServer.java
Socket socket = server.accept();
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
BufferedWriter out = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
String input;
while ((input = in.readLine()) != null) {
System.out.println("收到:" + input);
out.write("服务器回应:" + input + "\n");
out.flush();
}
客户端也要读取服务端返回的数据。
java复制编辑// EchoClient.java
BufferedReader userInput = new BufferedReader(new InputStreamReader(System.in));
BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream()));
String input;
while ((input = userInput.readLine()) != null) {
out.write(input + "\n");
out.flush();
System.out.println("服务端回应:" + in.readLine());
}
java复制编辑class ClientHandler extends Thread {
private Socket socket;
public ClientHandler(Socket socket) {
this.socket = socket;
}
public void run() {
try (
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
BufferedWriter out = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()))
) {
String line;
while ((line = in.readLine()) != null) {
System.out.println("收到:" + line);
out.write("已收到:" + line + "\n");
out.flush();
}
} catch (IOException e) {
System.err.println("通信异常:" + e.getMessage());
}
}
}
java复制编辑public class MultiThreadedServer {
public static void main(String[] args) throws IOException {
ServerSocket server = new ServerSocket(9999);
System.out.println("服务器启动,等待客户端连接...");
while (true) {
Socket clientSocket = server.accept();
new ClientHandler(clientSocket).start();
}
}
}
🖼️ 图示:每个连接都分配一个 ClientHandler
线程处理
实现一个支持多人聊天的服务器端:
java复制编辑public class ChatServer {
private static Set<BufferedWriter> clientOutputs = Collections.synchronizedSet(new HashSet<>());
public static void main(String[] args) throws IOException {
ServerSocket server = new ServerSocket(6666);
System.out.println("聊天室启动...");
while (true) {
Socket client = server.accept();
new Thread(() -> handleClient(client)).start();
}
}
private static void handleClient(Socket client) {
try (
BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream()));
BufferedWriter out = new BufferedWriter(new OutputStreamWriter(client.getOutputStream()))
) {
clientOutputs.add(out);
String msg;
while ((msg = in.readLine()) != null) {
for (BufferedWriter writer : clientOutputs) {
writer.write(msg + "\n");
writer.flush();
}
}
} catch (IOException e) {
System.err.println("连接异常:" + e.getMessage());
}
}
}
客户端发送的每一句话会广播给所有其他连接者。
避免线程爆炸,可以使用 ExecutorService
管理线程:
java复制编辑ExecutorService pool = Executors.newFixedThreadPool(10);
while (true) {
Socket client = server.accept();
pool.execute(() -> handleClient(client));
}
📌 好处:线程复用、统一管理,降低资源消耗
问题 | 原因 |
---|---|
端口占用 | 端口未关闭或已被其他服务占用 |
客户端连接不上 | IP、端口错误、防火墙阻拦 |
收不到数据/粘包 | 缓冲流未 flush,或未换行 |
多线程冲突 | 同步控制不足,数据结构不安全 |
服务端阻塞等待一个客户端挂起 | 应使用多线程或异步处理 |
SocketChannel
实现高并发服务
Java 网络编程虽然门槛不高,但涉及许多底层通信机制,掌握后可以灵活构建聊天工具、P2P 应用、IoT 系统、RPC 服务等。本文通过 Socket 入门,演示了从基本通信到多线程服务的全过程。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。