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

на главную - закладки

Жанры

Программирование на Java
Шрифт:

if (count==-1) break; strBuff.append(readed, 0, count);

Thread.yield;

}

}

catch (UnknownHostException e) {

e.printStackTrace;

}

catch (IOException e) {

e.printStackTrace;

}

System.out.println("client " + name + " read : " + strBuff.toString);

}

}

Пример 16.3.

Теперь рассмотрим UDP. Для работы с этим протоколом и на стороне клиента, и на стороне сервера используется класс DatagramSocket. У него есть следующие

конструкторы:

DatagramSocket

DatagramSocket(int port)

DatagramSocket(int port, InetAddress laddr)

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

После открытия сокетов начинается обмен датаграммами. Они представляются экземплярами класса DatagramPacket. При отсылке сообщения применяется следующий конструктор:

DatagramPacket(byte[] buf, int length,

InetAddress address, int port)

Массив содержит данные для отправки (созданный пакет будет иметь длину, равную length ), а адрес и порт указывают получателя пакета. После этого вызывается метод send класса DatagramSocket.

try {

DatagramSocket s = new DatagramSocket;

byte data[]= {1, 2, 3};

InetAddress addr = InetAddress.getByName("localhost");

DatagramPacket p =

new DatagramPacket(data, 3, addr, 3456);

s.send(p);

System.out.println("Datagram sent");

s.close;

}

catch (SocketException e) {

e.printStackTrace;

}

catch (UnknownHostException e) {

e.printStackTrace;

}

catch (IOException e) {

e.printStackTrace;

}

Для получения датаграммы также создается экземпляр класса DatagramPacket, но в конструктор передается лишь массив, в который будут записаны полученные данные (также указывается ожидаемая длина пакета). Сокет необходимо создать с указанием порта, иначе, скорее всего, сообщение просто не дойдет до адресата. Используется метод receive класса DatagramSocket (аналогично методу ServerSocket.accept, этот метод также прерывает выполнение потока, пока не придет запрос от клиента). Пример реализации получателя:

try {

DatagramSocket s =

new DatagramSocket(3456);

byte data[]=new byte[3];

DatagramPacket p =

new DatagramPacket(data, 3);

System.out.println("Waiting...");

s.receive(p);

System.out.println("Datagram received: "+

data[0]+", "+data[1]+", "+data[2]);

s.close;

}

catch (SocketException e) {

e.printStackTrace;

}

catch (IOException e) {

e.printStackTrace;

}

Если

запустить сначала получателя, а затем отправителя, то можно увидеть, что первый напечатает содержимое полученной датаграммы, а потом программы завершат свою работу.

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

import java.io.*;

import java.net.*;

public class DatagramDemoServer {

public static final int PORT = 2000;

private static final int LENGTH_RECEIVE = 1;

private static final byte[] answer = ("received").getBytes;

private DatagramSocket servSocket = null;

private boolean keepRunning = true;

public static void main(String[] args) {

DatagramDemoServer server = new DatagramDemoServer;

server.service;

}

public DatagramDemoServer {

try {

servSocket = new DatagramSocket(PORT);

}

catch(SocketException e) {

System.err.println("Unable to open socket : " + e.toString);

}

}

protected void service {

DatagramPacket datagram;

InetAddress clientAddr;

int clientPort;

byte[] data;

while (keepRunning) {

try {

data = new byte[LENGTH_RECEIVE];

datagram = new DatagramPacket(data, data.length);

servSocket.receive(datagram);

clientAddr = datagram.getAddress;

clientPort = datagram.getPort;

data = getSendData(datagram.getData);

datagram = new DatagramPacket(data, data.length,

clientAddr, clientPort);

servSocket.send(datagram);

}

catch(IOException e) {

System.err.println("I/O Exception : " + e.toString);

}

}

}

protected byte[] getSendData(byte b[]) {

byte[] result = new byte[b.length+answer.length];

System.arraycopy(b, 0, result, 0, b.length);

System.arraycopy(answer, 0, result, b.length, answer.length);

return result;

}

}

Пример 16.4.

Заключение

В данном разделе были рассмотрены теоретические основы сети как одной большой взаимодействующей системы. Были описаны все уровни модели OSI и их функциональные назначения. Также были представлены основные утилиты, используемые для настройки и обнаружения неисправностей в сети. Затем были рассмотрены средства Java для работы с наиболее распространенными сетевыми протоколами. Приведен подробный пример и для более сложного случая – сервер, обслуживающий несколько клиентов одновременно.

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

Зомби

Парсиев Дмитрий
1. История одного эволюционера
Фантастика:
рпг
постапокалипсис
5.00
рейтинг книги
Зомби

Новый Рал 9

Северный Лис
9. Рал!
Фантастика:
попаданцы
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Новый Рал 9

Корсар

Русич Антон
Вселенная EVE Online
Фантастика:
боевая фантастика
космическая фантастика
6.29
рейтинг книги
Корсар

Надуй щеки! Том 6

Вишневский Сергей Викторович
6. Чеболь за партой
Фантастика:
попаданцы
дорама
5.00
рейтинг книги
Надуй щеки! Том 6

Город Богов

Парсиев Дмитрий
1. Профсоюз водителей грузовых драконов
Фантастика:
юмористическая фантастика
детективная фантастика
попаданцы
5.00
рейтинг книги
Город Богов

Черный Маг Императора 13

Герда Александр
13. Черный маг императора
Фантастика:
попаданцы
аниме
сказочная фантастика
фэнтези
5.00
рейтинг книги
Черный Маг Императора 13

Прорвемся, опера!

Киров Никита
1. Опер
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Прорвемся, опера!

Газлайтер. Том 14

Володин Григорий Григорьевич
14. История Телепата
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Газлайтер. Том 14

Обгоняя время

Иванов Дмитрий
13. Девяностые
Фантастика:
попаданцы
5.00
рейтинг книги
Обгоняя время

Солдат Империи

Земляной Андрей Борисович
1. Страж
Фантастика:
попаданцы
альтернативная история
6.67
рейтинг книги
Солдат Империи

Возвышение Меркурия. Книга 4

Кронос Александр
4. Меркурий
Фантастика:
героическая фантастика
боевая фантастика
попаданцы
5.00
рейтинг книги
Возвышение Меркурия. Книга 4

Найдёныш. Книга 2

Гуминский Валерий Михайлович
Найденыш
Фантастика:
альтернативная история
4.25
рейтинг книги
Найдёныш. Книга 2

Одна тень на двоих

Устинова Татьяна Витальевна
Детективы:
прочие детективы
9.08
рейтинг книги
Одна тень на двоих

Мерзавец

Шагаева Наталья
3. Братья Майоровы
Любовные романы:
современные любовные романы
эро литература
короткие любовные романы
5.00
рейтинг книги
Мерзавец