Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Работа с сетью > java.nio.channels


Автор: Zandr_Guest 1.10.2005, 15:30
Есть сервер, который слушает на 8080 порту, на локальной машине, да даже фиг с ним, с сервером пока. Не могу понять, почему блокируюсь на select():
Код

        System.out.println("Делаем клиента.");
        Selector selector = Selector.open();
        SocketChannel channel = SocketChannel.open();
        channel.configureBlocking(false);
        //channel.socket().bind(new InetSocketAddress(8888)); // Никак не влияет на результат
        channel.register(selector, SelectionKey.OP_CONNECT);
        System.out.println("Строка печатается.");
        selector.select();
        System.out.println("Строка не печатается.");

Кто знает - в чем проблема или чего не хватает - подскажите плз...

Автор: LSD 1.10.2005, 15:45
Не вижу проблемы
Цитата(java)
This method performs a blocking selection operation. It returns only after at least one channel is selected, this selector's wakeup method is invoked, or the current thread is interrupted, whichever comes first.

там есть второй метод с таймаутом.

Или ты имеешь в виду, что доступные каналы есть а он все равно блокируется?

Автор: Guest 1.10.2005, 15:57
В то-то и дело. У Брюса Эккеля в TIEE есть такой код (там не закомментирован бинд клиентского сокета и регистрация опреаций чтения и записи вдобавок к коннекту). Так и тот код тоже блокируется в select()'е. Однозначно - такого быть не должно. Пробовал на 1.4 и 1.5.

Автор: Guest 1.10.2005, 15:58
Блин в Thinking in Enterprise Java smile

Автор: Zandr 3.10.2005, 05:57
Код

        Selector selector = Selector.open();
        SocketChannel channel = SocketChannel.open();
        channel.configureBlocking(false);
        channel.register(selector, SelectionKey.OP_CONNECT | SelectionKey.OP_WRITE | SelectionKey.OP_READ);
        channel.connect(new InetSocketAddress("target.host.ru", 80));

        boolean running = true;

        while (running) {
            selector.select();
            Iterator<SelectionKey> keysIterator = selector.selectedKeys().iterator();

            while (keysIterator.hasNext()) {
                SelectionKey key = keysIterator.next();
                keysIterator.remove();
                
                if (key.isConnectable()) {
                    channel.finishConnect();
                }
                
                //if (key.isWritable()) {
                    // ...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)