为什么我的Java服务器关闭套接字?

我有服务器和客户端。 我的服务器接受所有连接并返回客户端字符串。 但是当我试图发送更多的线时,它会崩溃

java.net.SocketException: Socket is closed at java.net.Socket.getOutputStream(Unknown Source) at server.ServerCore.hiMsg(ServerCore.java:67) at server.ServerCore.run(ServerCore.java:49)

这是我的服务器代码:

 package server; import java.io.File; import java.io.IOException; import java.io.ObjectOutputStream; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.net.*; import java.util.Vector; import java.util.logging.Level; import java.util.logging.Logger; /** * * @author pisio */ public class ServerCore extends Thread { private LoadSettings loadSettings = LoadSettings.Init(); private int port = loadSettings.getConfigInt("port"); private int max_connections = loadSettings.getConfigInt("max_connections"); private String ipServer = loadSettings.getConfig("ipServer"); private ServerSocket socket; private Socket connection; private boolean serverRuning = false; private int connectedUsers = 0; private Vector connVector = new Vector(); @Override public void run() { try { socket = new ServerSocket(port, max_connections); System.out.println("+++\t Server was started at address:" + socket.getLocalSocketAddress() + " with posible max users " + max_connections); serverRuning = true; while (serverRuning) { if (connectedUsers <= max_connections) { connection = socket.accept(); connection.setKeepAlive(serverRuning); connVector.add(connection); connectedUsers = connVector.size(); hiMsg(); hiMsg(); hiMsg(); } System.out.println("+++\t Last User:" + connVector.get(connVector.size() - 1).toString()); } } catch (IOException ex) { // Logger.getLogger(ServerCore.class.getName()).log(Level.SEVERE, null, ex); } } public void hiMsg() { try { Socket c = (Socket) connVector.get(connVector.size() - 1); PrintWriter out = new PrintWriter(new OutputStreamWriter(c.getOutputStream())); out.write("Hi user ! Im server ! Your master ! Blow me down\nping: ? PONG ?"); out.close(); } catch (IOException ex) { Logger.getLogger(ServerCore.class.getName()).log(Level.SEVERE, null, ex); } } public void stopServer() { statusServer(); serverRuning = false; try { socket.close(); } catch (IOException ex) { //Logger.getLogger(ServerCore.class.getName()).log(Level.SEVERE, null, ex); } System.out.println("+++++\t SERVER WAS STOPED !"); // System.exit(port); } public void statusServer() { if (serverRuning) { System.out.println("Server running at port:" + port + " with connected users :" + connectedUsers + "/" + max_connections); } else { System.out.println("Server IS NOT RUNNING!"); } } } 

这是我的客户端代码:

 package meetingsclient; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.lang.String; import java.net.Socket; import java.util.logging.Level; import java.util.logging.Logger; public class ServerConnect { private static ServerConnect sc = null; private Socket socket = null; private ServerConnect() { try { socket = new Socket("localhost", 8080); sendHiMsg(); } catch (Exception ex) { Logger.getLogger(ServerConnect.class.getName()).log(Level.SEVERE, null, ex); } } private void sendHiMsg() throws IOException { BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream())); System.out.println("Input:" + in.readLine()); } public static ServerConnect Init() { if (sc == null) { sc = new ServerConnect(); } return ServerConnect.sc; } } 

我引用了这个主题: 套接字例外:套接字已关闭,但这个dotn帮助了我。 //很抱歉这些链接,但我不明白如何正确格式化我的代码。

SocketgetOutputStream()的javadoc :

关闭返回的OutputStream将关闭关联的套接字。

此外,关闭PrintWriter (以及所有其他打印机/写入程序)也会关闭其基础流。 因此,您通过关闭PrintWriter (在hiMsg() )然后尝试写入已关闭的套接字来关闭OutputStream

要解决此问题,请不要关闭PrintWriter 。 垃圾收集将为您照顾它! 但是当你完成它时,请关闭套接字。