Программный доступ к сетевым параметрам

Java SE 6.0, кодовое название Mustang, быстро приближается к бета-2-досрочном освобождении доступа. Одним из дополнительных функций в Java SE 6 позволяет получить доступ к информации больше, чем вы могли получить доступ ранее о сетевых интерфейсах. Она не является редкостью иметь системы, работающие с несколькими активных сетевых соединений, таких, как проводная, 802.11 / B / G Wireless, и Bluetooth. Предыдущие версии J2SE была ограниченная поддержка для обеспечения доступа к открытой информации, связанной с несколькими соединениями. Java SE 6 расширяет эту возможность.

Представлен в J2SE 1.4, класс NetworkInterface предоставляет доступ к некоторой информации о сетевых интерфейсах. Вы можете использовать getNetworkInterfaces () в NetworkInterface информацию о множестве установленных сетей, или поиска конкретной сети с getByName () или getByInetAddress () методы. Затем можно отобразить информацию о сетевых интерфейсов, таких как имя или его InetAddress. Чтобы увидеть, какого рода информацию вы могли бы доступ с помощью NetworkInterface, запустите следующую программу, ListNets, в J2SE 5.0:


   import java.io.*;

   import java.net.*;

   import java.util.*;



   public class ListNets {

  

     public static void main(String args[])

         throws SocketException {

       Enumeration<NetworkInterface> nets =

         NetworkInterface.getNetworkInterfaces();

       for (NetworkInterface netint : Collections.list(nets)) {

         displayInterfaceInformation(netint);

       }

     }



     private static void displayInterfaceInformation(

         NetworkInterface netintthrows SocketException {

       System.out.printf(

           "Display name: %s%n", netint.getDisplayName());

       System.out.printf("Name: %s%n", netint.getName());

       Enumeration<InetAddress> inetAddresses = 

           netint.getInetAddresses();

       for (InetAddress inetAddress : Collections.list(

           inetAddresses)) {

       System.out.printf("InetAddress: %s%n", inetAddress);

       }

      System.out.printf("%n");

     }

   }  

Если вы запустите программу ListNets на типичной машине Microsoft Windows, ваш результат должен выглядеть следующим - отображение наименования и адреса могут быть разными на основе текущей оборудования и установки:

Display name: MS TCP Loopback interface
Name: lo
InetAddress: /127.0.0.1
Display name: Intel(R) PRO/100 VE Network Connection -
Packet Scheduler Miniport
Name: eth0
Display name: RCA USB Cable Modem - Packet Scheduler Miniport
Name: eth1
InetAddress: /11.22.33.44

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

В таких методов, как isMCGlobal () и isMCSiteLocal (), информация, которую можно получить о каждом InetAddress в большей степени связано с групповой и адрес типа, то о сетевом интерфейсе себя. Это сетевая информация, связанная теперь доступна с классом NetworkInterface в Java SE 6.0.

Сетевые интерфейсы могут быть иерархически организованным. Класс NetworkInterface в Java SE 6.0 включает два метода, GetParent () и getSubInterfaces (), которые имеют отношение к иерархии сетевого интерфейса. GetParent () возвращает родителя NetworkInterface из интерфейса. Иными словами, если что-то подинтерфейсом, GetParent () возвращает ненулевое значение. GetSubInterfaces () возвращает все подинтерфейсов по сетевому интерфейсу.

Вы можете обнаружить, если сетевой интерфейс "вверх" (то есть, бег) с ISUP () метод. Существуют также методы, которые говорят вам тип сетевого интерфейса: isLoopback () сообщает вам, если сетевой интерфейс, интерфейс обратной связи, isPointToPoint () сообщает вам, если это "точка-точка", а isVirtual () сообщает вам, если свой виртуальный интерфейс.

Помимо основной информации о состоянии, вы можете получить доступ к другим параметрам сети о сетевом интерфейсе такие, как свой физический адрес оборудования (как с массивом байтов) и максимальный (MTU) (максимальный размер пакета).

Последний пункт информации, доступной для каждого NetworkInterface приводится перечень новых интерфейс, который называется InterfaceAddress. Это дает вам InetAddress для этого адреса, широковещательного адреса и маски подсети.

Вот обновленная версия программы ListNets которая использует NetworkInterface усовершенствования:


   import java.io.*;

   import java.net.*;

   import java.util.*;

   

   public class ListNets {

     private static final Console console = System.console();

   

     public static void main(String args[]) throws 

         SocketException {

       Enumeration<NetworkInterface> nets =

         NetworkInterface.getNetworkInterfaces();

       for (NetworkInterface netint : Collections.list(nets)) {

         displayInterfaceInformation(netint);

       }

     }

   

     private static void displayInterfaceInformation(

         NetworkInterface netintthrows SocketException {

       console.printf("Display name: %s%n"

           netint.getDisplayName());

       console.printf("Name: %s%n", netint.getName());

       Enumeration<InetAddress> inetAddresses = 

           netint.getInetAddresses();

       for (InetAddress inetAddress : Collections.list(

           inetAddresses)) {

         console.printf("InetAddress: %s%n", inetAddress);

       }

   

       console.printf("Parent: %s%n", netint.getParent());

       console.printf("Up? %s%n", netint.isUp());

       console.printf("Loopback? %s%n", netint.isLoopback());

       console.printf(

           "PointToPoint? %s%n", netint.isPointToPoint());

       console.printf(

           "Supports multicast? %s%n", netint.isVirtual());

       console.printf("Virtual? %s%n", netint.isVirtual());

       console.printf("Hardware address: %s%n",

         Arrays.toString(netint.getHardwareAddress()));

       console.printf("MTU: %s%n", netint.getMTU());

   

       List<InterfaceAddress> interfaceAddresses = 

           netint.getInterfaceAddresses();

       for (InterfaceAddress addr : interfaceAddresses) {

         console.printf(

             "InterfaceAddress: %s%n", addr.getAddress());

       }

       console.printf("%n");

       Enumeration<NetworkInterface> subInterfaces = 

           netint.getSubInterfaces();

       for (NetworkInterface networkInterface : Collections.list(

           subInterfaces)) {

         console.printf("%nSubInterface%n");

         displayInterfaceInformation(networkInterface);

       }

       console.printf("%n");

     }

   

Запуск обновленного ListNets в Java SE 6.0. Опять же, результат зависит от конфигурации системы. Обратите внимание, что некоторая информация может быть доступна по соображениям безопасности.

> java ListNets
Display name: MS TCP Loopback interface
Name: lo
InetAddress: /127.0.0.1
Parent: null
Up? true
Loopback? true
PointToPoint? false
Supports multicast? false
Virtual? false
Hardware address: null
MTU: 1520
InterfaceAddress: /127.0.0.1
Broadcast Address: /127.255.255.255
Network Prefix Length: 8
Display name: Intel(R) PRO/100 VE Network Connection -
Packet Scheduler Miniport
Name: eth0
Parent: null
Up? false
Loopback? false
PointToPoint? false
Supports multicast? false
Virtual? false
Hardware address: [0, 1, 2, 3, 4, 5]
MTU: 1500
Display name: RCA USB Cable Modem - Packet Scheduler Miniport
Name: eth1
InetAddress: /11.22.33.44
Parent: null
Up? true
Loopback? false
PointToPoint? false
Supports multicast? false
Virtual? false
Hardware address: [0, 2, 3, 4, 5, 6]
MTU: 1500
InterfaceAddress: /11.22.33.44
Broadcast Address: /11.22.33.255
Network Prefix Length: 22

Вывод показывает, что соединение с сетью eth1 истекло, и подключены к сети Интернет с IP-адресом 11.22.33.44. Она также показывает, что сетевое соединение eth0 вниз. Loopback Интерфейс Up (и всегда должны быть выше).

Сравните результаты программы на то, что вы получите от чего-то, как команда Ipconfig (с / все опции). Вы увидите, очень похожие результаты.

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

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

Проверить, если страница существует

Приведенный ниже пример показывает способ проверить веб-страницу, существует или нет.


import java.net.*;

import java.io.*;



public class Check {



public static void main(String s[]) {

    System.out.println(exists("http://www.javist.ru/home/"));

    System.out.println(exists("http://www.javist.ru/homeless/"));

   }



static boolean exists(String URLName){

  try {

    HttpURLConnection.setFollowRedirects(false);

    // note : you may also need

    //        HttpURLConnection.setInstanceFollowRedirects(false)

    HttpURLConnection con =

       (HttpURLConnectionnew URL(URLName).openConnection();

    con.setRequestMethod("HEAD");

    return (con.getResponseCode() == HttpURLConnection.HTTP_OK);

    }

  catch (Exception e) {

       e.printStackTrace();

       return false;

       }

  }

}

Ниже делать то же самое, но на этот раз мы отождествляем ourself для прокси-сервера.


import java.net.*;

import java.io.*;

import java.net.*;

import java.util.Properties;



public class CheckUrl {



public static void main(String s[]) {

    new CheckUrl().doit();

   }



public void doit() {

    System.out.println(exists("http://www.rgagnon.com"));

    System.out.println(exists("http://www.yahoo.com"));

}





public boolean exists(String URLName){

  try {



    Properties systemSettings = System.getProperties();

    systemSettings.put("proxySet""true");

    systemSettings.put("http.proxyHost","proxy.mycompany.local";

    systemSettings.put("http.proxyPort""80";



    URL u = new URL(URLName);

    HttpURLConnection con = (HttpURLConnectionu.openConnection();

    sun.misc.BASE64Encoder encoder = new sun.misc.BASE64Encoder();

    String encodedUserPwd =

         encoder.encode("domain\\username:password".getBytes());

    con.setRequestProperty

         ("Proxy-Authorization""Basic " + encodedUserPwd);

    con.setRequestMethod("HEAD");

    System.out.println

         (con.getResponseCode() " : " + con.getResponseMessage());

    return (con.getResponseCode() == HttpURLConnection.HTTP_OK);

    }

  catch (Exception e) {

       e.printStackTrace();

       return false;

       }

  }

 }

Как обнаружить прокси-сервера для интернет соедини

Java SE 1.5 обеспечивает ProxySelector класс для обнаружения прокси-сервера. Если есть прямое подключение к Интернету тип прокси прямым иначе оно вернется хост и порт.

Пример ниже иллюстрирует эту функциональность:


public class testProxy {

    

    public static void main(String[] args) {

        try {

            

            System.setProperty("java.net.useSystemProxies","true");

            List l = ProxySelector.getDefault().select(

                        new URI("http://www.yahoo.com/"));

            

            for (Iterator iter = l.iterator(); iter.hasNext()) {

                

                Proxy proxy = (Proxyiter.next();

                

                System.out.println("proxy hostname : " + proxy.type());

                

                InetSocketAddress addr = (InetSocketAddress)

                    proxy.address();

                

                if(addr == null) {

                    

                    System.out.println("No Proxy");

                    

                else {

                    

                    System.out.println("proxy hostname : " 

                            addr.getHostName());

                    

                    System.out.println("proxy port : " 

                            addr.getPort());

                    

                }

            }

        catch (Exception e) {

            e.printStackTrace();

        }

    }

}

Как получить IP-адрес хоста

Этот совет Java иллюстрирует метод определения IP адреса по имени хоста. Разработчик может использовать этот код в клиент-сервер или приложения многопользовательских где это необходимо знать IP-адрес клиента, откуда пришел запрос.


    try {

    

        InetAddress addr = InetAddress.getByName("javist.ru.org");

        byte[] ipAddr = addr.getAddress();

    

        // Convert to dot representation

        String ipAddrStr = "";

        for (int i=0; i<ipAddr.length; i++) {

            if (i > 0) {

                ipAddrStr += ".";

            }

            ipAddrStr += ipAddr[i]&0xFF;

        }

        

    catch (UnknownHostException e) {

    }

Получить дату с сервера

Это можно сделать, открыв сокет к порту "дневной" (порт 13) (на Unix или NT машину).


import java.net.*;

import java.io.*;



public class GetTime {

 public static void main(String args[]) {

  if (args.length != 1) {

   System.out.println("Usage: GetTime HOST");

   return;

   }

  try  {

   Socket s = new Socket(args[0],13);

   InputStream is = s.getInputStream();

   while (true) {

    byte b[] new byte[100];

    int i=is.read(b);

    if (i==-1return;

    System.out.print(new String(b,0,i));

    }

   }

  catch (Exception e)  {

   e.printStackTrace();

   }

  }

}

Как определить IP-адрес и имя локального MA

Этот совет Java демонстрирует метод определения IP адрес и имя локального компьютера. Разработчик может использовать это для внутренней обработки в своих приложениях. Это может быть реализована на стороне клиента для передачи IP адрес и имя хоста на сервере.


    try {



        InetAddress addr = InetAddress.getLocalHost();

    

        // Get IP Address

        byte[] ipAddr = addr.getAddress();

    

        // Get hostname

        String hostname = addr.getHostName();



    catch (UnknownHostException e) {

    }

Как я могу отправить широковещательные пакеты в Java

Вещания определяется как отправка пакет для всех узлов сети на подсети. Подсеть IP сетевая маска делит IP адрес на две части: идентификатор сети и узлов идентификатора. Широковещательный адрес определяется как адрес IP, где установлены все биты узла идентификатора.

Таким образом, посылается широковещательный пакет из программы Java (или из программы на любом другом языке, если на то пошло), просто требует от вас указать широковещательный адрес в качестве пункта назначения для пакета.

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 класс включает в себя шесть конструкторов:

Обратите внимание, что список конструкторов состоит из трех пар. Первые две пары конструкторы использовали для создания пакетов для передачи. Конструкторы в первой паре использовать 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
Все права защищены.

Опубликовать сообщение на сервер, используя новостей NNTP Pro

Эта подсказка показывает, как отправить сообщение на сервер, используя новостей NNTP протокола.


import sun.net.nntp.*;

import java.io.*;



public class NntpPost {

  public static void main(String[] argsthrows IOException {

    /*

    ** pass your news server as parameter 

    **     eg. java NttpPost news.server.com

    */

    NntpClient c = new NntpClient(args[0]);

    NewsgroupInfo ni = c.getGroup("alt.test");

    PrintStream p = c.startPost();

    System.out.println("Starting post at " + args[0"...");

    p.println("From: 
epresley@jailhouse.rock (Elvis Presley)"
);

    p.println("Newsgroups: alt.test");

    p.println("Subject: I'm alive");

    p.println("");

    p.println("Hi");

    p.println("Don't be cruel, please help me");

    p.println(" ");

    p.println("Thanks in advance");

    if (c.finishPost())

      System.out.println("Ending post... success");

    else

      System.out.println("Ending post... failed");

    c.closeServer();

    }

  }

Читать сообщения от сервера новостей

Эта подсказка показывает, как читать сообщения от сервера новостей.


import sun.net.nntp.*;

import java.io.*;



public class NntpGetGroup {

  public static void main(String[] args

    throws IOException {

    /*

    ** pass your news server, newsgroup  as parameter 

    **     eg. java NttpPost news.server.com alt.test

    */

    NntpClient c = new NntpClient(args[0]);

    c.setGroup(args[1]);

    NewsgroupInfo ni = c.getGroup(args[1]);

    int first = ni.firstArticle;

    int last = ni.lastArticle;

    for (int i = first; i <= last; i++) {

      String aLine;

      BufferedReader br = null

      InputStream anArticle = null;   

      try {

        anArticle = c.getArticle(i);

        br = new BufferedReader(new InputStreamReader(anArticle));

        System.out.println("-----------------\nArticle " + i);

        while ((aLine = br.readLine()) != null) {

          System.out.println(aLine);

          }

        }

      catch (NntpProtocolException e) {

        /* 

        ** probably a cancelled article, just skip it

        */

        }

      }

    }

  }

Страница 2 из 2«12