Мрежово програмиране в Java
Идентификация на машина в мрежата
Примери на протоколи от приложния слой
IP (Internet protocol) - комутация на пакети(datagrames). Не съществува стандартно Java API позволяващо директна манипулация на протокола IP
UDP (User Datagram Protocol) - предаване на съобщения, бърза връзка, няма връзка между източник и получател, няма гаранция за получаване
TCP (Transmission Control Protocol) - трансмисия на поток, връзка между сървър и получател, гаранция за получаване.
Пакет java.net
Пакетът предлага множество класове за комуникация в Internet (и Intranet), работа с URL, дефиниция на нови протоколи.
По специално могат а бъдат създавани и използвани
- URL връзки
- Stream socket връзки (TCP)
- Datagram socket връзки (UDP)
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 |
32 бита в IPv4:
Ако най-старшите битове на адреса са:
0xxx: мрежа от клас A
10xx: мрежа от клас B
10xx: мрежа от клас C
128 бита в IPv6
Не притежава публични член променливи и конструктори
Някои член функции
за създаване на обект от класа:
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: 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"файлове.
Този клас осигурява по-добър контрол върху обмена на информацията на 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 |