Иллюстрированный самоучитель по 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);
}
}
}