Чтение онлайн

на главную

Жанры

Шрифт:

Этот оператор блокирует операции до тех пор, пока не появится запрос клиента на соединение. При появлении запроса клиента на соединение метод acceptAndOpen обрабатывает запрос перед передачей управления. Чтобы обработать запрос на соединение, он

1. Принимает запрос на соединение;

2. Создает новый объект соединения;

3. Связывает соединение с неиспользуемым сокетом;

4. Уведомляет клиента о новом соединении сокета.

Эти этапы объясняют название StreamConnectionNotifier. Демон сервера будет «уведомлен» о запросе на соединение при возвращении вызова блокирующего acceptAndOpen . И он уведомляет клиента о том, что он должен прослушивать

новый сокет, установленный для взаимодействия клиент-сервер. В таблице 8.13 показан единственный метод интерфейса StreamConnectionNotifier.

Таблица 8.13. Методы интерфейса StreamConnectionNotifier

Метод StreamConnectionNotifier — Описание

StreamConnection acceptAndOpen — Возвращает новый потоковый обьект, связанный с новым сокетом и соединенный с запрашивающим клиентом

Клиенты запрашивают соединение у известного сокета, создавая клиентский запрос соединения в стандартной форме. Например, следующий оператор представляет клиентский запрос соединения:

StreamConnection conn =

Connector.open("socket://server.foo.com:98765");

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

StreamConnection conn =

Connector.open("socket://localhost:98765");

Оба вызова StreamConnectionNotifier.acceptAndOpen(} сервера и Connector.open клиента создают объект StreamConnection. Вы уже видели класс StreamConnection при нашем обсуждении коммуникационных портов.

Вы можете быть удивлены, почему структура общих соединений использует интерфейс StreamConnection для представления сокетных соединений, а также для соединений с коммуникационными портами. Причина этого заключается в том, что данное общее название, как оно само и предполагает, представляет оба типа соединений как потоки байтов. Более того, оно может представлять любой другой тип поточно-ориентированного соединения, даже если оно использует другой протокол.

Нигде не оговаривается, какие виды протоколов может представлять интерфейс StreamConnection. Интерфейс извлекает подробную информацию о реализации протокола из приложения. Приложения не осведомлены о платформно-определяемых классах, которые реализуют интерфейсы. Хотя реализации интерфейса структуры общих соединений могут варьироваться, они должны поддерживать указанное поведение и семантику интерфейса.

Важно заметить, что не все реализации поддерживают серверные сокеты. И, из тех, что делают это, некоторые в настоящее время работают не совсем правильно. Если поддержка серверных сокетов недоступна на вашей реализации, но вы по некоторой причине должны использовать сокеты, вам придется разработать схему, по которой клиент сможет соединяться с «сервером». Сервер не сможет поддерживать модель известного сокета, ему придется определить другую модель, которая позволит клиентам получить средство установления соединения.

В листингах 8.6–8.8 демонстрируется набор классов, которые составляют структуру сокетных коммуникаций в MIDP. Смысл заключается в том, что эти классы будут использоваться приложением, которое нуждается в сокетных коммуникациях. Эти примеры составляют не больше чем

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

Некоторые данные были проигнорированы в этом коде. Например, сама сетевая служба не определена, нет определения синтаксиса или семантики сообщения протокола уровня приложений. Кроме того, код не обращается к очистке рабочих нитей со стороны сервера. Следующие классы являются классами, составляющими данный пример:

— ServerSocket — определяет демон сервера, который прослушивает известный сокет на предмет клиентских запросов соединения.

— Server Agent — определяет объект, один экземпляр которого демон создает для каждого клиентского запроса. Каждый экземпляр взаимодействует с клиентом. Данный класс определяет действительную службу.

— ClientSocket — представляет клиента.

Листинг 8.6. Сервер порождает новую нить для создания объекта со стороны сервера, который взаимодействует с каждым клиентом. Клиент и сервер должны определять семантику своих сообщений

import javax.microedition.io.Connector;

import javax.microedition.io.StreamConnection;

import javax.microedition.io.StreamConnectionNotifier;

import Java.io.lOException;

/**

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

Он открывает соединение на предварительно определенном номере порта.

А затем блокирует обработку на данном порте, ожидая клиентского запроса соединения.

Когда запрос появляется, он принимает его и открывает новое соединение сокета. Эти два этапа выражаются в реализации, уведомляющей реализацию клиента о новом соединении сокета.

Этот сервер затем порождает компонент и передает его новому объекту соединения. Компонент запускает отдельную нить. Компонент теперь свободен для взаимодействия с клиентом асинхронно от продолжающейся работы сервера.

public class ServerSocket imlements Runnable

{

// Порт по умолчанию, на котором установлен известный

// сокет. public static final String DEFAULT_PORT = «9876»;

// Порт, на котором установлен известный

// сокет. protected String wellKnownPort;

// URI, который данный сервер использует для открытия своего

// известного сокета. protected String uri;

// Соединение с известным сокетом.

protected StreamConnectionNotifier wellKnownConn;

// Соединение сокета, которое соединяется с клиентом,

protected StreamConnection clientConn;

/**

Конструктор для подклассов.

*/

protected ServerSocket

super ;

/**

Конструктор.

@param port Известный порт, на котором устанавливается этот объект как блок прослушивания.

*/

public ServerSocket (String port)

}

thisl); if (port == null)

{

wellKnownPort = DEFAULT_PORT;

}

else

}

wellKnownPort = port;

}

setURI(port);

{

protected void setURI(String port)

{

StringBuffer buf = new StringBuffer("socket://:");

buf.append(port); uri = buf.toString;

}

/**

Поделиться:
Популярные книги

Ретроградный меркурий

Рам Янка
4. Серьёзные мальчики в форме
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Ретроградный меркурий

Иван Московский. Том 5. Злой лев

Ланцов Михаил Алексеевич
5. Иван Московский
Фантастика:
попаданцы
альтернативная история
6.20
рейтинг книги
Иван Московский. Том 5. Злой лев

Хозяйка дома в «Гиблых Пределах»

Нова Юлия
Любовные романы:
любовно-фантастические романы
5.75
рейтинг книги
Хозяйка дома в «Гиблых Пределах»

Имперец. Том 1 и Том 2

Романов Михаил Яковлевич
1. Имперец
Фантастика:
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Имперец. Том 1 и Том 2

На границе империй. Том 9. Часть 4

INDIGO
17. Фортуна дама переменчивая
Фантастика:
космическая фантастика
попаданцы
5.00
рейтинг книги
На границе империй. Том 9. Часть 4

Бывшая жена драконьего военачальника

Найт Алекс
2. Мир Разлома
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Бывшая жена драконьего военачальника

Я Гордый часть 2

Машуков Тимур
2. Стальные яйца
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Я Гордый часть 2

Последний Паладин. Том 4

Саваровский Роман
4. Путь Паладина
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Последний Паладин. Том 4

Ваше Сиятельство

Моури Эрли
1. Ваше Сиятельство
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Ваше Сиятельство

Пушкарь. Пенталогия

Корчевский Юрий Григорьевич
Фантастика:
альтернативная история
8.11
рейтинг книги
Пушкарь. Пенталогия

"Дальние горизонты. Дух". Компиляция. Книги 1-25

Усманов Хайдарали
Собрание сочинений
Фантастика:
фэнтези
боевая фантастика
попаданцы
5.00
рейтинг книги
Дальние горизонты. Дух. Компиляция. Книги 1-25

Эксперимент

Юнина Наталья
Любовные романы:
современные любовные романы
4.00
рейтинг книги
Эксперимент

Темный Патриарх Светлого Рода 2

Лисицин Евгений
2. Темный Патриарх Светлого Рода
Фантастика:
фэнтези
юмористическое фэнтези
аниме
5.00
рейтинг книги
Темный Патриарх Светлого Рода 2

Все ведьмы – стервы, или Ректору больше (не) наливать

Цвик Катерина Александровна
1. Все ведьмы - стервы
Фантастика:
юмористическая фантастика
5.00
рейтинг книги
Все ведьмы – стервы, или Ректору больше (не) наливать