Изменить стиль страницы

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

*/

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();

}

/**

Запустите данный сервер. Этот метод должен бытьвызван явно после создания данного объекта. Он запускает прослушивание запросов клиентов на известном сокете.

Оператор вызова должен запустить это выполнение в отдельной нити.

*/

public void run()

{

while (true)

{

try

{

// Откройте соединение известного сокета для данной

// «службы». wellKnownConn = (StreamConnectionNotifier)

Connector.open(uri);

//Прослушиваем запросы соединения. Данный вызов

// блокирует работу до тех пор, пока не будет получен

// запрос на соединение.

clientConn = wellKnownConn.acceptAndOpen()

// Создадим экземпляр агента» сервера, объект, который

// представляет службу для клиента. Каждый экземпляр

// взаимодействует с одним клиентом.

// Порождаем нить для взаимодействия с

// клиентом, создавшим запрос на соединение.

ServerAgent agent = new ServerAgent(clientConn);

Thread thread = new Thread (agent);

} catch (lOException ioe)

(System.out.printlnfioe.getMessage!));

ioe.printStackTrace(); break;

)

}

}

}

Листинг 8.7. Агент сервера является объектом, который взаимодействует с клиентом независимо от демона сервера. Он запускает свою собственную нить, позволяя другим экземплярам одновременно взаимодействовать со своими клиентами

import javax.microedition. io._StreamConnectior.;

/**

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

Он действует как «агент» от имени сервера для того, чтобы сервер был свободен для прослушивания только новых запросов соединения.

Экземпляры данного класса являются частью сервера.

*/

public class ServerAgent implements Runnable

private StreamConnection conn;

/**

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

@param с Объект соединения, который представляет

соединение с клиентом. Класс ServerSocket создает и пересылает

его в данный конструктор.

*/

public ServerAgent(StreamConnection c)

super (); conn = с;

}

/**

Выполняется агент данного сервера. Начинается диалог с клиентом. Этот метод должен быть вызван явно после того, как создан данный объект.

public void run()

}

// Взаимодействует с клиентом. Реализует поведение,

// которое определяет данную службу.

}

}

Листинг 8.8. Клиент имеет отдельно соединение с агентом сервера. Модель состояния взаимодействий, а также синтаксис и семантика взаимодействий определяются сервером, но клиенты должны им подчиняться

import javax.microedition.midlet.MI Diet;

import javax.microedition.io.StreamConnection;

import javax.microedition.io.Connector;

import Java.io.lOException;

/**

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

Для создания экземпляра данного класса вы должны указать сервер (имя сервера DNS) и известный порт службы, с которой вы хотите установить соединение.

*/

public class ClientSocket implements Runnable

{

public static final String P.ROTOCOL = «socket»;

// Порт известного сокета сервера, private String serverPort;

// Имя сервера, с которым соединяемся, private String serverHostName;

// URI известного серверного сокета. private String serverURI;

// Соединение с. сервером.

private StreamConnection streamConn;

protected ClientSocket()

}

super();

}

/**

Открытый конструктор. Вы должны указать имя сервера DNS и номер порта службы. @param server — имя DNS машины, с которой вы хотите соединиться.

@param port — Номер порта сервера, с которым вы хотите соединиться.

*/

public ClientSocket(String server, String port)

throws TOException

(

this();serverHostName = server; serverPort = port;

serverURI = buildServerURI (); open ();

}

/**

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

@param uri — полностью сформированный URI службы, запрос на соединение с которой вы хотите создать.

@сбрасывает InvalidArgumentException при несформированном URI.

*/

public ClientSocket(String uri) throws lOException

{

this (); serverURI = uri;

}

Открывает соединение. После того как создан данный объект, соединение с сервером еще не открыто. Вы должны открыть его явно.

Это делает модель использования более гибкой для клиентов.

@ сбрасывает lOException, если соединение не может быть открыто по некоторым причинам.

*/

public void open() throws lOException

streamConn = (StreamConnection) Connector.open(serverURI);

/**

Закрывает соединение с сервером.

*/

public void closed try streamConn. closed; }

catch (lOException ioe)

}

ioe.printStackTraced;

{

{

/**

Выполняет клиентское взаимодействие.

Запускает посылку клиентом запросов на сервер.

Этот метод должен быть вызван после того, как метод opend установит соединение.

*/

public void run ()

{

// Начинаем взаимодействие с сервером.

// Посылаем запросы, читаем ответы

….

private String buildServerURI ()

}

StringBuffex uri = new StringBuffer(PROTOCOL);

uri.append ("://"); uri.append(serverHostName);

uri.append(":"); uri.append(serverPort); return uri.toString ();

}

}

Использование соединений сокета в приложениях MIDP. Естественно, тот факт, что интерфейс StreamConnectionNotif ier определен как часть пакета IOMIDP, предполагает, что он должен использоваться приложениями, запускаемыми на устройствах MIDP. Это означает, что MID-лет может поддерживать открытое соединение с известным соке-том для использования клиентами. Клиенты, однако, могут находиться в другом месте.

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