Java:Socket关闭连接和ObjectInputStream

时间:2009-10-12 18:38:41

标签: java sockets connection objectinputstream

我的代码如下所示,这是服务器代码(Runnable

public void run() {
    while (true) {
        try {
            System.out.println("Waiting for client...");
            this.socket = serverSocket.accept();
            System.out.println("Client accepted");
            while (true) {
                readCommand();
                try {
                    Thread.sleep(2);
                } catch (Exception e) {
                }
            }
        } catch (Exception ex) {
            Main.error("Server stopped for current host", ex);
        }
    }
}

我的问题是:当客户端关闭连接时,他仍然等待readCommand();中的命令读取,直到命令被发送并且将抛出EOFException。这是我的readCommand方法:

private void readCommand() throws Exception {
    Object o = new ObjectInputStream(socket.getInputStream()).readObject();
    if (o instanceof Command) {
        ((Command) o).execute();
        return;
    }
    if (o instanceof Recorder) {
        System.out.println("Recording received");
        ((Recorder) o).executeRecord();
        return;
    }
    if (o instanceof MyKeyEvent) {
        ((MyKeyEvent) o).execute();
        return;
    }
}

所以我认为在阅读之前必须检查连接是否已打开。

修改:如果我评估run - 方法代码,EOFException会抛出try-catch-body。但他不再接受客户了。

2 个答案:

答案 0 :(得分:3)

如果客户端关闭连接,EOFException正是我所期望的。所以我不太确定你的问题。也许您需要区分预期的客户端断开连接和意外的客户端断开连接。在这种情况下,您应该发送某种End-of-message对象来标记传输结束?

如果要检查信息是否可用,则流上有available()方法。我认为您不需要Thread.sleep(2),顺便说一句,因为我希望在没有数据的情况下,有效输入流上的读取会挂起。

答案 1 :(得分:0)

你也可以“只”添加另一个try-catch来捕获EOFException

public void run() {
    while (true) {
        try {
            System.out.println("Waiting for client...");
            this.socket = serverSocket.accept();
            System.out.println("Client accepted");
            try {
                while (true) {
                    readCommand();
                    try {
                        Thread.sleep(2);
                    } catch (Exception e) {
                    }
                }
            } catch (EOFException ex) {
                System.out.println("client closed");
            }
        } catch (Exception ex) {
            Main.error("Server stopped for current host", ex);
        }
    }
}
确定,命令结束更聪明/更优雅......
[]]