在当今互联网世界中,大多数应用都离不开网络通信。Java 提供了强大、灵活的网络 API,使得构建客户端-服务器模型变得简单且高效。
学习 Java 网络编程,你将掌握以下技能:
类名 | 描述 |
---|---|
Socket | TCP 客户端通信类 |
ServerSocket | TCP 服务器端通信类 |
DatagramSocket | UDP 通信类 |
InetAddress | 表示 IP 地址 |
URL / HttpURLConnection | 用于 HTTP 通信 |
css复制编辑[客户端 Socket] ---> [服务器 ServerSocket -> Socket]
<--- 回应数据
java复制编辑import java.io.*;
import java.net.*;
public class TcpServer {
public static void main(String[] args) throws IOException {
ServerSocket serverSocket = new ServerSocket(8888);
System.out.println("服务器启动,等待连接...");
Socket clientSocket = serverSocket.accept();
System.out.println("客户端已连接:" + clientSocket.getInetAddress());
BufferedReader in = new BufferedReader(
new InputStreamReader(clientSocket.getInputStream()));
PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);
String msg;
while ((msg = in.readLine()) != null) {
System.out.println("收到客户端:" + msg);
out.println("服务端回应:" + msg.toUpperCase());
}
clientSocket.close();
serverSocket.close();
}
}
java复制编辑public class TcpClient {
public static void main(String[] args) throws IOException {
Socket socket = new Socket("localhost", 8888);
BufferedReader in = new BufferedReader(
new InputStreamReader(socket.getInputStream()));
PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
out.println("hello server!");
System.out.println("服务端回应:" + in.readLine());
socket.close();
}
}
📌 多次运行客户端,即可与服务端反复交互。
lua复制编辑 +----------------------+
| ServerSocket |
+----------+-----------+
|
+-------------+-------------+
| |
[线程1处理客户端A] [线程2处理客户端B] ...
java复制编辑public class MultiThreadServer {
public static void main(String[] args) throws IOException {
ServerSocket server = new ServerSocket(9999);
System.out.println("服务器启动中...");
while (true) {
Socket client = server.accept();
new Thread(new ClientHandler(client)).start();
}
}
}
class ClientHandler implements Runnable {
private Socket client;
public ClientHandler(Socket client) {
this.client = client;
}
public void run() {
try (
BufferedReader in = new BufferedReader(
new InputStreamReader(client.getInputStream()));
PrintWriter out = new PrintWriter(client.getOutputStream(), true)
) {
String msg;
while ((msg = in.readLine()) != null) {
System.out.println("客户端:" + msg);
out.println("你说的是:" + msg);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
🎯 使用线程池 (ExecutorService
) 可以优化线程创建开销。
TCP 是面向连接的,而 UDP 是无连接、快速但不可靠的协议。
java复制编辑public class UdpSender {
public static void main(String[] args) throws IOException {
DatagramSocket socket = new DatagramSocket();
String message = "hello udp!";
byte[] buffer = message.getBytes();
InetAddress address = InetAddress.getByName("localhost");
DatagramPacket packet = new DatagramPacket(buffer, buffer.length, address, 8888);
socket.send(packet);
socket.close();
}
}
java复制编辑public class UdpReceiver {
public static void main(String[] args) throws IOException {
DatagramSocket socket = new DatagramSocket(8888);
byte[] buffer = new byte[1024];
DatagramPacket packet = new DatagramPacket(buffer, buffer.length);
System.out.println("等待UDP消息...");
socket.receive(packet);
String msg = new String(packet.getData(), 0, packet.getLength());
System.out.println("收到消息:" + msg);
socket.close();
}
}
Java 原生提供了访问 HTTP 的方式:
java复制编辑public class SimpleHttpClient {
public static void main(String[] args) throws IOException {
URL url = new URL("https://httpbin.org/get");
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("GET");
try (BufferedReader reader = new BufferedReader(
new InputStreamReader(conn.getInputStream()))) {
String line;
while ((line = reader.readLine()) != null)
System.out.println(line);
}
}
}
🌐 Java 11 之后也可以使用 HttpClient
:
java复制编辑HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://httpbin.org/get"))
.build();
HttpResponse<String> response = client.send(request, BodyHandlers.ofString());
System.out.println(response.body());
我们可以基于 ServerSocket
实现最基础的 Web 服务。
java复制编辑public class SimpleHttpServer {
public static void main(String[] args) throws IOException {
ServerSocket server = new ServerSocket(8080);
System.out.println("HTTP 服务启动:http://localhost:8080");
while (true) {
Socket client = server.accept();
new Thread(() -> {
try (
BufferedReader in = new BufferedReader(
new InputStreamReader(client.getInputStream()));
PrintWriter out = new PrintWriter(client.getOutputStream())
) {
String line;
while (!(line = in.readLine()).isEmpty()) {
System.out.println(line);
}
out.println("HTTP/1.1 200 OK");
out.println("Content-Type: text/html");
out.println("");
out.println("<html><body><h1>Hello from Java!</h1></body></html>");
out.flush();
} catch (IOException e) {
e.printStackTrace();
}
}).start();
}
}
}
访问 http://localhost:8080 即可看到响应网页。
socket.setSoTimeout()
Java 网络编程提供了基础的 Socket API 与高级 HTTP 通信能力,是每个后端开发者都应掌握的基础。本篇文章从最底层的 TCP/UDP 入门,到自定义 Web Server,为你构建网络通信能力打下了坚实基础。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。