0

私はJavaネットワーキングを理解し、サーバーがクライアントと通信できるようにしようとしています。ソケットをノンブロッキングにしようとしてエラーが発生しました。誰かが私のコードを見て、バグを見つけようとすることはできますか?

public static void main(String[] args) throws IOException {

    ServerSocket serverSocket = null;
    boolean listening = true;   

    try {
        serverSocket = new ServerSocket(4444);
        serverSocket.configureBlocking(false);
        System.out.println("Server started");
    } catch (IOException e) {
        System.out.println("Could not listen on port: 4444.");
        System.exit(-1);
    }

    while (listening){

        Socket s = serverSocket.accept();

        long id = clients_id++;
        ServerThread st = new ServerThread(s, id);
        addClient(id, st);
        st.start();
    }

    serverSocket.close();
}
4

3 に答える 3

3

Java IO の 2 つの (ややややこしい) 概念を混同しています。

  • (旧) Stream-IO: どのオプションを設定しても、ストリームは常にブロックされます。
  • (新規) NIO : これは正しく使用すればノンブロッキングになりますが、より複雑になります。ただし、accept を自分で呼び出すのではなく、セレクターを使用する必要があります。

ノンブロッキング IO の使用を計画している場合は、必ず最初にドキュメントを読み、その概念を正しく理解するために少し実験する必要があります。しかし、一度理解すれば、非常に高速な IO コードを書くことができます。

于 2013-10-05T20:04:47.597 に答える
2

これは「バグ」ではなく、単なるコンパイル エラーです。存在しないメソッドを発明したため、コンパイラはそれを呼び出させません。java.nio.channels.ServerSocketChannel を参照してください。SocketChannel と同様に configureBlocking() メソッドがあります。

ただし、作成したコードを考えると、ノンブロッキング モードを設定する理由はまったくありません。あなたが書いたのは、ブロッキング モードの TCP サーバーの典型的なフレームワークです。

また、例外が発生したときに、自分で考案したメッセージを出力しないでください。例外に付属するものを印刷します。

于 2013-10-05T22:56:42.357 に答える