Содержание
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
|
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 с помощью селектора
Установить
Итератор
в то время как ( 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
|
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 со списком 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
|
Несколько часто задаваемых вопросов:
- С клиента, как мне поддерживать постоянное соединение ?
- Вы могли бы использовать
socket.setKeepAlive(true);иметь живые соединения со стороны клиента.
- Вы могли бы использовать
- Как мне прочитать ответ на сообщение, которое я отправляю на сервер. Сервер продолжает генерировать сообщения каждые 10 секунд. Мне просто нужно прочитать ответ на мой запрос. Насколько я понимаю, TCP «потоковые» данные вместо конца записи и т. Д.
- Для связи клиент-сервер протокол должен быть четко определен.
readLine()вызов будет заблокирован, пока не будут возвращены все данные, поэтому не используйте его.Try reading bytes from the stream until -1 is returned.
- Для связи клиент-сервер протокол должен быть четко определен.
Дай мне знать, если это работает.
0.00 (0%) 0 votes








