-2

8070 で接続を受け入れ、クライアントごとに新しいスレッドをインスタンス化する単純な nio サーバーを実装しようとしています。基本的に、大文字と小文字を変更してクライアントに読み取った入力テキストをエコー バックします。以下はそのソースコードです。それで、誰かがそれに関する問題のトラブルシューティングを手伝ってくれますか?

public class NewIOServer {
    public static void main(String[] args) throws IOException {
        ServerSocketChannel ssc = ServerSocketChannel.open();
        ssc.socket().bind(new InetSocketAddress("localhost", 8070));
        ExecutorService pool = Executors.newFixedThreadPool(1000);
        while(true) {
            SocketChannel s = ssc.accept();
            pool.submit(new Util(s));
        }
    }
}

public class Util implements Runnable {

    SocketChannel sc;

    public Util(SocketChannel sc) {
        this.sc = sc;
    }

    @Override
    public void run() {
        try {
            process();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    private void process() throws IOException {
        System.out.println("Connection from:" + this.sc);            
        ByteBuffer buf = ByteBuffer.allocateDirect(1024);
        while(sc.read(buf) != -1) {
            buf.flip();
            for(int i=0; i<buf.limit(); i++) {
                buf.put(i, (byte)transmogrify((int)buf.get(i)));
            }
        }
        sc.write(buf);
        buf.clear();
    }

    public static int transmogrify(int data) {
        if(Character.isLetter(data)) {
            return data ^ ' ';
        }
        return data;
    }
}

PS: サーバーソケットとソケットを使用してブロック io で同じ機能を実装しようとしましたが、正常に動作します。

4

2 に答える 2

1

デバッガーでコードをステップ実行することをお勧めします。whileループは完全に間違っているように見えます。ループ中に書き込みを行う必要があり、書き込み後にクリアしたいと思います。ループの後の 2 行をループの内側に移動してみてください。

于 2014-08-10T07:12:13.917 に答える
0

反転されたバッファを再度読み込む前に、そのバッファを compact() または clear() する必要があります。

于 2014-08-10T09:57:11.127 に答える