
在Java中进行网络通信时使用TCP的方式进行传输TCP在传输时使用字符流进行传输所以我们在java中可以 这样写。在TCP通信过程中网络环境的不稳定、对端异常关闭连接或数据读写超时都可能触发各种异常。常见的异常包括IOException和SocketTimeoutException前者通常表示底层I/O操作失败例如连接被重置、管道破裂或流已关闭后者则是在设置了读取超时时间后指定时间内未收到数据时抛出。正确处理这些异常是保证程序健壮性的关键。对于异常处理推荐使用try-with-resources语法它可以自动关闭实现了AutoCloseable接口的资源简化代码并避免资源泄漏。下面给出一个使用try-with-resources的TCP客户端示例import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.Socket; import java.net.SocketTimeoutException; //这里完全可以使用通配符 public class TcpClient { public static void main(String[] args) { String host 127.0.0.1; int port 8080; // try-with-resources 自动关闭 Socket 及相关流 try (Socket socket new Socket(host, port); PrintWriter out new PrintWriter(socket.getOutputStream(), true); BufferedReader in new BufferedReader(new InputStreamReader(socket.getInputStream()))) { // 设置读取超时时间为 3 秒 socket.setSoTimeout(3000); out.println(Hello, Server!); String response in.readLine(); System.out.println(服务器响应: response); } catch (SocketTimeoutException e) { System.err.println(读取超时服务器未在指定时间内响应: e.getMessage()); } catch (IOException e) { System.err.println(TCP通信发生I/O异常: e.getMessage()); } } }如果项目运行在Java 7之前的版本无法使用try-with-resources则需要使用try-catch-finally手动关闭资源。示例如下import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.Socket; import java.net.SocketTimeoutException; public class TcpClientOld { public static void main(String[] args) { Socket socket null; PrintWriter out null; BufferedReader in null; try { socket new Socket(127.0.0.1, 8080); out new PrintWriter(socket.getOutputStream(), true); in new BufferedReader(new InputStreamReader(socket.getInputStream())); socket.setSoTimeout(3000); out.println(Hello, Server!); String response in.readLine(); System.out.println(服务器响应: response); } catch (SocketTimeoutException e) { System.err.println(读取超时: e.getMessage()); } catch (IOException e) { System.err.println(TCP通信发生I/O异常: e.getMessage()); } finally { // 在 finally 中逐个关闭资源避免资源泄漏 try { if (in ! null) { in.close(); } } catch (IOException e) { e.printStackTrace(); } try { if (out ! null) { out.close(); } } catch (Exception e) { e.printStackTrace(); } try { if (socket ! null) { socket.close(); } } catch (IOException e) { e.printStackTrace(); } } } }在实际开发中建议优先使用try-with-resources它更简洁且不易遗漏资源关闭同时应根据业务场景合理设置超时时间并对SocketTimeoutException和IOException分别处理以便更精准地定位问题。服务端结束了Clientimport java.io.*; import java.net.*; public class TCPclient { public static void main(String[] args) { String serveradders127.0.0.1; int port8888; try ( Socket socket new Socket(serveradders, port); BufferedReader innew BufferedReader(new InputStreamReader(socket.getInputStream())); PrintWriter outnew PrintWriter(socket.getOutputStream(),true); BufferedReader fnew BufferedReader(new InputStreamReader(System.in)); ){ System.out.println(已建立链接); String Lint; while(null!(Lintf.readLine())){ out.println(Lint); String reponein.readLine(); System.out.println(返回repone); } } } }用多线程的方式可以做到client-server-client的方式传输import java.io.*; import java.net.Socket; public class client { public static void main(String[] args) throws IOException { String serverAddress 127.0.0.1; int port 8888; try ( Socket socket new Socket(serverAddress, port); BufferedReader in new BufferedReader( new InputStreamReader(socket.getInputStream()) ); PrintWriter out new PrintWriter( socket.getOutputStream(), true ); BufferedReader f new BufferedReader( new InputStreamReader(System.in) ) ) { System.out.println(已建立连接); // 接收线程 Thread receiveThread new Thread(() - { try { String message; while ((message in.readLine()) ! null) { System.out.println(\n对方 message); System.out.print(我); } } catch (IOException e) { System.out.println(连接已断开); } }); receiveThread.start(); // 主线程负责发送 String message; while ((message f.readLine()) ! null) { if (message.equals(exit)) { break; } out.println(message); System.out.print(我); } } } }server:import java.io.*; import java.net.*; import java.util.*; public class server { static ListSocket clients new ArrayList(); public static void main(String[] args) throws IOException { ServerSocket serverSocket new ServerSocket(8888); System.out.println(服务器启动等待客户端连接...); while (true) { Socket socket serverSocket.accept(); System.out.println(客户端连接 socket.getInetAddress()); clients.add(socket); Thread thread new Thread(() - handleClient(socket)); thread.start(); } } static void handleClient(Socket socket) { try { BufferedReader in new BufferedReader( new InputStreamReader(socket.getInputStream()) ); String message; while ((message in.readLine()) ! null) { System.out.println(收到 message); // 转发给其他客户端 for (Socket client : clients) { if (client ! socket) { PrintWriter out new PrintWriter( client.getOutputStream(), true ); out.println(message); } } } } catch (IOException e) { System.out.println(客户端断开); clients.remove(socket); } } }