0

私はサーバークライアントプログラムを持っていますが、クライアントがサーバーからデータを要求して送り返すことができるようにしたいと考えています。コメント付きのコードでは、それを有効にすると、Sender.send は 1 回だけ送信し、その後は何も起こりません。しかし、無効にすると、すべて正常に動作します。コメントされたコードで何が間違っているのかわかりません。

private class Client extends Thread {

    private Socket socket;
    private boolean running;

    public Client(Socket socket) {
        this.socket = socket;
        this.running = true;
        if (!(clients.contains(socket))) {
            clients.add(socket.getInetAddress().toString());
        }
    }

    private void delete() {
        running = false;
        try {
            log("Client disconnected: (" + socket.getInetAddress().toString().replace("/", "") + ":" + socket.getPort() + ")");
            clients.remove(socket.getInetAddress().toString());
            socket.close();
            } catch (IOException e) {
        }
        try {
            interrupt();
            join();
            } catch (Exception e) { 
        }
    }

    public void run() {
        log("Client connected: (" + socket.getInetAddress().toString().replace("/", "") + ":" + socket.getPort() + ")");
        try {   
            ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
            ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());
            while (running) {   
                if (!Sender.send(oos)) {
                    delete();
                    return;
                }   

                try {   
                    Object object = ois.readObject();

                    if (object instanceof String[] && ((String[]) object)[0].equals("COMMAND_REQUEST")) {
                        String command = ((String[]) object)[1].trim();
                        log("Executed command request: " + command);
                        Sender.log("Executed command request: " + command);
                        Bukkit.getServer().dispatchCommand(getServer().getConsoleSender(), command);
                    }

                    } catch (Exception e) {
                }   

                Thread.sleep(300);
            }
        } catch (Exception e) {
            delete();
        } finally {
            try {
                socket.close();
                } catch (Exception e) {
            }
        }
    } 

}

送信方法:

protected static boolean send(ObjectOutputStream oos) {
    try {
        update();
        oos.writeObject(data);
        oos.flush();
        return true;
    } catch (Exception e) {
        return false;
    }
}
4

1 に答える 1

1

それはすべて正常に動作します

いいえ、そうではありません。投稿されたこのコードは、ソケットとバッファの両方がいっぱいになると、最終的にデッドロックします。

コメントアウトされたコードは、すべてのコードを変更して、ソケットの有効期間中、単一の ObjectInputStream と ObjectOutputStream を使用しない限り、機能しない可能性があります。

ここで間違った問題について質問したことを付け加えておきます。問題は、コメントアウトされたコードが機能しなかった理由であり、提供できなかった情報がスローされた例外でした。

于 2013-05-09T05:51:16.343 に答える