Сервер Java NIO в режиме блокировки не работает

Я пытаюсь реализовать простой сервер NIO, который принимает соединение на 8070 и создает новый поток для каждого из клиентов. Он в основном возвращает обратно введенный текст, прочитанный клиенту, изменяя его регистр. Я могу подключиться к серверу, но ожидаемая функциональность сервера, возвращающая ответ, не работает. Ниже приведен исходный код. Так может кто-нибудь помочь мне решить проблемы с ним?

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: я попытался реализовать ту же функциональность с блокировкой ввода-вывода, используя serversocket и сокет, который работает нормально.

2 ответа

Решение

Я предлагаю вам пройтись по коду в вашем отладчике. while петли выглядят совершенно неправильно. Я думаю, что вы должны писать в цикле, и вы хотите очистить после записи. Попробуйте переместить две строки после цикла внутрь цикла.

Вы должны сжать () или очистить () буфер, который был перевернут, прежде чем вы сможете снова прочитать его.

Другие вопросы по тегам