Java网络连接如何建立
在 Java 中建立网络连接,通常取决于你使用的网络协议。最常见的是 TCP(如 HTTP、Socket) 和 UDP。下面按常见场景给你一个清晰、实用的说明。
一、使用 java.net.Socket 建立 TCP 连接(最基础)
1️⃣ 客户端建立连接
import java.io.*;
import java.net.*;
public class Client {
public static void main(String[] args) {
try {
// 建立 TCP 连接
Socket socket = new Socket("localhost", 8080);
// 发送数据
OutputStream os = socket.getOutputStream();
PrintWriter writer = new PrintWriter(os, true);
writer.println("Hello Server");
// 接收数据
InputStream is = socket.getInputStream();
BufferedReader reader =
new BufferedReader(new InputStreamReader(is));
String response = reader.readLine();
System.out.println("服务端返回:" + response);
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
2️⃣ 服务端监听连接
import java.io.*;
import java.net.*;
public class Server {
public static void main(String[] args) {
try {
ServerSocket serverSocket = new ServerSocket(8080);
System.out.println("服务器启动,等待连接...");
Socket socket = serverSocket.accept(); // 阻塞等待连接
System.out.println("客户端已连接");
BufferedReader reader =
new BufferedReader(new InputStreamReader(socket.getInputStream()));
String msg = reader.readLine();
System.out.println("收到消息:" + msg);
PrintWriter writer =
new PrintWriter(socket.getOutputStream(), true);
writer.println("你好,客户端");
socket.close();
serverSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
✅ 流程总结:
客户端 Socket → 连接 → 服务端 ServerSocket.accept()
二、HTTP 网络连接(最常见)
方式一:使用 HttpURLConnection(JDK 自带)
import java.io.*;
import java.net.*;
public class HttpExample {
public static void main(String[] args) throws Exception {
URL url = new URL("https://www.example.com");
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("GET");
BufferedReader reader =
new BufferedReader(new InputStreamReader(conn.getInputStream()));
String line;
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
conn.disconnect();
}
}
方式二:使用 Socket 手动实现 HTTP(理解原理)
Socket socket = new Socket("www.example.com", 80);
PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
out.println("GET / HTTP/1.1");
out.println("Host: www.example.com");
out.println();
BufferedReader in = new BufferedReader(
new InputStreamReader(socket.getInputStream()));
in.lines().forEach(System.out::println);
三、UDP 网络连接(无连接)
// 发送端
DatagramSocket socket = new DatagramSocket();
byte[] data = "Hello".getBytes();
DatagramPacket packet = new DatagramPacket(
data, data.length, InetAddress.getByName("localhost"), 9999);
socket.send(packet);
socket.close();
// 接收端
DatagramSocket socket = new DatagramSocket(9999);
byte[] buf = new byte[1024];
DatagramPacket packet = new DatagramPacket(buf, buf.length);
socket.receive(packet);
System.out.println(new String(packet.getData(), 0, packet.getLength()));
socket.close();
四、现代方式(推荐)
✅ Java 11+ java.net.http.HttpClient
import java.net.http.*;
import java.net.URI;
public class HttpClientExample {
public static void main(String[] args) throws Exception {
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://www.example.com"))
.build();
HttpResponse response =
client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());
}
}
五、常见注意点
| 问题 | 说明 |
|---|---|
| 端口占用 | Address already in use |
| 防火墙 | 连接超时 |
| 阻塞 | accept()、read() |
| 编码 | 使用 InputStreamReader 指定 UTF-8 |
六、怎么选?
| 场景 | 推荐 |
|---|---|
| 聊天 / 游戏 | Socket |
| 访问网页 | HttpClient |
| 文件传输 | Socket |
| 实时广播 | UDP |
如果你愿意,我可以:
- 帮你写一个 完整可运行的 Demo
- 讲 TCP 三次握手在 Java 中的体现
- 对比 BIO / NIO / Netty
你现在是 学习网络基础 还是 做项目?