Домой Учебники по Java и J2EE Java NIO (неблокирующий ввод / вывод) на примере сервера с клиентом —...

Java NIO (неблокирующий ввод / вывод) на примере сервера с клиентом — java.nio.ByteBuffer и channel.Selector — Java NIO Vs. IO

1406
0

Java NIO моя любимая тема Я работаю с NIO с последних 2 лет и хотел бы поделиться простыми Server-Client code для моих читателей, которые могут свободно использовать этот код в своей производственной среде.

Начиная с JDK 1.4 , NIO был создан, чтобы позволить всем Java-программистам реализовывать очень высокоскоростной ввод / вывод без необходимости иметь дело с пользовательским собственным кодом. NIO использует java.nio.buffer Сравнение библиотеки с простым вводом / выводом, который истощает и заполняет буфер внутри любой операционной системы.

В этом уроке мы рассмотрим java.nio.channels а также java.nio.channels.Selector библиотеки.

  • channels представляют соединения с объектами, которые способны выполнять операции ввода-вывода, такие как файлы и сокеты; определяет селекторы для мультиплексированных неблокирующих операций ввода / вывода.
  • selector может быть создан путем вызова open method этого класса, который будет использовать системный поставщик по умолчанию для создания нового селектора.

Если у вас есть below questions тогда вы находитесь в правильном месте:

  • Как начать работу с Java NIO
  • Что такое учебники по Java NIO и Java NIO?
  • Асинхронный Java NIO
  • Каково точное использование пакета java nio?
  • Учебник по Java NIO
  • Как реализовать высокопроизводительный ввод-вывод с Java NIO

Давайте начнем:

Шаг 1

  • Создайте CrunchifyNIOServer.java который открывает соединение на port 1111
  • использование isAcceptable() проверить, готов ли канал принять новое сокетное соединение
    • Если да — подключи
  • использование isReadable() проверить, готов ли канал к чтению
    • если да — читать из буфера и печатать на консоли Eclipse
  • Как только вы получите фамилию компании «crunchify»
    • тесная связь

Шаг 2

  • Создайте CrunchifyNIOClient.java который пытается подключиться к серверу на port 1111
  • Создать ArrayList с 5 названиями компаний
  • Выполните итерацию по ArrayList и отправьте каждое companyName на сервер
  • Закрыть соединение после завершения задачи

Взгляните на этот код Java:

Код сервера — CrunchifyNIOServer.java

CrunchifyNIOServer.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
77
78
79
80
81
82
83
84
85
86
87
88
89
пакет crunchify. ком . учебные пособия ;
Импортировать Java. Ио. IOException ;
Импортировать Java. нетто. InetSocketAddress ;
Импортировать Java. Nio . ByteBuffer ;
Импортировать Java. Nio . каналы . SelectionKey ;
Импортировать Java. Nio . каналы . Селектор ;
Импортировать Java. Nio . каналы . ServerSocketChannel ;
Импортировать Java. Nio . каналы . SocketChannel ;
Импортировать Java. Util. Итератор ;
Импортировать Java. Util. Установить ;
/ **
* @author Crunchify.com
*
* /
общественности учебный класс CrunchifyNIOServer {
@SuppressWarnings ( «не используется» )
общественности статический недействительным main ( Строка [ ] аргументы ) бросает IOException {
// Selector: мультиплексор объектов SelectableChannel
Селектор селектор знак равно Selector. открыть ( ) ; // здесь открыт селектор
// ServerSocketChannel: выбираемый канал для потоковых сокетов прослушивания
ServerSocketChannel crunchifySocket знак равно ServerSocketChannel . открыть ( ) ;
InetSocketAddress crunchifyAddr знак равно новый InetSocketAddress ( localhost , 1111 ) ;
// привязывает сокет канала к локальному адресу и настраивает сокет для прослушивания соединений
crunchifySocket . bind ( crunchifyAddr ) ;
// Регулирует режим блокировки этого канала.
crunchifySocket . configureBlocking ( false ) ;
ИНТ опс знак равно crunchifySocket . validOps ( ) ;
SelectionKey selectKy знак равно crunchifySocket . зарегистрироваться ( селектор , опс , ноль ) ;
// Бесконечный цикл..
// Поддерживать работу сервера
в то время как ( правда ) {
log ( «Я сервер, и я жду нового подключения и выбора буфера …» ) ;
// Выбирает набор ключей, соответствующие каналы которых готовы к операциям ввода / вывода
селектор. выберите ( ) ;
// токен, представляющий регистрацию SelectableChannel с помощью селектора
Установить crunchifyKeys знак равно селектор. selectedKeys ( ) ;
Итератор crunchifyIterator знак равно crunchifyKeys . итератор ( ) ;
в то время как ( crunchifyIterator . hasNext ( ) ) {
SelectionKey myKey знак равно crunchifyIterator . следующий ( ) ;
// Проверяет, готов ли канал этого ключа принять новое соединение с сокетом
если ( myKey . isAcceptable ( ) ) {
SocketChannel crunchifyClient знак равно crunchifySocket . принять ( ) ;
// Регулирует режим блокировки этого канала на false
crunchifyClient . configureBlocking ( false ) ;
// бит установленный для операций чтения
crunchifyClient . зарегистрироваться ( селектор , SelectionKey . OP_READ ) ;
журнал ( «Соединение принято:» + crunchifyClient . getLocalAddress ( ) + / n ) ;
// Проверяет, готов ли канал этого ключа к чтению
} еще если ( myKey . isReadable ( ) ) {
SocketChannel crunchifyClient знак равно ( SocketChannel ) MYKEY. канал ( ) ;
ByteBuffer crunchifyBuffer знак равно ByteBuffer . выделить ( 256 ) ;
crunchifyClient . читать ( crunchifyBuffer ) ;
строка результат знак равно новый String ( crunchifyBuffer . Array ( ) ) . отделка ( ) ;
log ( Сообщение получено: + результат ) ;
если ( результат . равно ( Crunchify ) ) {
crunchifyClient . закрыть ( ) ;
log ( / nПри закрытии соединения мы получили последнее название компании Crunchify ) ;
log ( / nServer продолжит работу. Попробуйте запустить клиент еще раз, чтобы установить новое соединение ) ;
}
}
crunchifyIterator . удалить ( ) ;
}
}
}
частный статический недействительным log ( Строка ул ) {
Система. вне. println ( str ) ;
}
}

Код клиента — CrunchifyNIOClient.java

CrunchifyNIOClient.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
пакет crunchify. ком . учебные пособия ;
Импортировать Java. Ио. IOException ;
Импортировать Java. нетто. InetSocketAddress ;
Импортировать Java. Nio . ByteBuffer ;
Импортировать Java. Nio . каналы . SocketChannel ;
Импортировать Java. Util. ArrayList ;
/ **
* @author Crunchify.com
*
* /
общественности учебный класс CrunchifyNIOClient {
общественности статический недействительным main ( Строка [ ] аргументы ) бросает IOException , InterruptedException {
InetSocketAddress crunchifyAddr знак равно новый InetSocketAddress ( localhost , 1111 ) ;
SocketChannel crunchifyClient знак равно SocketChannel . открыть ( crunchifyAddr ) ;
журнал ( «Подключение к серверу через порт 1111 …» ) ;
ArrayList Сведения о компании знак равно новый ArrayList ( ) ;
// создаем ArrayList со списком companyName
companyDetails . добавить ( Facebook ) ;
companyDetails . добавить ( «Твиттер» ) ;
companyDetails . добавить ( «IBM» ) ;
companyDetails . добавить ( Google ) ;
companyDetails . добавить ( Crunchify ) ;
за ( Строка название компании : companyDetails ) {
байт [ ] сообщение знак равно новый Строка ( companyName ) . getBytes ( ) ;
ByteBuffer буфер знак равно ByteBuffer . упаковка ( сообщение ) ;
crunchifyClient . запись ( буфер ) ;
журнал ( отправка: + companyName ) ;
буфер . очистить ( ) ;
// подождать 2 секунды перед отправкой следующего сообщения
Thread. сон ( 2000 ) ;
}
crunchifyClient . закрыть ( ) ;
}
частный статический недействительным log ( Строка ул ) {
Система. вне. println ( str ) ;
}
}

Результат на стороне сервера:

Вывод на стороне сервера

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
я «сервер ма и я» м ждет новый соединение и выбор буфера . , ,
Соединение принято : / 127.0.0.1 : 1111
я «сервер ма и я» м ждет новый соединение и выбор буфера . , ,
Сообщение получено : facebook
я «сервер ма и я» м ждет новый соединение и выбор буфера . , ,
Сообщение получено : щебет
я «сервер ма и я» м ждет новый соединение и выбор буфера . , ,
Сообщение получено : IBM
я «сервер ма и я» м ждет новый соединение и выбор буфера . , ,
Сообщение получено : Google
я «сервер ма и я» м ждет новый соединение и выбор буфера . , ,
Сообщение получено : Crunchify
Пришло время , чтобы закрыть соединение , как мы получили в прошлом название компании 'Crunchify'
Сервер продолжит работать. Попробуйте запустить клиент еще раз, чтобы установить новое соединение
я»м сервер и я ждет новый соединение и выбор буфера . , ,

Результат на стороне клиента:

Вывод на стороне клиента

1
2
3
4
5
6
Подключение к Сервер на порту 1111 …
отправка : facebook
отправка : щебет
отправка : IBM
отправка : Google
отправка : Crunchify

Несколько часто задаваемых вопросов:

  1. С клиента, как мне поддерживать постоянное соединение ?
    • Вы могли бы использовать socket.setKeepAlive(true); иметь живые соединения со стороны клиента.
  2. Как мне прочитать ответ на сообщение, которое я отправляю на сервер. Сервер продолжает генерировать сообщения каждые 10 секунд. Мне просто нужно прочитать ответ на мой запрос. Насколько я понимаю, TCP «потоковые» данные вместо конца записи и т. Д.
    • Для связи клиент-сервер протокол должен быть четко определен. readLine() вызов будет заблокирован, пока не будут возвращены все данные, поэтому не используйте его. Try reading bytes from the stream until -1 is returned.

Дай мне знать, если это работает.

Java NIO (неблокирующий ввод / вывод) на примере сервера с клиентом — java.nio.ByteBuffer и channel.Selector — Java NIO Vs. IO

0.00 (0%) 0 votes

ЧИТАТЬ ТАКЖЕ:  банка не загружена. См. Servlet Spec 2.3, раздел 9.7.2. Оскорбляющий класс: javax / servlet / Servlet.class

ОСТАВЬТЕ ОТВЕТ

Пожалуйста, введите ваш комментарий!
пожалуйста, введите ваше имя здесь