文章目录
前言
Java网络编程是开发分布式应用程序的重要技能,它通过套接字(Socket)进行数据传输,支持TCP和UDP协议。本文将介绍Java网络编程的基础知识,包括Socket、ServerSocket、TCP通信、UDP通信、常用类和示例代码。
一、网络编程基础知识
1. 什么是网络编程?
网络编程是指在计算机之间通过网络进行数据传输和通信的编程方式。Java提供了强大的java.net
包,封装了底层的网络协议,简化了网络编程。
网络编程常用协议:
- TCP(Transmission Control Protocol):面向连接,可靠传输,保证数据按序到达,适合文件传输、Web通信等。
- UDP(User Datagram Protocol):面向无连接,不可靠但速度快,适合视频通话、广播消息等。
二、Java网络编程核心类
Java使用java.net
包中的类进行网络编程,常用类包括:
- Socket:用于实现TCP客户端通信。
- ServerSocket:用于实现TCP服务器通信。
- DatagramSocket:用于UDP通信。
- InetAddress:用于处理IP地址。
- URL与HttpURLConnection:处理HTTP协议通信。
三、TCP编程实现
1. TCP通信原理
在TCP通信中:
- 服务器端:创建
ServerSocket
对象,监听指定端口,等待客户端连接。 - 客户端:创建
Socket
对象,连接服务器。 - 数据传输:双方使用输入输出流进行数据读写。
2. TCP服务器端示例
创建服务器端,监听端口并接收客户端发送的数据。
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
public class TCPServer {
public static void main(String[] args) {
int port = 8080;
try (ServerSocket serverSocket = new ServerSocket(port)) {
System.out.println("服务器启动,等待客户端连接...");
while (true) {
Socket socket = serverSocket.accept(); // 等待客户端连接
System.out.println("客户端已连接:" + socket.getInetAddress());
// 接收数据
BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String message = reader.readLine();
System.out.println("客户端消息: " + message);
// 响应数据
PrintWriter writer = new PrintWriter(socket.getOutputStream(), true);
writer.println("服务器已收到: " + message);
socket.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
3. TCP客户端示例
创建客户端,连接服务器并发送消息。
import java.io.*;
import java.net.Socket;
public class TCPClient {
public static void main(String[] args) {
String host = "localhost";
int port = 8080;
try (Socket socket = new Socket(host, port)) {
System.out.println("连接服务器...");
// 发送数据
PrintWriter writer = new PrintWriter(socket.getOutputStream(), true);
writer.println("你好,服务器!");
// 接收响应
BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
System.out.println("服务器响应: " + reader.readLine());
} catch (IOException e) {
e.printStackTrace();
}
}
}
✅ 运行步骤:
- 先运行服务器端程序,监听端口。
- 再运行客户端程序,连接服务器并发送消息。
- 服务器收到消息后返回响应。
四、UDP编程实现
1. UDP通信原理
- 服务器端:创建
DatagramSocket
,监听端口,接收数据报。 - 客户端:创建
DatagramSocket
,向服务器发送数据报。 - 数据传输:使用
DatagramPacket
进行发送和接收。
2. UDP服务器端示例
创建服务器,监听端口,接收客户端数据报。
import java.net.DatagramPacket;
import java.net.DatagramSocket;
public class UDPServer {
public static void main(String[] args) {
int port = 8080;
byte[] buffer = new byte[1024];
try (DatagramSocket socket = new DatagramSocket(port)) {
System.out.println("UDP服务器启动,监听端口:" + port);
while (true) {
DatagramPacket packet = new DatagramPacket(buffer, buffer.length);
socket.receive(packet);
String message = new String(packet.getData(), 0, packet.getLength());
System.out.println("收到客户端消息: " + message);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
3. UDP客户端示例
创建客户端,向服务器发送数据报。
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
public class UDPClient {
public static void main(String[] args) {
String server = "localhost";
int port = 8080;
try (DatagramSocket socket = new DatagramSocket()) {
byte[] buffer = "你好,UDP服务器!".getBytes();
InetAddress address = InetAddress.getByName(server);
DatagramPacket packet = new DatagramPacket(buffer, buffer.length, address, port);
socket.send(packet);
System.out.println("UDP消息已发送");
} catch (Exception e) {
e.printStackTrace();
}
}
}
✅ 运行步骤:
- 先运行服务器端程序,监听端口。
- 再运行客户端程序,发送消息。
- 服务器端输出接收到的消息。
五、使用HttpURLConnection发送HTTP请求
HttpURLConnection
类用于在Java中实现HTTP请求,可用于调用REST API或抓取网页数据。
1. GET请求示例
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
public class HttpGetExample {
public static void main(String[] args) {
try {
URL url = new URL("https://jsonplaceholder.typicode.com/posts/1");
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("GET");
BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
String line;
StringBuilder response = new StringBuilder();
while ((line = reader.readLine()) != null) {
response.append(line);
}
reader.close();
System.out.println("响应数据: " + response.toString());
} catch (Exception e) {
e.printStackTrace();
}
}
}
✅ 输出示例:
{
"userId": 1,
"id": 1,
"title": "sunt aut facere repellat",
"body": "quia et suscipit..."
}
六、网络编程中的常见问题与解决方案
1. 端口占用问题
- 运行程序时若端口被占用,需手动释放或选择其他端口。
2. 网络延迟与超时
- 设置Socket超时:
socket.setSoTimeout(5000); // 设置超时时间为5秒
3. 防止粘包与拆包
- TCP可能出现粘包或拆包问题,可通过
BufferedReader
读取一行数据或使用分隔符处理。