Иллюстрированный самоучитель по Java

Работа по протоколу UDP


Для посылки дейтаграмм отправитель и получатель создают сокеты дейта-граммного типа. В Java их представляет класс DatagramSocket. В классе три конструктора:

DatagramSocket ()

— создаваемый сокет присоединяется к любому свободному порту на локальной машине;

DatagramSocket (int port)

— создаваемый сокет присоединяется к порту port на локальной машине;

DatagramSocket(int port, InetAddress addr) — создаваемый СОКСТ при

соединяется к порту port; аргумент addr — один из адресов локальной машины.

Класс содержит массу методов доступа к параметрам сокета и, кроме того, методы отправки и приема дейтаграмм:

send(DatagramPacket pack)

— отправляет дейтаграмму, упакованную в пакет pack;

receive (DatagramPacket pack)

— дожидается получения дейтаграммы и заносит ее в пакет pack.

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



connect(InetAddress addr, int port)

При этом устанавливается только одностороннее соединение с хостом по адресу addr и номером порта port — или на отправку или на прием дейтаграмм. Потом соединение можно разорвать методом

disconnect()

При посылке дейтаграммы по протоколу JJDP сначала создается сообщение в виде массива байтов, например,

String mes = "This is the sending message."; 

byte[] data = mes.getBytes();

Потом записывается адрес — объект класса inetAddress, например: 

InetAddress addr = InetAddress.getByName (host);

Затем сообщение упаковывается в пакет — объект класса DatagramPacket. При этом указывается массив данных, его длина, адрес и номер порта:

DatagramPacket pack = new DatagramPacket(data, data.length, addr, port)

Далее создается дейтаграммный сокет

DatagramSocket ds = new DatagramSocket()

и дейтаграмма отправляется

ds.send(pack)

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


ds.close ()

Прием и распаковка дейтаграмм производится в обратном порядке, вместо метода send () применяется метод receive (DatagramPacket pack).

В листинге 19.5 показан пример класса Sender, посылающего сообщения, набираемые в командной строке, на localhost, порт номер 1050. Класс Recipient, описанный в листинге 19.6, принимает эти сообщения и выводит их в свой стандартный вывод.



Листинг 19.5.


Посылка дейтаграмм по протоколу UDP

import java.net.*; 

import java.io.*;

class Sender{

private String host; 

private int port; 

Sender(String host, int port){ 

this.host = host; 

this.port = port; 

}

private void sendMessage(String mes){ 

try{

byte[] data = mes.getBytes();

InetAddress addr = InetAddress.getByName(host);

DatagramPacket pack =

new DatagramPacket(data, data.length, addr, port); 

DatagramSocket ds = new DatagramSocket(); 

ds.send(pack); 

ds.close();

}catch(IOException e){

System.err.println(e); 





public static void main(String[] args){

Sender sndr = new Sender("localhost", 1050); 

for (int k = 0; k < args.length; k++)

sndr.sendMessage(args[k]); 



}



Листинг 19.6.


Прием дейтаграмм по протоколу UDP

import j ava.net.*; 

import java.io.*;

class Recipient{

public static void main(String[] args)( 

try{

DatagramSocket ds = new DatagramSocket(1050); 

while (true){

DatagramPacket pack =

new DatagramPacket(new byte[1024], 1024); 

ds.receive(pack);

System.out.println(new String(pack.getData())); 



)catch(Exception e){

System.out.println(e); 





}


Содержание раздела