Мрежово програмиране в Java

Протоколи  TCP/IP

Пакет  java.net

Идентификация на машина в мрежата

Класът InetAddress

Сървъри и клиенти

Протоколи TCP/IP

Примери на протоколи от приложния слой

IP (Internet protocol) - комутация на пакети(datagrames). Не съществува стандартно Java  API  позволяващо директна манипулация на протокола IP

UDP (User Datagram Protocol) - предаване на съобщения, бърза връзка, няма връзка между източник и получател, няма гаранция за получаване

TCP (Transmission Control Protocol) - трансмисия на поток, връзка между сървър и получател, гаранция за получаване.

Пакет java.net

Пакетът предлага множество класове за комуникация в Internet (и Intranet), работа с URL, дефиниция на нови протоколи.

По специално могат а бъдат създавани и използвани

Interfaces Classes Exceptions
ContentHandlerFactory
FileNameMap
SocketImplFactory
SocketOptions
URLStreamHandlerFactory
Authenticator
ContentHandler
DatagramPacket
DatagramSocket
    MulticastSocket
DatagramSocketImpl
InetAddress
NetPermission
PasswordAuthentication
ServerSocket
Socket
SocketImpl
SocketPermission
URL
URLClassLoader
URLConnection
    HttpURLConnection
    JarURLConnection
URLDecoder
URLEncoder
URLStreamHandler
MalformedURLException
ProtocolException
SocketException
    BindException
    ConnectException
    NoRouteToHostException
UnknownHostException
UnknownServiceException

Идентификация на машина в мрежата (по-точно на мрежова карта)

Адрес IP       - DNS форма                 - refg.tu-sofia.bg
                      “dotted quad”  форма     - 194.141.64.254

32 бита в IPv4:   

Ако най-старшите битове на адреса са:
0xxx: мрежа от клас A
10xx: мрежа от клас B
10xx: мрежа от клас C

128 бита в  IPv6

 

Клас InetAddress - Internet адрес (DNS и “dotted quad” форма)


Не притежава публични член променливи и конструктори

Някои член функции

за създаване на обект от класа:

static InetAddress getByName(String host) -  Определя IP  адреса на машина  (host).
static InetAddress[] getAllByName(String host) - Определя всички IP  адреси на машината host.
public static InetAddress getByAddress(byte[] addr) - addr в IPv4 е 4 байта, в IPv6 - 16.
static InetAddress getLocalHost() - адреса на локалната машина - еквивалентен на:.
                      getByName(null) ~ getByName("localhost") ~  getByName("127.0.0.1")

други:

 String getHostAddress() - IP адрес във форма на низ  : "%d.%d.%d.%d".
 String getHostName() -   името на машината на този адрес.
 boolean isMulticastAddress()проверява дали не е multicast адрес.
 
import java.net.*; 
public class NSLookupApp {
   public static void main(String args[]) {
      try {
            if(args.length!=1){ 
               System.out.println("Usage: java NSLookupApp hostName"); 
               return; 
           }
            InetAddress host = InetAddress.getByName(args[0]);
            String hostName = host.getHostName(); 
            System.out.println("Host name: "+hostName); 
           System.out.println("IP address: "+host.getHostAddress()); 
      }
      catch(UnknownHostException ex) { 
            System.out.println("Unknown host");
            return; 
      }
   }
}
java NSLookupApp localhost
Host name: localhost 
IP address: 127.0.0.1 

Упражнение: изведете на екран всички адреси на  www.yahoo.com
 

Класът URL

Напомняне

URL: Uniforme Resource Locator. 

Низ от символи, която позволява локализирането по уникален начин един източник от Internet - протокол, машина(адрес IP+номер на порт), път на достъп(path), име на файла:

протокол: //машина[:порт]/път/име

http://refg.tu-sofia.bg/JavaBg/Network/Reseau.html

Описание

Съдържа методи за отваряне и създаване на Web страници. Не притежава променливи.

Конструктори

Обект от класа URL може да се създаде с конструктор с параметър низ от символи (адрес URL) или с параметър - друг обект URL:

URL u1 = new URL("http://refg.vmei.acad.bg/");

URL u2 = new URL(u1, "Java/Network.htm");  // http://refg.vmei.acad.bg/Java/Network.html

Всички конструктори могат да генерират MalformedURLException.

 

Пример - да се прочете и изведе на екрана текста на една URL страница

import java.io.*;
import java.net.*;

class LectureURL{
   public static void main(String[] a){
      try{
         URL yahoo = new URL("http://www.yahoo.com/");
         BufferedReader br = new BufferedReader(new 
                                  InputStreamReader(yahoo.openStream()));
         String ligne;
         while((ligne=br.readLine()) !=null) {
            System.out.println(ligne);
         }
         br.close();
      }catch(MalformedURLException me) {
          System.out.println("MalformedURLException: "+ me);
      }catch (IOException ioe){
           System.out.println("IOException: "+ ioe);
      }
   }
}

 

Упражнение: Пребройте колко аплета има в дадена URL страница.

Пример с бинарен файл:

import java.io.*;
import java.net.*;
public class TestHttpDown {
	  public static void main(String arg[]) {
	      int octet;
	      try{
	        URL refg = new URL("http://refg.tu-sofia.bg/images/theatre.jpg");
	        InputStream fi= refg.openStream();
	        FileOutputStream fo= new FileOutputStream("theatre.jpg");
	        while((octet= fi.read())!=-1)fo.write(octet);
	        fi.close();
	        fo.close();
	        System.out.println("created");

	     }catch(MalformedURLException me) {
	         System.out.println("MalformedURLException: "+ me);
	     }catch (IOException ioe){
	          System.out.println("IOException: "+ ioe);
	     }

	}
}

Упражнение: Копирайте локално няколко WEB  страници. WEB  страниците и имената на съответстващите файлове се намират в файл с име   url-list.txt в следващата форма:

http://www.refg.tu-sofia.bg/JavaBg    Java.html
http://yahoo.com    yahoo.html

Решение

Упражнение: В горния пример копирайте локално и всички "image"файлове.

Клас URLConnection

Този клас осигурява по-добър контрол върху обмена на информацията на URL страницата

Конструиране - на две стъпки 1) конструира се URL  2)използва се функцията openConnection()

URL refg = new URL("http://refg.vmei.acad.bg");

URLConnection refg_c = refg.openConnection();

Предимства:

Класът притежава методи за прочитане на параметри на  страницата като:
тип на информацията getContentType()
заглавието на страницата: getHeaderField() 

и друга информация:

getContentEncoding()
getContentLength()
getDate()
getExpiration()
getLastModifed()

Ако URL страницата позволява (например cgi script), то обект от класа може да изпраща  информация към нея.

За да се изпрати информация трябва да се създаде изходен поток  (OutputStream) (чрез използването на getOutputStream() )  и да се зададе стойност на вътрешната променлива DoOutput (чрез setDoOutput(true)).

Пример

Следващият пример използва  script CGI  наречен backwards разположен на страницата  http://java.sun.com/cgi-bin/ , който чете низ от символи от стандартния си вход (във формат MIME), обръща ги в обратен ред и пише резултата върху стандартния изход.   В примера се използва факта, че формата MIME не преобразува кодовете на латинските букви и на цифрите.

 
import java.io.*;
import java.net.*;

  public class Reverse{
  public static void main(String[] args) {
    try{
      if(args.length != 1) {
         System.out.println("Usage: java Reverse string");
         System.exit(1);
      }
      String s = args[0];
      URL url = new URL("http://java.sun.com/cgi-bin/backwards");
      URLConnection urlc = url.openConnection();
      urlc.setDoOutput(true);
      PrintStream os = new PrintStream(urlc.getOutputStream());
      os.println("string=" + s);
      os.close();

      BufferedReader br = new BufferedReader(new
             InputStreamReader(urlc.getInputStream()));

      String ligne;
      while((ligne = br.readLine()) != null) {
             System.out.println(ligne);
      }
      br.close();
    }catch (MalformedURLException me) {
          System.out.println("MalformedURLException"+me);
    }catch (IOException ioe) {
          System.out.println("IOException"+ioe);
    }
  }
}
java InversionChaine shapka
shapka
reversed is: 

akpahs