面试题答案
一键面试在Java Socket多线程网络应用中处理异常并避免资源泄漏,可以通过以下方式实现:
- 使用try - catch - finally块:在使用
Socket
、ServerSocket
以及相关的InputStream
、OutputStream
时,将操作放在try
块中,在catch
块处理异常,在finally
块关闭资源。
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
public class SocketServer {
private static final int PORT = 12345;
public static void main(String[] args) {
ServerSocket serverSocket = null;
Socket clientSocket = null;
BufferedReader in = null;
PrintWriter out = null;
try {
serverSocket = new ServerSocket(PORT);
System.out.println("Server started on port " + PORT);
clientSocket = serverSocket.accept();
System.out.println("Client connected: " + clientSocket);
in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
out = new PrintWriter(clientSocket.getOutputStream(), true);
String inputLine;
while ((inputLine = in.readLine()) != null) {
System.out.println("Received from client: " + inputLine);
out.println("Echo: " + inputLine);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (in != null) in.close();
if (out != null) out.close();
if (clientSocket != null) clientSocket.close();
if (serverSocket != null) serverSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
- 使用try - with - resources(Java 7及以上):这是Java 7引入的更简洁的资源管理方式,会自动关闭实现了
AutoCloseable
接口的资源。
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
public class SocketServerTryWithResources {
private static final int PORT = 12345;
public static void main(String[] args) {
try (ServerSocket serverSocket = new ServerSocket(PORT);
Socket clientSocket = serverSocket.accept();
BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true)) {
System.out.println("Server started on port " + PORT);
System.out.println("Client connected: " + clientSocket);
String inputLine;
while ((inputLine = in.readLine()) != null) {
System.out.println("Received from client: " + inputLine);
out.println("Echo: " + inputLine);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
无论是使用传统的try - catch - finally
还是try - with - resources
,关键在于确保在异常发生时,所有打开的网络连接(Socket
、ServerSocket
)以及相关的输入输出流(InputStream
、OutputStream
及其包装类)都能被正确关闭,从而避免资源泄漏。