Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Помогите разобраться с селекторами в nio. / 25 сообщений из 36, страница 1 из 2
29.07.2014, 23:39
    #38708610
redwhite90
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите разобраться с селекторами в nio.
Решил прочитать про nio. Нарыл такой вот примерчик.

http://www.java2s.com/Tutorial/Java/0320__Network/Channelselector.htm

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
private static byte[] data = new byte[255];

  public static void main(String[] args) throws IOException {
    for (int i = 0; i < data.length; i++)
      data[i] = (byte) i;

    ServerSocketChannel server = ServerSocketChannel.open();
    server.configureBlocking(false);

    server.socket().bind(new InetSocketAddress(9000));
    Selector selector = Selector.open();
    server.register(selector, SelectionKey.OP_ACCEPT);

    while (true) {
      selector.select();
      Set readyKeys = selector.selectedKeys();
      Iterator iterator = readyKeys.iterator();
      while (iterator.hasNext()) {
        SelectionKey key = (SelectionKey) iterator.next();
        iterator.remove();
        if (key.isAcceptable()) {
          SocketChannel client = server.accept();
          System.out.println("Accepted connection from " + client);
          client.configureBlocking(false);
          ByteBuffer source = ByteBuffer.wrap(data);
          SelectionKey key2 = client.register(selector, SelectionKey.OP_WRITE);
          key2.attach(source);
        } else if (key.isWritable()) {
          SocketChannel client = (SocketChannel) key.channel();
          ByteBuffer output = (ByteBuffer) key.attachment();
          if (!output.hasRemaining()) {
            output.rewind();
          }
          client.write(output);
        }
        key.channel().close();
      }
    }
  }




Когда я его запускаю у меня тупо всё зависает.

Я так понимаю надо ещё клиента который будет отсылать запросы. Подскажите где взять код клиента)

Ещё очень прошу покомментирвать код, который я привёл - нефига не понимаю что происходит.
...
Рейтинг: 0 / 0
29.07.2014, 23:44
    #38708611
redwhite90
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите разобраться с селекторами в nio.
наверное ещё стоит сказать, что такого клиента я пробовал запускать:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
public static void main(String[] argv) throws Exception {
        SocketChannel sChannel = SocketChannel.open();
        sChannel.configureBlocking(false);
        sChannel.connect(new InetSocketAddress("hostName", 9000));

        ByteBuffer buf = ByteBuffer.allocateDirect(1024);
        buf.put((byte) 0xFF);

        buf.flip();

        int numBytesWritten = sChannel.write(buf);
    }



Но у меня такой вот трейс при запуске:

авторException in thread "main" java.nio.channels.UnresolvedAddressException
at sun.nio.ch.Net.checkAddress(Net.java:127)
at sun.nio.ch.SocketChannelImpl.connect(SocketChannelImpl.java:640)
at io.nio.SocketSender.main(SocketSender.java:18)
...
Рейтинг: 0 / 0
29.07.2014, 23:46
    #38708613
redwhite90
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите разобраться с селекторами в nio.
а если пишу sChannel.connect(new InetSocketAddress("localhost", 9000)); то java.nio.channels.NotYetConnectedException
...
Рейтинг: 0 / 0
30.07.2014, 01:12
    #38708631
Basil A. Sidorov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите разобраться с селекторами в nio.
Для начала попробуйте явные IPv4 адреса:
Код: sql
1.
new InetSocketAddress("127.0.0.1", port)


P.S. "Клиент" - там же
...
Рейтинг: 0 / 0
30.07.2014, 12:42
    #38708997
redwhite90
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите разобраться с селекторами в nio.
Basil A. Sidorov,

с портом судя по всему всёё нормально.

Вот мой код целиком:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
public class NioSelectorTest {
	public static void main(String[] args) {
		new Thread(new Receiver()).start();
		new Thread(new Sender()).start();
	}

}

class Receiver implements Runnable {
	private static byte[] data = new byte[255];

	public void run() {
		try {
			for (int i = 0; i < data.length; i++)
				data[i] = (byte) i;

			ServerSocketChannel server = ServerSocketChannel.open();
			server.configureBlocking(false);

			server.socket().bind(new InetSocketAddress(9000));
			Selector selector = Selector.open();
			server.register(selector, SelectionKey.OP_ACCEPT);

			while (true) {
				selector.select();
				Set readyKeys = selector.selectedKeys();
				Iterator iterator = readyKeys.iterator();
				while (iterator.hasNext()) {
					SelectionKey key = (SelectionKey) iterator.next();
					iterator.remove();
					if (key.isAcceptable()) {
						SocketChannel client = server.accept();
						System.out.println("Accepted connection from " + client);
						client.configureBlocking(false);
						ByteBuffer source = ByteBuffer.wrap(data);
						SelectionKey key2 = client.register(selector, SelectionKey.OP_WRITE);
						key2.attach(source);
					} else if (key.isWritable()) {
						SocketChannel client = (SocketChannel) key.channel();
						ByteBuffer output = (ByteBuffer) key.attachment();
						if (!output.hasRemaining()) {
							output.rewind();
						}
						client.write(output);
					}

					key.channel().close();

				}
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

class Sender implements Runnable {

	public void run() {
		try {
			SocketChannel sChannel = SocketChannel.open();
			sChannel.configureBlocking(false);
			sChannel.connect(new InetSocketAddress("localhost", 9000));
			while (!sChannel.finishConnect()) {
				ByteBuffer buf = ByteBuffer.allocateDirect(1024);
				buf.put((byte) 0xFF);

				buf.flip();
				int numBytesWritten = sChannel.write(buf);
				System.out.println("sent " + numBytesWritten + " bytes");
			}
		} catch (IOException exception) {
			exception.printStackTrace();
		}
	}
}




сервер в консоль пишет такое сообщение:
авторAccepted connection from java.nio.channels.SocketChannel[connected local=/127.0.0.1:9000 remote=/127.0.0.1:50940]


на клиенте внутрь этого while я так ит не вхожу

Код: java
1.
while (!sChannel.finishConnect()) {



Чего-то я не понимаю, что делать.
...
Рейтинг: 0 / 0
30.07.2014, 13:14
    #38709039
no56892
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите разобраться с селекторами в nio.
redwhite90,
А если НЕ убрать?
...
Рейтинг: 0 / 0
30.07.2014, 13:18
    #38709040
redwhite90
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите разобраться с селекторами в nio.
no56892,

к моему удивлению....

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
sent 1 bytes
sent 1 bytes
sent 1 bytes
sent 1 bytes
sent 1 bytes
sent 1 bytes
sent 1 bytes
sent 1 bytes
sent 1 bytes
sent 1 bytes
sent 1 bytes
sent 1 bytes
sent 1 bytes
sent 1 bytes
sent 1 bytes
sent 1 bytes
sent 1 bytes
sent 1 bytes
sent 1 bytes
sent 1 bytes
sent 1 bytes
sent 1 bytes
sent 1 bytes
sent 1 bytes
sent 1 bytes
sent 1 bytes
sent 1 bytes
sent 1 bytes
sent 1 bytes
sent 1 bytes
sent 1 bytes
sent 1 bytes
sent 1 bytes
sent 1 bytes
sent 1 bytes
sent 1 bytes
sent 1 bytes
sent 1 bytes
sent 1 bytes
sent 1 bytes
sent 1 bytes
Accepted connection from java.nio.channels.SocketChannel[connected local=/127.0.0.1:9000 remote=/127.0.0.1:53268]
sent 1 bytes
sent 1 bytes
sent 1 bytes
sent 1 bytes
sent 1 bytes
java.io.IOException: An established connection was aborted by the software in your host machine



но наверное это всё таки как-то нетак должно работать)
...
Рейтинг: 0 / 0
30.07.2014, 13:33
    #38709053
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите разобраться с селекторами в nio.
redwhite90 , работа с селекторами, nio требует глубокого понимания
самой проблематики сокет серверов. Если ты раньше мало работал
с обычными сокетами то работа с селекторами для тебя будет
просто "усложнением" или пустым звуком и ты не будешь
понимать для чего они созданы или какую задачу решают.
...
Рейтинг: 0 / 0
30.07.2014, 14:18
    #38709103
Basil A. Sidorov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите разобраться с селекторами в nio.
redwhite90Чего-то я не понимаю, что делать.Насколько я понимаю, соединение акцептовано, но не переведено в режим чтения.

P.S. Присоединяюсь к mayton - какая реальная задача потребовала работы с NIO?
...
Рейтинг: 0 / 0
30.07.2014, 14:57
    #38709141
redwhite90
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите разобраться с селекторами в nio.
mayton redwhite90 , работа с селекторами, nio требует глубокого понимания
самой проблематики сокет серверов. Если ты раньше мало работал
с обычными сокетами то работа с селекторами для тебя будет
просто "усложнением" или пустым звуком и ты не будешь
понимать для чего они созданы или какую задачу решают.

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

Я действительно до этого мало работал с сокетами(если не сказать, что вообще не работал). Я просто не так давно понял, что не понимаю на 100 %, что такое асинхроника, неблокируемость и решил на примере nio потрогать это. А неблокируемость только для сокетов может работать ? может ещё есть какие-то варианты?

С чего посоветуете начать?

Basil A. Sidorov Насколько я понимаю, соединение акцептовано, но не переведено в режим чтения.

P.S. Присоединяюсь к mayton - какая реальная задача потребовала работы с NIO?

Поможете поправить код?

Реальная задача - расширение знаний, кругозора.
...
Рейтинг: 0 / 0
30.07.2014, 15:14
    #38709160
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите разобраться с селекторами в nio.
redwhite90Я задался целью изучить nio.
Забей. Я этой целью задался уже несколько лет назад как. И до сих пор плаваю в теме.

redwhite90Насколько я слышал эта уонцепция используется во многиз популярных фреймворках.
Нет не используется.

redwhite90Я действительно до этого мало работал с сокетами(если не сказать, что вообще не работал).
Так может стоит начать с написания примитивного многопоточного сервера на блокирующем IO и тестового клиента? А оттуда уже переходить к nio?

redwhite90Я просто не так давно понял, что не понимаю на 100 %, что такое асинхроника, неблокируемость и решил на примере nio потрогать это. А неблокируемость только для сокетов может работать ? может ещё есть какие-то варианты?

Асинхронность рекомендую изучать на примере Thread, ExecutionService и FutureTask.

redwhite90Реальная задача - расширение знаний, кругозора.
Это ты ещё до буферов не дошел, похоже. :) Они в жизни намного полезнее чем сокеты.
...
Рейтинг: 0 / 0
30.07.2014, 15:53
    #38709214
redwhite90
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите разобраться с селекторами в nio.
Blazkowicz,



Blazkowiczredwhite90Насколько я слышал эта уонцепция используется во многиз популярных фреймворках.

Нет не используется.

apache camel
spring reactor

там что-то принципиально другое используется?

BlazkowiczТак может стоит начать с написания примитивного многопоточного сервера на блокирующем IO и тестового клиента? А оттуда уже переходить к nio?

Да хотел потрогать именно неблокируемость.

Как я понял асинхронность это nio2 а неблокируемость это nio. Хотел просто hello world запустить чтобы понять, что понимается под неблокируемостью.

BlazkowiczЭто ты ещё до буферов не дошел, похоже. :) Они в жизни намного полезнее чем сокеты.
Такие буферы?
http://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=1108005&msg=16374133
...
Рейтинг: 0 / 0
30.07.2014, 16:02
    #38709222
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите разобраться с селекторами в nio.
redwhite90apache camel
spring reactor
там что-то принципиально другое используется?


apache camel - интеграционный фреймверк, который включает в себя возможность messaging-а через MINA, которая в свою очередь является TCP сервером на NIO.
Сам фреймверк к NIO отношения не имеет.

spring reactor - аналогично. Асинхронный фреймверк. Может использовать коннекторы, которые реализованы через NIO.

Если причислять подобным образом, тогда уже можно все JEE контейнеры добавить. Ведь они тоже используют NIO для рализации HTTP over TCP транспорта. Правда к JEE это ровного никакого отношения не имеет.
...
Рейтинг: 0 / 0
30.07.2014, 16:34
    #38709249
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите разобраться с селекторами в nio.
redwhite90Я задался целью изучить nio. Я слышал, что использование селекторов это целая концепция и хотел бы ее понять. Насколько я слышал эта уонцепция используется во многиз популярных фреймворках.

Я действительно до этого мало работал с сокетами(если не сказать, что вообще не работал). Я просто не так давно понял, что не понимаю на 100 %, что такое асинхроника, неблокируемость и решил на примере nio потрогать это. А неблокируемость только для сокетов может работать ? может ещё есть какие-то варианты?

С чего посоветуете начать?

1) Ты можешь прожить длинную и счастливую жизнь но так и не столкнуться с необходимостью явного использования каналов,
селекторов, и прочего. Это абстракции очень даже low-level и их используют для серверов с нагрузкой где много потоков
ждут сетевых событий сокета. Если у тебя такой нагрузки нет то и не нужны тебе эти технологии. Они сложнее в отладке
и поиске ошибок чем обычные выделенные сокеты.

Тоесть nio для обычного казуального разработчика это как "армия которая никакого вреда кроме пользы не приносит"

2) Неявно ты их уже используешь т.к. в JDK при включении поддержки nio были уже переписаны большинство io пакетов.
Посмотри исходники FileOutputStream, RandomAccessFile, Socket они все включают в себя функции java.nio.*.
...
Рейтинг: 0 / 0
30.07.2014, 22:52
    #38709557
maxkar
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите разобраться с селекторами в nio.
redwhite90,

авторЕщё очень прошу покомментирвать код, который я привёл - нефига не понимаю что происходит.
Ну... Он ждет соединения, принимает и подписывает новый канал на запись. При этом закрывает серверный сокет. Затем дожидается момента, когда можно записать в сокет, записывает в него и закрывает еще и тот сокет.

У вас там дальше исключение на клиенте происходит? Тоже вполне ожидаемо. Клиент ведь читать не пытается, он пытается писать. А его игнорируют. И сокет ему закрывают. От такой несправедливости клиент заканчивает свою жизнь IOException'ом.

Советую поробовать объяснить, что просиходит, самому. Иначе придется рассказывать про весь NIO (selectors) с самого начала. Если нет аллергии на scala, можно взять работающий пример и попробовать его поменять. Я тоже недавно начал экспериментировать. https://github.com/maxkar/nio-mts - репо. Собирать sbt assemblyPrepare. Запускать java -jar .target/apps/demo-echo/assembly/demo-echo.jar для сервера и то же с любым аргументом для клиента. Можно туда отладки понапихать и всего, что угодно. В отличие от учебных примеров, этот более устойчив к IOException (весь сервер не умирает). Плюс умеет убивать слоупоков и просто зазевавшихся. Там пока только echo, планируются рефакторинги и что-то вроде простого чата. Но оно уже не чисто тесты NIO, оно движется в направлении простенькой библиотечки. Можно лишние транспорты для начала попробовать открутить. Заодно разберетесь, что происходит.
...
Рейтинг: 0 / 0
31.07.2014, 15:04
    #38710112
rfq
rfq
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите разобраться с селекторами в nio.
redwhite90,

начните с nio2. Интереснее и концептуальнее, хотя тоже не идеал. Потом селекторы легче пойдут.
...
Рейтинг: 0 / 0
04.08.2014, 12:18
    #38711993
redwhite90
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите разобраться с селекторами в nio.
rfq,

ок, начну пока с nio2. Но кто-нибудь на пальцах может объяснить что такое неблокирующий мод в nio?

Просто как концепция.
...
Рейтинг: 0 / 0
04.08.2014, 12:24
    #38711999
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите разобраться с селекторами в nio.
redwhite90Но кто-нибудь на пальцах может объяснить что такое неблокирующий мод в nio?
Просто как концепция.
Когда читаешь данные, то в блокирующем IO, если данные ещё недоступны, то поток блокируется. Например, если HDD их ещё недочитал. Или сетевой интерфейс их ещё не прислал. Заблокированый поток останавливает свою работу, поэтому разработчику нужно больше потоков, чтобы компенсировать простои CPU во время IO блокировок.

В неблокирующем IO, при чтении, просто возращается ноль новых данных, сообщая разработчику, что их нет. Поток не блокируется и его можно занять чем-то полезным, пока не появятся данные. Неблокирующее IO позволяет использовать меньше потоков, чтобы более эффективно использовать CPU и сэкономить на переключении конктекста. Это особенно критично для большого серверов с большим количеством клиентов.
...
Рейтинг: 0 / 0
04.08.2014, 13:38
    #38712098
redwhite90
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите разобраться с селекторами в nio.
Blazkowicz,

спасибо. Но ведь в классическом блокирующем io мы можем просто перед каждым чтением проверять сколько данных доступно для чтения?
...
Рейтинг: 0 / 0
04.08.2014, 13:41
    #38712100
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите разобраться с селекторами в nio.
redwhite90спасибо. Но ведь в классическом блокирующем io мы можем просто перед каждым чтением проверять сколько данных доступно для чтения?
Можем. Ты спросил что такое "неблокирующий мод".
...
Рейтинг: 0 / 0
04.08.2014, 13:53
    #38712116
redwhite90
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите разобраться с селекторами в nio.
Blazkowicz,

я тогда просто не понимаю профита от неблокирующего режима.
...
Рейтинг: 0 / 0
04.08.2014, 14:11
    #38712142
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите разобраться с селекторами в nio.
redwhite90я тогда просто не понимаю профита от неблокирующего режима.
Ну, если так влоб сравнивать только чтение с использованием available(), то разницы действительно не много. Но суть ведь не в этом. NIO, ведь, совершенно отдельный API, на котором можно много чего такого, что через IO не реализовать в принципе.
...
Рейтинг: 0 / 0
04.08.2014, 16:45
    #38712362
redwhite90
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите разобраться с селекторами в nio.
Blazkowicz,

аааа во оно как. Я думал, что эти фичи как раз неблокирумый режим позволяет сделать(то есть он стал предпосылкой к созданию), а получается, что это не особо то и связано.
...
Рейтинг: 0 / 0
04.08.2014, 16:55
    #38712376
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите разобраться с селекторами в nio.
redwhite90Blazkowicz,
аааа во оно как. Я думал, что эти фичи как раз неблокирумый режим позволяет сделать(то есть он стал предпосылкой к созданию), а получается, что это не особо то и связано.
Можно ещё вспомнить о том что запись тоже бывает блокирующей. В OutputStream нет аналога available()
...
Рейтинг: 0 / 0
04.08.2014, 17:15
    #38712403
redwhite90
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите разобраться с селекторами в nio.
Blazkowicz,

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

а у Вас есть понимание того как они этого добились не использую трэды внутри?
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Помогите разобраться с селекторами в nio. / 25 сообщений из 36, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]