javax.net网络编程完全指南:核心类解析与实战代码示例
javax.net是Java标准库中网络编程的核心包,提供创建网络连接的基础类和接口。本文详细解析SocketFactory、ServerSocketFactory、Socket和ServerSocket四大核心组件,通过完整的代码示例展示基础客户端服务器通信、自定义SocketFactory实现以及多线程服务器开发。每个示例都包含详细的代码注释和异常处理,帮助开发者快速掌握Java网络编程的实际应用技巧,适用于各种网络服务通信和自定义协议实现场景。
javax.net 包是 Java 标准库中用于网络编程的核心包之一,提供了创建网络连接的基础类和接口。它主要包含以下核心组件:
主要类和接口
1. SocketFactory
用于创建客户端套接字的工厂类
2. ServerSocketFactory
用于创建服务器套接字的工厂类
3. Socket
表示客户端套接字
4. ServerSocket
表示服务器端套接字
示例代码
1. 基础 Socket 客户端示例
import javax.net.SocketFactory;
import java.io.*;
import java.net.Socket;
public class BasicSocketClient {
public static void main(String[] args) {
try {
// 使用默认的 SocketFactory 创建 Socket
SocketFactory factory = SocketFactory.getDefault();
Socket socket = factory.createSocket("localhost", 8080);
// 获取输出流发送数据
OutputStream output = socket.getOutputStream();
PrintWriter writer = new PrintWriter(output, true);
writer.println("Hello Server!");
// 获取输入流接收响应
InputStream input = socket.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(input));
String response = reader.readLine();
System.out.println("Server response: " + response);
// 关闭连接
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}2. 基础 ServerSocket 服务器示例
import javax.net.ServerSocketFactory;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
public class BasicSocketServer {
public static void main(String[] args) {
try {
// 使用默认的 ServerSocketFactory 创建 ServerSocket
ServerSocketFactory factory = ServerSocketFactory.getDefault();
ServerSocket serverSocket = factory.createServerSocket(8080);
System.out.println("Server started on port 8080");
while (true) {
// 等待客户端连接
Socket clientSocket = serverSocket.accept();
System.out.println("Client connected: " + clientSocket.getInetAddress());
// 处理客户端请求
handleClient(clientSocket);
}
} catch (IOException e) {
e.printStackTrace();
}
}
private static void handleClient(Socket clientSocket) {
try {
// 获取输入流读取客户端数据
InputStream input = clientSocket.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(input));
String message = reader.readLine();
System.out.println("Received from client: " + message);
// 发送响应
OutputStream output = clientSocket.getOutputStream();
PrintWriter writer = new PrintWriter(output, true);
writer.println("Hello Client! I received your message: " + message);
// 关闭连接
clientSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}3. 自定义 SocketFactory 示例
import javax.net.SocketFactory;
import java.io.IOException;
import java.net.InetAddress;
import java.net.Socket;
// 自定义 SocketFactory
public class CustomSocketFactory extends SocketFactory {
private final SocketFactory defaultFactory = SocketFactory.getDefault();
@Override
public Socket createSocket(String host, int port) throws IOException {
System.out.println("Creating socket to " + host + ":" + port);
Socket socket = defaultFactory.createSocket(host, port);
// 可以在这里添加自定义配置
socket.setSoTimeout(5000); // 设置超时时间
return socket;
}
@Override
public Socket createSocket(String host, int port, InetAddress localAddr, int localPort)
throws IOException {
System.out.println("Creating socket to " + host + ":" + port +
" from local address " + localAddr + ":" + localPort);
return defaultFactory.createSocket(host, port, localAddr, localPort);
}
@Override
public Socket createSocket(InetAddress address, int port) throws IOException {
System.out.println("Creating socket to " + address + ":" + port);
return defaultFactory.createSocket(address, port);
}
@Override
public Socket createSocket(InetAddress address, int port, InetAddress localAddr, int localPort)
throws IOException {
return defaultFactory.createSocket(address, port, localAddr, localPort);
}
}
// 使用自定义 SocketFactory 的客户端
public class CustomSocketClient {
public static void main(String[] args) {
try {
SocketFactory customFactory = new CustomSocketFactory();
Socket socket = customFactory.createSocket("localhost", 8080);
// 使用 socket 进行通信...
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}4. 多线程服务器示例
import javax.net.ServerSocketFactory;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class MultiThreadedServer {
private static final int THREAD_POOL_SIZE = 10;
private static final ExecutorService executor = Executors.newFixedThreadPool(THREAD_POOL_SIZE);
public static void main(String[] args) {
try {
ServerSocketFactory factory = ServerSocketFactory.getDefault();
ServerSocket serverSocket = factory.createServerSocket(8080);
System.out.println("Multi-threaded server started on port 8080");
while (true) {
Socket clientSocket = serverSocket.accept();
// 为每个客户端连接创建新线程处理
executor.execute(new ClientHandler(clientSocket));
}
} catch (IOException e) {
e.printStackTrace();
} finally {
executor.shutdown();
}
}
static class ClientHandler implements Runnable {
private final Socket clientSocket;
public ClientHandler(Socket socket) {
this.clientSocket = socket;
}
@Override
public void run() {
try {
BufferedReader reader = new BufferedReader(
new InputStreamReader(clientSocket.getInputStream()));
PrintWriter writer = new PrintWriter(clientSocket.getOutputStream(), true);
String message;
while ((message = reader.readLine()) != null) {
System.out.println("Received: " + message);
writer.println("Echo: " + message);
if ("bye".equalsIgnoreCase(message)) {
break;
}
}
clientSocket.close();
System.out.println("Client disconnected: " + clientSocket.getInetAddress());
} catch (IOException e) {
e.printStackTrace();
}
}
}
}主要特点
1、工厂模式:使用工厂类创建套接字,便于扩展和自定义
2、抽象化:提供了网络通信的抽象接口
3、可扩展性:可以通过继承创建自定义的 SocketFactory
4、与 javax.net.ssl 集成:为 SSL/TLS 通信提供基础
实际应用场景
1、客户端/服务器应用程序
2、网络服务通信
3、自定义网络协议实现
4、需要特殊套接字配置的场景
最后更新于5月前
本文由人工编写,AI优化,转载请注明原文地址: javax.net使用指南:Java网络编程核心类与代码实例详解
推荐阅读
评论 (3)
请 登录 后发表评论
很棒的教程!代码示例很清晰,让我对javax.net包的使用有了直观的理解。感谢作者的分享!
很实用的javax.net使用指南!代码示例清晰易懂,对我理解Socket编程帮助很大。感谢作者的详细分享!
很详细的javax.net使用指南!代码示例很实用,让我对Socket和ServerSocket的用法有了清晰的理解。感谢作者的分享!