Java的网络编程主要通过java.net
包中的类和接口来实现。这个包提供了用于创建网络应用程序的类,包括客户端和服务器端的通信。以下是一些常用的类和接口:
1. Socket
和 ServerSocket
Socket
:用于客户端,表示一个连接到服务器的套接字。ServerSocket
:用于服务器端,监听客户端的连接请求。
示例:简单的TCP客户端和服务器
服务器端代码:
import java.io.*;
import java.net.*;
public class TCPServer {
public static void main(String[] args) {
try (ServerSocket serverSocket = new ServerSocket(12345)) {
System.out.println("服务器已启动,等待客户端连接...");
try (Socket clientSocket = serverSocket.accept()) {
System.out.println("客户端已连接:" + clientSocket.getInetAddress());
try (BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true)) {
String inputLine;
while ((inputLine = in.readLine()) != null) {
System.out.println("收到客户端消息:" + inputLine);
out.println("服务器已收到:" + inputLine);
}
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
客户端代码:
import java.io.*;
import java.net.*;
public class TCPClient {
public static void main(String[] args) {
try (Socket socket = new Socket("localhost", 12345)) {
System.out.println("已连接到服务器");
try (BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
BufferedReader stdIn = new BufferedReader(new InputStreamReader(System.in))) {
String userInput;
while ((userInput = stdIn.readLine()) != null) {
out.println(userInput);
System.out.println("服务器回复:" + in.readLine());
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
2. DatagramSocket
和 DatagramPacket
DatagramSocket
:用于发送和接收UDP数据包。DatagramPacket
:表示UDP数据包。
示例:简单的UDP客户端和服务器
服务器端代码:
import java.io.*;
import java.net.*;
public class UDPServer {
public static void main(String[] args) {
try (DatagramSocket socket = new DatagramSocket(12345)) {
byte[] buffer = new byte[1024];
DatagramPacket packet = new DatagramPacket(buffer, buffer.length);
System.out.println("服务器已启动,等待客户端消息...");
while (true) {
socket.receive(packet);
String received = new String(packet.getData(), 0, packet.getLength());
System.out.println("收到客户端消息:" + received);
String reply = "服务器已收到:" + received;
DatagramPacket replyPacket = new DatagramPacket(reply.getBytes(), reply.length(), packet.getAddress(), packet.getPort());
socket.send(replyPacket);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
客户端代码:
import java.io.*;
import java.net.*;
public class UDPClient {
public static void main(String[] args) {
try (DatagramSocket socket = new DatagramSocket()) {
InetAddress address = InetAddress.getByName("localhost");
byte[] buffer;
DatagramPacket packet;
BufferedReader stdIn = new BufferedReader(new InputStreamReader(System.in));
String userInput;
while ((userInput = stdIn.readLine()) != null) {
buffer = userInput.getBytes();
packet = new DatagramPacket(buffer, buffer.length, address, 12345);
socket.send(packet);
buffer = new byte[1024];
packet = new DatagramPacket(buffer, buffer.length);
socket.receive(packet);
String received = new String(packet.getData(), 0, packet.getLength());
System.out.println("服务器回复:" + received);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
3. URL
和 URLConnection
URL
:表示一个统一资源定位符,指向万维网上的资源。URLConnection
:用于与URL进行通信。
示例:使用URL
和URLConnection
读取网页内容
import java.io.*;
import java.net.*;
public class URLExample {
public static void main(String[] args) {
try {
URL url = new URL("https://www.example.com");
URLConnection connection = url.openConnection();
try (BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()))) {
String inputLine;
while ((inputLine = in.readLine()) != null) {
System.out.println(inputLine);
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
这些示例展示了Java网络编程的基本用法,包括TCP和UDP通信以及通过URL读取网页内容。根据具体需求,可以选择合适的类和方法来实现网络应用程序。