User Datagram Protocol программирования

Это часто бывает, что когда кто-то показывает, некоторые сетевые программирования, который использует стандартные библиотеки, J2SE, код для розетки модель, основанная на использовании Transmission Control Protocol / Internet Protocol (TCP / IP). TCP / IP используется для интернет-общения, такие задачи, как отправка электронной почты с помощью Simple Mail Transfer Protocol (SMTP), серфинге в Интернете через Hypertext Transfer Protocol (HTTP), и просмотр новостей через сеть протокол передачи новостей (NNTP). Что TCP / IP гарантий доставки сообщения.

Короче говоря, часть из IP TCP / IP движется пакетов данных от узла к узлу. Части TCP обертывания адресами источника и назначения, а также порты с информацией последовательность и содержание. Когда набор пакетов из исходного адреса прибывает в место назначения, целевой хост может resequence пакетов в их первоначальном тем, что получатель может прочитать данные в первоначальном порядке оно было отправлено.

Если вы являетесь пользователем классы, такие как розетки и URL, TCP / IP заботится многие детали, касающиеся общения. Так, например, TCP / IP определяет смещение в заголовке, чтобы хранить последовательность и номеров подтверждения для пакетов TCP. Кроме того, инкапсуляции пакетов TCP является то, что называется пакета IP датаграммы. Упаковка датаграммы, когда делаете TCP / IP-программирование также сделали для вас.

Однако могут иметь место случаи, когда TCP / IP обеспечивает больше, чем вам нужно. Например, что если вам не нужна, чтобы гарантировать доставку сообщений, или вы не хотите, чтобы с задержкой представил ретрансляцию пакетов, или вам не нужны данные, которые будут читать в оригинале тем оно было отправлено ? В этих случаях можно использовать альтернативу TCP / IP называется User Datagram Protocol (UDP). При работе с UDP, вы все еще посылать пакеты по протоколу IP, но нет никакой гарантии, доставки или заказа. Почему может быть доставка не важно? Представьте себе, создав программу, чтобы все машины в офисе должно работать. Каждые несколько секунд каждая машина посылает "I'm Alive" сообщений на центральный сервер. Имеет ли значение, "I'm Alive" сообщения потеряны? Ответ, как правило, нет. Существует ничего, что отправитель сообщения может сделать, кроме отправить сообщение, и он собирается отправить то же сообщение в несколько секунд. Кроме того, не все ли равно, если сообщения не приходят в точном порядке? Опять же, для этого типа сообщений: Нет, это не имеет значения. Вы действительно беспокоит то, что сообщение приходит 10:05 на 10:10? Не совсем так. Конечно, для High-End Фондовой Торговой Системы вы не хотите терять информацию о ценах, но и для низких биржевых приоритетом, это действительно вопрос, если вы пропустите изменения цен? Когда пришло время сделать что торговля акциями, вам необходимо будет снова проверить в любом случае. На самом деле, используя TCP может иметь пагубные последствия в случае их отсутствия пакетами возмущаться получить в режиме реального времени данные. Своевременное, а не упорядоченным и надежной доставки является более важным в случае реального времени.

UDP программирование предполагает DatagramPacket и DatagramSocket классы пакета java.net. DatagramPacket содержит информацию для отправки, в том числе определение, куда отправить эти данные. DatagramSocket используется для передачи и приема пакетов.

DatagramPacket класс включает в себя шесть конструкторов:

  • DatagramPacket(byte[] buf, int length, InetAddress address, int port)
  • DatagramPacket(byte[] buf, int offset, int length, InetAddress address, int port)
  • DatagramPacket(byte[] buf, int offset, int length, SocketAddress address)
  • DatagramPacket(byte[] buf, int length, SocketAddress address)
  • DatagramPacket(byte[] buf, int length)
  • DatagramPacket(byte[] buf, int offset, int length)

Обратите внимание, что список конструкторов состоит из трех пар. Первые две пары конструкторы использовали для создания пакетов для передачи. Конструкторы в первой паре использовать InetAddress для адреса назначения. Конструкторы во второй паре использовать SocketAddress. Окончательный пару конструкторы использовали для получения пакетов. Нет источника или адреса назначения необходимо в этих конструкторов.

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

Вот пример, который отправляет и получает датаграммы пакетов:


   import java.io.*;

   import java.net.*;



   public class GetTime {

     final private static int DAYTIME_PORT = 13;

     public static void main(String args[]) throws 

             IOException {

       if (args.length == 0) {

         System.err.println

             ("Please specify daytime host");

         System.exit(-1);

       }

       String host = args[0];

       byte message[] new byte[256];

       InetAddress address = InetAddress.getByName(host);

       System.out.println("Checking at: " + address);

       DatagramPacket packet = 

           new DatagramPacket(message, message.length, 

                   address, DAYTIME_PORT);

       DatagramSocket socket = new DatagramSocket();

       socket.send(packet);

       packet = 

           new DatagramPacket(message, message.length);

       socket.receive(packet);

       String time = new String(packet.getData());

       System.out.println(The time at 

               + host + " is: " + time);

       socket.close();

     }

   }

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

java GetTime localhost
Checking at: localhost/127.0.0.1
The time at localhost is: Fri Apr  2 11:30:46 2004

Одна потенциальная проблема с этим пример относится к вопросам безопасности. По соображениям безопасности, наиболее доступной через сеть машины выключить неосновные услуги и отключить соединение через UDP межсетевых экранов. Таким образом, вы можете не найти доступный компьютеру с дневной службы. Linux пользователи могут запустить сервис и подключиться к их собственной машины. Другой вариант (и для тех, кто не startable службы), является использование приспособленец показано ниже. Приспособленец использует тот же DatagramPacket и DatagramSocket классы для создания сервера для этой программы.

Новые DatagramSocket (DAYTIME_PORT) линии в приспособленец значит, что вы хотите послушать на любом порту определяется в DAYTIME_PORT. Программа не будет ждать, пока вы делаете звонок на получают методом. Как и в случае, когда вы отправите запрос, то вы должны создать для пакетов данных. Дневной службе игнорирует содержимое пакета, но вы все равно должны создать пакет получит запрос. Чтобы отправить назад в ответ на DatagramPacket, вам нужно задать получаемого пакета, куда отправлять ответ.

Вот программа приспособленец:


   import java.io.*;

   import java.net.*;

   import java.util.*;



   public class TimeServer {

     final private static int DAYTIME_PORT = 13;

     public static void main(String args[]) throws 

             IOException {

       DatagramSocket socket = 

             new DatagramSocket(DAYTIME_PORT);

       while (true) {

         byte buffer[] new byte[256];

         DatagramPacket packet = 

             new DatagramPacket(buffer, buffer.length);

         socket.receive(packet);

         String date = new Date().toString();

         buffer = date.getBytes();

         // Get response address/port 

         // for client from packet

         InetAddress address = packet.getAddress();

         int port = packet.getPort();

         packet = new DatagramPacket(buffer, buffer.length, 

                 address, port);

         socket.send(packet);

       }

     }

   }

Если вы на машине, которая не позволяет разрешение на создание службы по низким порта, например 13, изменить порт, как в классе клиент GetTime и класс приспособленец.

Составление и начать первый класс приспособленец. Это будет работать всегда, просто время реагирования на просьбы таких как одну прислали, когда вы запустите GetTime класс.

Если вы не знакомы с дневной службы, это определено в RFC 867.

Для получения дополнительной информации о датаграмм, см. сетей тропе в Java Tutorial.

Copyright (C) 2004-2005 Sun Microsystems, Inc
Все права защищены.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>