Электронная библиотека книг Александра Фролова и Григория Фролова.
Shop2You.ru Создайте свой интернет-магазин
Библиотека
Братьев
Фроловых
[Назад]

Библиотека примеров приложений Java

Оглавление
Работа с классом InetAddress
Работа с классом URL
Просмотр файлов сервера Web
Копирование файлов сервера Web
Контрольная сумма аплета
Потоковые сокеты - сервер
Потоковые сокеты - клиент
Общение в реальном времени
Широковещатель-
ные сообщения

Аплет и расширение сервера Web

Назад Вперед

8.7. Потоковые сокеты - клиент

Прмер представляет собой автономное приложение Java, выполняющее роль клиента для сервера, описанного в предыдущем разделе. Клиент посылает серверу текстовые строки, введенные пользователем с консоли, получает ответ от сервера и отображает его на консоли. Демонстрируется использование класса Socket.

Исходный текст примера

Архив проекта для Java WorkShop 2.0

Немного теории

В этом разделе мы расскажем о клиентских приложениях, работающих с сокетами класса Socket.

При инициализации клиентского приложения нужно создать сокет как объект класса Socket, указав адрес IP серверного приложения и номер порта, используемого сервером:

Socket s;
s = new Socket("localhost",8000);

Здесь в качестве адреса IP мы указали специальный адрес localhost, предназначенный для тестирования сетевых приложений, а в качестве номера порта - значение 8000, использованное сервером при создании объекта класса ServerSocket.

Теперь можно создавать входной и выходной потоки. На стороне клиента эта операция выполняется точно таким же образом, что и на стороне сервера:

InputStream is;
OutputStream os;
is = s.getInputStream();
os = s.getOutputStream();

Описание примера

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

Сразу после запуска наш клиент подключается к серверу и выводит на консоль номер использованного локального порта:

* Socket Client *
Local Port: 1180
Hello from client Application!
* Hello from client Application! *
qwerty
* qwerty *
quit

Далее вы можете вводить произвольные строки, которые будут передаваться серверу. Сервер "пририсует" к ним звездочки и возвратит клиенту, а тот покажет принятые данные на консоли.

Если ввести строку "quit", и клиент, и сервер завершат свою работу.

В том случае если вы запустите клиент до запуска сервера, клиентское приложение завершится с исключением ConnectException:

* Socket Client *
java.net.ConnectException: Connection refused

Теперь об исходных текстах клиентского приложения. Фактически нам будет интересен только метод main, так как именно он выполняет всю полезную работу.

Сразу после запуска клиентского приложения метод main пытается создать сокет с номером 9999 для специального адреса IP "localhost" (это адрес 127.0.0.1):

Socket s = null;
    
try
{
  s = new Socket("localhost", 9999);
}  
catch(Exception ex)
{
  System.out.println(ex.toString());
  System.exit(0);
}

Наше демонстрационное приложение работает на одном компьютере с сервером, поэтому мы и смогли воспользоваться специализированным адресом IP с номером 127.0.0.1. Однако в тех случаях, когда сервер и клиент работают на разных компьютерах сети, в качестве первого параметра конструктору класса Socket вы должны передать ссылку на объект класса InetAddress. Данный объект должен содержать реальный адрес узла, где работает сервер.

Можно также воспользоваться другими конструкторами класса Socket, допускающими явное указание доменного адреса или адреса IP в виде текстовой строки.

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

Для контроля метод main получает номер локального порта и отображает его на консоли:

int nPort = s.getLocalPort();
System.out.println("Local Port: " + nPort);

Далее он создает входной и выходной потоки для обмена данными с сервером:

InputStream is;
OutputStream os;
    
try
{
  is = s.getInputStream();
  os = s.getOutputStream();
  . . .
}
catch(Exception ex)
{
  System.out.println(ex.toString());
}  

Что же касается самого обмена, то он выполняется в цикле:

String szStr;
while(true)
{
  szStr = getKbdString();
        
  sendString(os, szStr);
  os.flush();
        
  if(szStr.equals("quit"))
    break;    
          
  szStr = recvString(is);
  System.out.println(szStr);
}

На каждой итерации метод main вводит строку с консоли (методом getKbdString, определенным в нашем приложении).

Далее эта строка передается серверу при помощи метода sendString, описанном в предыдущем разделе нашей библиотеки примеров. Ответ принимается методом recvString, с которым вы тоже уже знакомы, и выводится на консоль клиентской программы.

Если пользователь введет строку "quit", цикл завершит свою работу.

После этого метод main закроет потоки и сокет:

is.close();
os.close();
s.close();

Назад Вперед

[Назад]