Java 套接字异常:套接字已关闭

Java 套接字异常:套接字已关闭,java,sockets,serversocket,Java,Sockets,Serversocket,我想创建一个能够连接多个客户端的服务器。 我的主要职能是: ServerSocket serverSocket = null; try { serverSocket = new ServerSocket(5556); } catch (IOException ex) { Logger.getLogger(MakaoServer.class.getName()).log(Level.SEVERE, null, ex); } while

我想创建一个能够连接多个客户端的服务器。 我的主要职能是:

ServerSocket serverSocket = null;
    try {
        serverSocket = new ServerSocket(5556);
    } catch (IOException ex) {
        Logger.getLogger(MakaoServer.class.getName()).log(Level.SEVERE, null, ex);
    }
    while (true) {
        try {
            Socket connection = serverSocket.accept();
            PlayerConnection playerConn = new PlayerConnection(connection);
            playerConn.start();
        } catch (IOException ex) {
            System.out.println("Nie można było utworzyć gniazda.");
        }
    }
PlayerConnection是一个线程类。运行方法:

public void run() {
    InputStream input = null;
    while (true) {
        try {
            input = connection.getInputStream();
            BufferedReader reader = new BufferedReader(new InputStreamReader(input));
            String msg = reader.readLine();
            System.out.println(msg);

        } catch (IOException ex) {
            Logger.getLogger(PlayerConnection.class.getName()).log(Level.SEVERE, null, ex);
        } finally {

        }
    }
}
当我运行客户机并将消息发送到服务器时,它会被接收,但在下一个while循环迭代连接上;在套接字关闭时引发套接字异常。为什么?

java.net.SocketException: socket closed
at java.net.SocketInputStream.socketRead0(Native Method)
at java.net.SocketInputStream.read(SocketInputStream.java:150)
at java.net.SocketInputStream.read(SocketInputStream.java:121)
at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:283)
at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:325)
at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:177)
at java.io.InputStreamReader.read(InputStreamReader.java:184)
at java.io.BufferedReader.fill(BufferedReader.java:154)
at java.io.BufferedReader.readLine(BufferedReader.java:317)
at java.io.BufferedReader.readLine(BufferedReader.java:382)
at makaoserver.PlayerConnection.run(PlayerConnection.java:38)

将输入流和缓冲读取器置于循环之外

可能是创建多个连接到同一输入流的流导致了这种情况。

试试看

public void run() {
    InputStream input = null;
    input = connection.getInputStream();
    BufferedReader reader = new BufferedReader(new InputStreamReader(input));

    while (true) {
        try {
            String msg = reader.readLine();
            System.out.println(msg);
        } catch (IOException ex) {
            Logger.getLogger(PlayerConnection.class.getName()).log(Level.SEVERE, null, ex);
        } finally {

        }
    }
}
另外,当您完成插座操作时,不要忘记关闭插座

try {
  // Create objects
  // do stuff
} finally {
  if (obj != null) obj.close();
}

但我想从客户那里得到不止一条信息。如果你把输入流和缓冲读取器放在循环之外,我只会收到一条消息。不,一旦你有了输入流的句柄,你就不需要一直初始化它。您的readline仍将处于收集消息的循环中。您是否可以删除记录器并在此处放置e.printStackTrace并打印跟踪?我认为您的客户端正在关闭连接。服务器代码似乎没有问题。您还可以粘贴您的客户端代码吗?您仍然需要将输入流缓冲读取器initial移出循环创建多个流不会导致此问题。关闭它们确实如此。我已经完成了,但仍然得到相同的异常。您说过,连接关闭异常是在循环的第二次传递中对connection.getInputStream()引发的。这一行不再在循环中,现在抛出的异常在哪里?另外,您是否可以显示PlayerConnection中的一些代码,因为您可能正在关闭服务器端的连接。我解决了此问题。:)我还打开了一个OutputStream,它导致了异常。@拉塔塔,为什么打开一个
OutputStream
会导致套接字关闭?这个代码将在流的末尾永远旋转。它需要对
readLine()
的结果进行空检查。当
readLine()
返回
null
时,您的读取循环应该终止。目前,当对等方关闭连接时,您将收到源源不断的
null
消息。