• Nie Znaleziono Wyników

Wykład 7Tworzenie łącz w apletach, wątki, serializacja obiektów, gniazda 1.Tworzenie łącz w apletach

N/A
N/A
Protected

Academic year: 2021

Share "Wykład 7Tworzenie łącz w apletach, wątki, serializacja obiektów, gniazda 1.Tworzenie łącz w apletach"

Copied!
1
0
0

Pełen tekst

(1)

Wykład 7

Tworzenie łącz w apletach, wątki, serializacja obiektów, gniazda 1.Tworzenie łącz w apletach

W pliku html zastosowano znacznik PARAM z atrybutami: name oraz value

<HTML>

<HEAD>

</HEAD>

<BODY BGCOLOR="000000">

<CENTER>

<APPLET code = "P5_9.class" width = "500" height = "300" >

<PARAM name = adres1 value = "http://www.obscurestore.com/">

<PARAM name = adres2 value = "http://www.ntk.net/">

</APPLET>

</CENTER>

</BODY>

</HTML>

import java.net.*;

import java.awt.*;

import java.applet.*;

public class P5_9 extends Applet { String a, b;

public void init() { }

public void paint(Graphics g)

{ a = getParameter("adres1"); //pobieranie parametru adres1 z pliku html

b = getParameter("adres2"); //pobieranie parametru adres2 z pliku html

if (a == null) a = "http://www.eka.pwr.wroc.pl/";

if (b == null) b = "http://www.eka.pwr.wroc.pl/";

try

{ URL load1 = new URL (a);

// pobranie i wyświetlenie strony www o adresie a w bieżącym oknie przeglądarki

getAppletContext().showDocument(load1);

} catch (MalformedURLException e) {System.out.println("Zly url "+a);}

try

{ URL load2 = new URL (b);

// pobranie i wyświetlenie strony www o adresie b w nowym oknie przeglądarki getAppletContext().showDocument(load2, "_blank");

} catch (MalformedURLException e) {System.out.println("Zly url "+b);}

}}

(2)
(3)

2. Wątki - wprowadzenie

Wątkiem nazywamy sekwencyjny przepływ sterowania w procesie, który wykonuje dany program np. odczytywanie i zapisywanie plików

Program Javy jest wykonywany w obrębie jednego wątku

Stos programu może być wykorzystywany przez wiele współbieżnych wątków programu

Zablokowanie jednego z wątków nie zawiesza działania innych wątków

Wznowienie działania wątku następuje od miejsca zawieszenia

System Windows przydziela cyklicznie czas procesora wątkom w kolejności wynikającej z ich priorytetów (taka sytuacja występuje np. w komputerach jednoprocesorowych)

Wiele działających wątków powoduje, że program działa asynchronicznie (nie ma pojedynczej pętli zdarzeń)

Synchronizacja wykonywanych metod przez wątki jest możliwa dzięki monitorowi, który posiada każdy z obiektów. Dodanie słowa synchronized do oznaczenia nazwy metody powoduje, że jeśli jeden z wątków wykonuje taką metodę, to żaden z pozostałych wątków nie może wykonać innej synchronizowanej metody tego obiektu.

Wątki mogą się porozumiewać za pomocą metod wait(), notify() i notifyAll() – wątek może wykonywać pewną metodę i po wykonaniu wait() czekać w niej, aż inny wątek nie zawiadomi go za pomocą metody notify() lub notifyAll() o możliwości kontynuowania wstrzymanej metody

Tworzenie wątków – klasa Thread oraz interfejs Runnable

Obiekt dziedziczący po klasie Thread może uruchomić nowy wątek, w którym może działać obiekt implementujący interfejs Runnable lub dziedziczący po klasie Thread, gdyż klasa Thread też implementuje interfejs Runnable (1 sposób)

Obiekt działający w wątku musi implementować metodę run() (interfejs Runnable)

Obiekt (wątek), który dziedziczy po klasie Thread lub który jest obiektem klasy Thread (wątek)jest związany z podstawowymi faktami:

w czasie tworzenia tego wątku, do jego konstruktora przekazuje się obiekt implementujący interfejs Runnable (1 sposób)

po uruchomieniu metody start() wątku zostaje automatycznie uruchomiona metoda run() obiektu wstawionego do wątku

jeśli konstruktor obiektu typu Thread lub dziedziczącego po nim jest pusty, po wywołaniu jego metody start(), uruchamiana jest metoda run() tego obiektu, jako obiektu działającego w wątku (2 sposób).

(4)

import java.util.*;

import java.io.*;

class Watek1 implements Runnable { public void run()

{ try

{ System.out.println("Watek potomny dziala");

Thread.sleep(4000);

} catch(InterruptedException e)

{ System.out.println("Przerwanie watku potomnego");}

System.out.println("Watek potomny zakonczyl dzialanie");

} }

public class p6_1 { void demo()

{ Thread watekglowny = Thread.currentThread();

System.out.println("Watek biezacy " + watekglowny);

Watek1 obiekt = new Watek1();

Thread watekpotomny = new Thread(obiekt, "Watek potomny");

watekpotomny.start();

try

{ Thread.sleep(6000);

} catch(InterruptedException e)

{ System.out.println("Przerwanie watku glownego");}

System.out.println("Watek glowny zakonczyl dzialanie");

}

public static void main (String argd[]) { p6_1 p = new p6_1 ();

p.demo();

} }

(5)

Synchronizacja wątków – słowo kluczowe synchronized 1) Przykład – brak synchronizacji wywołania metody wyswietl import java.util.*;

import java.io.*;

import java.lang.*;

class Zasob

{ void wyswietl(String m, int n) { System.out.print("< "+m);

try

{ Thread.sleep(4000);

} catch(Exception e) {}

System.out.println(n+">");

} }

class Watek2 implements Runnable { String s;

Zasob z;

int num;

public Watek2(Zasob zasob, String lan, int n) { s=lan; z= zasob; num=n; }

public void run() { z.wyswietl(s, num); } }

public class p6_2 { void demo()

{ Zasob zasob = new Zasob();

Watek2 obiekt1 = new Watek2(zasob, "Watek1 ",1);

Thread watek1 = new Thread(obiekt1);

watek1.start();

Watek2 obiekt2 = new Watek2(zasob, "Watek2 ",2);

Thread watek2 = new Thread(obiekt2);

watek2.start();

Watek2 obiekt3 = new Watek2(zasob, "Watek3 ",3);

Thread watek3 = new Thread(obiekt3);

watek3.start();

}

public static void main (String argd[]) { p6_2 p = new p6_2 ();

p.demo();} }

(6)

2) Przykład – synchronizacja wywołania metody wyswietl import java.util.*;

import java.io.*;

import java.lang.*;

class Zasob1

{ synchronized void wyswietl(String m, int n) { System.out.print("< "+m);

try

{ Thread.sleep(4000);

} catch(Exception e) {}

System.out.println(n+">");

} }

class Watek2 implements Runnable { String s;

Zasob1 z;

int num;

public Watek2(Zasob1 zasob, String lan, int n) {s=lan;

z= zasob;

num=n; }

public void run() { z.wyswietl(s,num); } }

public class p6_3 { void demo()

{ Zasob1 zasob = new Zasob1();

Watek2 obiekt1 = new Watek2(zasob, "Watek1 ",1);

Thread watek1 = new Thread(obiekt1);

watek1.start();

Watek2 obiekt2 = new Watek2(zasob, "Watek2 ",2);

Thread watek2 = new Thread(obiekt2);

watek2.start();

Watek2 obiekt3 = new Watek2(zasob, "Watek3 ",3);

Thread watek3 = new Thread(obiekt3);

watek3.start();

}

public static void main (String argd[]) { p6_3 p = new p6_3 ();

p.demo();

(7)

Porozumiewanie się wątków – metody wait, notify notifyAll

1) Przykład braku zachowania kolejności wykonania metody wyswietl przez 2 wątki import java.util.*;

import java.io.*;

import java.lang.*;

class Zasob2 { int num;

synchronized void wyswietl(String m, int n) { System.out.print("< "+m);

num = n;

System.out.println(num+">");

} }

class Watek3 implements Runnable { String s;

Zasob2 z;

int num;

public Watek3(Zasob2 zasob, String lan, int n) {s=lan; z= zasob; num=n; }

public void run() { while (true)

{ z.wyswietl(s, num++);

try

{ Thread.sleep(400);

} catch(Exception e) {}

}

} /*koniec run*/

} /*koniec Watek3*/

class Watek4 extends Watek3

{ public Watek4(Zasob2 zasob, String lan, int n) { super(zasob, lan, n);}

public void run() { while (true)

{ z.wyswietl(s,num);

try

{ Thread.sleep(1000);

} catch(Exception e) {}

}

} /*koniec run*/

} /*koniec Watek3*/

(8)

public class p6_4 { void demo()

{ Zasob2 zasob = new Zasob2();

Watek3 obiekt1 = new Watek3(zasob, "Watek1 ", 1);

Thread watek3 = new Thread(obiekt1);

watek3.start();

Watek4 obiekt2 = new Watek4(zasob, "Watek2 ", 2);

Thread watek4 = new Thread(obiekt2);

watek4.start();

}

public static void main (String argd[]) { p6_4 p = new p6_4 ();

p.demo();

} }

(9)

2) Przykład zachowania kolejności wykonania metody wyswietl przez 2 wątki

Dwie metody wyswietlx wzajemnie się informują, który wątek ostatnio ją wywoływał, stąd wywołanie metody wait() powoduje automatyczne wstrzymanie wykonania bieżącego wątku, jeśli dana metoda jako ostatnia była przez niego wykonana (testowanie składowej num: num==2 oznacza, że obiekt2 typu Watek6 ostatnio wykonał metodę wyswietl2, num>2 oznacza, że obiekt1 typu Watek5 jako ostatni wykonał metodę wyswietl1)

Obiekt2 typu Wątek6 wykonuje metodę wyswietl2, gdy num!=2 (czyli po Watek5) i ustawia w zmiennej num wartość 2 (Wątek6) i wywołuje metodę notify (lub notifyAll()), która wznawia wykonanie metody wyswietl1 dla obiektu1 typu Watek5

lub obiekt1 typu Watek5 wykonuje metodę wyswietl1, gdy wartość num==2 (czyli po Watek6) i ustawia w zmiennej num wartość bieżąca >2 (Wątek5) i wywołuje metodę notify (lub notifyAll()), która wznawia wykonanie metody wyswietl2 dla obiektu2 typu Watek6

import java.util.*;

import java.io.*;

import java.lang.*;

class Zasob3 { int num=3;

synchronized void wyswietl1(String m, int n) { if (num!=2)

try

{ wait();}

catch(InterruptedException e) {}

System.out.print("< "+m);

num = n;

System.out.println(num+">");

notify();

}

synchronized void wyswietl2( String m,int n ) { if (num == 2)

try

{ wait();}

catch(InterruptedException e) {}

System.out.print("< "+m);

num = n;

System.out.println(num+">");

notify();

} }

(10)

class Watek5 implements Runnable { String s;

Zasob3 z;

int num;

public Watek5(Zasob3 zasob, String lan, int n) { s = lan; z = zasob; num = n; }

public void run() { while (true)

{ z.wyswietl1(s, num++);

try

{ Thread.sleep(400);

} catch(Exception e) {}

} } }

class Watek6 extends Watek5

{ public Watek6(Zasob3 zasob, String lan, int n) { super(zasob, lan, n);}

public void run() { while (true)

{z.wyswietl2(s, num);

try

{ Thread.sleep(1000);

} catch(Exception e) {}

} } }

public class p6_5 { void demo()

{ Zasob3 zasob = new Zasob3();

Watek5 obiekt1 = new Watek5(zasob, "Watek1 ", 3);

Thread watek5 = new Thread(obiekt1); watek5.start();

Watek6 obiekt2 = new Watek6(zasob, "Watek2 ", 2);

Thread watek6 = new Thread(obiekt2); watek6.start();

}

public static void main (String argd[]) { p6_5 p = new p6_5 ();

p.demo(); } }

Podsumowanie: wywołanie metody wait przez dany obiekt bieżącego wątku powoduje automatyczne przerwanie wykonywania tego wątku i również automatyczne wznowienie go po wywołaniu metody notify (lub notifyAll) przez inną synchronizowaną metodę tego samego obiektu wykonaną przez inny wątek. W przypadku wielu przerwanych wątków uruchamiany jest ten, który pierwszy został przerwanym (notify);

jeśli wywołano notifyAll wątki są wznawiane według ich priorytetów.

(11)

3. Serializacja obiektów

Jest to mechanizm szeregowego zapisu do pliku związanego ze strumieniem wyjściowym ciągu bajtów po wykonaniu konwersji obiektu do postaci szeregowej i

Odczytu szeregowego ciągu bajtów z pliku związanego ze strumieniem wejściowym i dokonanie konwersji do postaci danej (obiektu, typu podstawowego: int, float itp.)

Mechanizm ten pozwala zachować całe obiekty w pliku po zakończeniu programu

Obiekty zapisywane do pliku muszą implementować pusty interfejs Serializable (obiekty są serializowane)

Obiekty z zagnieżdżonymi obiektami są w całości zapisywane do pliku pod warunkiem, że zagnieżdżone obiekty też są serializowane

Obiekty zagnieżdżone w serializowanych klasach mogą być pomijane przy zapisie do strumienia, jeśli to konieczne, za pomocą słowa kluczowego transient

Np. public transient String s = ”Kowalski”;

Procedura korzystania ze strumieni obiektowych powiązanych z plikami binarymi

Aby utworzyć plik:

1) Należy utworzyć obiekt (np. typu FileOutputStream), powiązany ze plikiem danych binarnych (np. "Wiadomosc.obj");

FileOutputStream plikobiektow = new FileOutputStream("Wiadomosc.obj");

2) W celu utworzenia wyjściowego strumienia obiektowego powiązanego z obiektem związanym ze źródłem danych np. typu FileOutputStream należy utworzyć obiekt klasy ObjectOutputStream

ObjectOutputStream strumienobiektow=new ObjectOutputStream (plikobiektow);

3) obiekty dziedziczące po Object i implementujace interfejs Serializable są zapisywane do pliku w postaci szeregowej za pomocą metody

void writeObject(Object ob)

Dalej podano część metod strumienia obiektów do zapisu różnych danych do pliku:

4) Pojedyncze bajty mogą być zapisywane do pliku za pomocą metody:

void write(int b)

5) Całe ciągi bajtów mogą być zapisywane do pliku za pomocą metody:

void write(byte[]cbuf) – metoda, która czyta zawartosc tablicy bajtów i zapisuje ją do strumienia (buf.length bajtów)

(12)

6) Całe ciągi bajtów mogą być zapisywane do pliku za pomocą metody:

void write(byte[] cbuf, int off, int len) – metoda, która czyta z tablicy cbuf od indeksu off liczbę len bajtów i zapisuje do pliku

7) void writeBoolean(boolean v) – zapisuje do pliku 1-bajtową wartość 8) void writeByte(int v) – zapisuje do pliku 1-bajtową wartość

9) void writeChar(int v) – zapisuje znak jako 2-bajtową wartość – pierwszy zapisywany jest starszy bajt (Unicode)

10) void writeDouble(double v) – zapisuje 8-bajtową wartość do pliku 11) voidwriteFloat(float v) – zapisuje 4-bajtową wartość do pliku

12) voidwriteInt(int v) – zapisuje 4 bajty do pliku

13) void writeLong(long v) – zapisuje 8 bajtów do pliku 14) void writeShort(int v) – zapisuje 2 bajty do pliku Aby odczytać plik:

1) Należy utworzyć obiekt (np. typu FileInputStream), powiązany ze plikiem danych binarnych (np. "Wiadomosc.obj");

FileInputStream plik = new FileInputStream(("Wiadomosc.obj");

2) W celu odczytu obiektow pochodzących z obiektu powiązanego ze źródłem danych np. typu FileInputStream należy utworzyć obiekt klasy ObjectInputStream

ObjectInputStream bufor = new ObjectInputStream (plik);

3) Odczytu obiektów z strumienia należy wykonać za pomocą metody Object readObject()

Dalej podano niektóre metody strumienia obiektów do odczytu danych z pliku:

4) Pojedyncze bajty mogą być odczytywane z pliku za pomocą metody:

int read()

5) Całe ciągi bajtów mogą być odczytywane z pliku za pomocą metody:

int read(byte[] cbuf, int off, int len) – metoda, która czyta plik i zapisuje do tablicy cbuf od indeksu off liczbę len bajtów i zwraca przez return liczbę faktycznie odczytanych bajtów

6) boolean readBoolean() – czyta z pliku 1 bajt i wraca wartość true lub false 7) byte readByte() – czyta z pliku 1 bajt i zwraca wartość typu byte

8) char readChar() – czyta 1 znak (2 bajty ) i zwraca 1 znak

(13)

10) float readFloat() – czyta 4 bajtów z pliku i zwraca wartość float 11) int readInt() – czyta 4 bajty z pliku i zwraca wartość typu int

12) long readLong() – czyta 8 bajtów z pliku i zwraca wartość typu long 13) short readShort() – czyta 2 bajty z pliku i zwraca wartość typu short 14) Po zapisie i odczycie strumień obiektów należy zamknąć metodą close() import java.io.*;

import java.util.*;

class Wiadomosc implements Serializable { String dane;

Date data;

static String weString()

{ InputStreamReader wejscie = new InputStreamReader( System.in );

BufferedReader bufor = new BufferedReader( wejscie );

System.out.print("Podaj wiadomosc: ");

try

{ return bufor.readLine(); } catch (IOException e)

{ System.err.println("Blad IO String");

return ""; } }

public void zapiszWiadomosc() { data = new Date();

System.out.println(data);

dane =weString();}

public void odczytajWiadomosc() { System.out.println(data);

System.out.println(dane);}

}

(14)

public class p6_6 {

static void Zapiszobiektydopliku()

{ Wiadomosc wiadomosc = new Wiadomosc();

wiadomosc.zapiszWiadomosc();

try

{ FileOutputStream plikobiektow = new FileOutputStream ("Wiadomosc.obj");

ObjectOutputStream strumienobiektow =

new ObjectOutputStream (plikobiektow);

strumienobiektow.writeObject(wiadomosc);

strumienobiektow.close();

System.out.println("Obiekt wiadomosc zostal zapisany do pliku");

} catch (IOException e)

{ System.out.println ("Blad zapisu pliku obiektowego"+e);}

}

static void Odczytajobiektyzpliku() { Wiadomosc wiadomosc = null;

try

{ FileInputStream plikobiektow = new FileInputStream ("Wiadomosc.obj");

ObjectInputStream strumienobiektow =

new ObjectInputStream (plikobiektow);

wiadomosc = (Wiadomosc)strumienobiektow.readObject();

System.out.println("Obiekt wiadomosc zostal odczytany z pliku");

if (wiadomosc != null)

wiadomosc.odczytajWiadomosc();

strumienobiektow.close();

} catch (Exception e)

{ System.out.println ("Blad odczytu pliku obiektowego"+e); } }

public static void main(String[] args) { Zapiszobiektydopliku();

Odczytajobiektyzpliku();

} }

(15)

4. Obiekty sieciowe

Komputery w sieci Internet komunikują się ze sobą poprzez:

TCP (Transport Control Protocol)

User Datagram Protocol (UDP).

TCP/IP (IP - Iternet Protocol) jest warstwowym zestawem protokołów i odpowiada siedmiowarstwowemu modelowi ISO/OSI (Open Systems Interconnection)

Warstwa ISO/OSI TCP/IP Uwagi

7 Aplikacji SMTP, HTTP, FTP, RPC, TELNET

Udostępnia procesom aplikacyjnym APs (Application Processes) dostęp do połączenia OSI, czyli:

Zasoby przetwarzające informację

Zasoby komunikacyjne

6 Prezentacji

Ujednolicenie formatu przesyłanych danych (opis struktur danych-syntaktyka oraz sposobem kodowania – reprezentacją bitową w czasie transferu)

5 Sesji DNS, LDAP

Jest odpowiedzialna za zapewnienie uporządkowanej wymiany danych miedzy segmentami warstwy prezentacji i korzysta z usług warstwy transportowej

4 Transportowa TCP/UDP Zapewnia poprawność przesyłanych danych między systemami końcowymi

3 Sieciowa IP (Internet),

ICMP Nadzorowanie wiadomości przesyłanych miedzy dwoma komputerami poprzez sieć

2 Łącza danych

ARP, RARP, LLC 802.2, Ethernet 802.3

Ustanawianie połączenia, nadzór nad bezbłędnym transferem bitów

1 Fizyczna Przesyłanie strumienia bitów za pomocą medium fizycznego

Protokół HTTP zastosowany do czytania zasobów www wskazanych za pomocą URL (Uniform Resource Locator) czyli danych z pliku w formacie HTML (HyperText Markup Language), musi korzystać z niezawodnego kanału komunikacji punkt- punkt, jaki zapewnia protokół połączeniowy TCP, gdyż otrzymywane dane muszą wystąpić w tej samej kolejności, w której były przesyłane,

Protokół UDP, bezpołączeniowy protokół przesyłania niezależnych pakietów danych (datagramów) pomiędzy dwoma aplikacjami w sieci, może być wykorzystany do programów typu ping itp. – nie ma pewności, czy dany datagram nieuszkodzony dotrze do określonego komputera oraz czy komputer czeka nadal na odpowiedź.

(16)

Komputery w sieci są identyfikowane przez 32-bitowe adresy IP, a procesy działające na tych komputerach są identyfikowane poprzez 16-bitowe numery portów (port reprezentuje kolejkę danych, które mają być dostarczane do danego procesu wykonującego pewien program). Program wykorzystujący protokół HTTP ma przydzielony domyślnie port o numerze 80.

Programy odbierają lub wysyłają dane poprzez związane z numerami portów gniazda (sockets). Gniazdo jest definiowane przez warstwę transportową modelu ISO/OSI. Gniazdo jest końcowym punktem połączenia między programami wykonywanymi na komputerach sieciowych w systemie klient-serwer. Gniazdo pełni rolę interfejsu programowego umożliwiającego aplikacjom dostęp do protokołów TCP i UDP i wymianę danych poprzez sieć pracującą pod kontrolą protokołów TCP/IP.

Program serwera wykonywany na konkretnej maszynie ma przypisane do pewnego numeru portu gniazdo (typu ServerSocket), poprzez które "nasłuchuje" za pomocą metody accept klasy ServerSocket ewentualnego żądania nawiązania łączności przez klienta (gniazdo typu Socket). Jest to możliwe, jeśli klient (program klienta) zna adres komputera sieciowego, na którym jest wykonywany serwer oraz numer portu, do którego serwer jest dołączony i utworzy odpowiednie gniazdo typu Socket (związane z numerem portu i adresem serwera), poprzez które może prowadzić komunikację z serwerem. Serwer akceptuje połączenie, a następnie tworzy dla klienta nowe gniazdo (typu Socket) ze zmiennymi wskazującymi na obiekty klas typu InputStream i OutputStream.

W pakiecie java.net klasy Socket i ServerSocket służą do komunikacji w oparciu o protokół połączeniowy TCP

W pakiecie java.net klasy DatagramSocket, DatagramPacket oraz MulticastSocket są wykorzystywane do komunikacji UDP.

W pakiecie java.net klasy klasy: URL oraz URLConnection i URLEncoder służą do nawiązania łączności z zasobami www.

Komunikacja w sieci za pomocą klas z pakietu java.net, opiera się między innymi na implementacji gniazd.

import java.net.*; //ten program należy uruchomić jako pierwszy

import java.io.*;

public class serwer2 implements Runnable {

private int sPort;

private ServerSocket serwer;

private Socket s;

private ObjectOutputStream output;

private ObjectInputStream input;

private String host,m,m1;

public serwer2(int port_, String host_)

(17)

host=host_;

try

{ serwer = new ServerSocket(sPort);

} catch(IOException e)

{ System.out.println(e); } } public void run()

{ System.out.println("Serwer startuje na hoscie "+host);

while (true) { try {try

{ s = serwer.accept();

} catch (IOException e)

{ System.out.println("Nie mozna polaczyc sie z klientem "+e);

System.exit(1); } //przerwanie pracy serwera nie jest zalecane w praktyce

output = new ObjectOutputStream(s.getOutputStream());

output.flush();

input = new ObjectInputStream(s.getInputStream());

while(true)

{ m=(String) input.readObject();

System.out.println("Odebrano wiadomosc od klienta: "+ m +"\n");

if (m.equals("czesc")) break;

m1=weString("Podaj wiadomosc dla klienta: ");

output.writeObject((Object) m1);

}

input.close();

output.close();

s.close();

} catch (Exception e)

{System.out.println("Wyjatek serwera "+e);}

}}

static String weString(String menu)

{ InputStreamReader wejscie = new InputStreamReader( System.in );

BufferedReader bufor = new BufferedReader( wejscie );

System.out.print(menu);

try

{ return bufor.readLine(); } catch (IOException e)

{ System.err.println("Blad IO String");

return ""; } }

public static void main(String args[]) throws Exception

{ //klasa InetAddress pobiera adres IP i na jego podstawie tworzy adres internetowy

(18)

String host_ = InetAddress.getLocalHost().getHostName();

int Port = 5000;

serwer2 s2 = new serwer2(Port, host_);

Thread t = new Thread(s2);

t.start();

} }

import java.net.*; //ten program należy uruchomić jako drugi

import java.io.*;

public class klient2 implements Runnable { private int port;

private Socket s;

private ObjectOutputStream output;

private ObjectInputStream input;

private String host, m, m1;

klient2(String host_, int port_) { host = host_;

port = port_; } public void run() { try

{ s = new Socket (host,port);

input = new ObjectInputStream(s.getInputStream());

output = new ObjectOutputStream(s.getOutputStream());

output.flush();

System.out.println("Klient startuje na hoscie "+

InetAddress.getLocalHost().getHostName());

m = weString("Przedstaw sie: ");

output.writeObject(m);

do

{ m=(String) input.readObject();

System.out.println("\n"+"Dane odebrane od serwera: "+m);

m1=weString("Podaj wiadomosc dla serwera: ");

output.writeObject(m1);

} while(!m1.equals("czesc"));

s.close();

output.close();

input.close();

} catch (Exception e)

{ System.out.println("Wyjatek klienta "+e); } }

static String weString(String menu)

(19)

BufferedReader bufor = new BufferedReader( wejscie );

System.out.print(menu);

try

{return bufor.readLine(); } catch (IOException e)

{System.err.println("Blad IO String");

return ""; } }

public static void main(String args[]) throws Exception { //tutaj przyjęto, że serwer jest na tym samym hoście, co klient

String s = InetAddress.getLocalHost().getHostName();

klient2 k2= new klient2(s,5000);

Thread t = new Thread(k2);

t.start();

} }

Cytaty

Powiązane dokumenty

Wszystkie teksty dostępne są w punkcie ksero &#34;U

a) Program ProstyAplet2.class uruchomiony jako aplet w przeglądarce (appletviewer) za pomocą pliku typu html.. Zofia Kruczkiewicz, Programowanie aplikacji}. b) Ten sam

• Wykonanie aplikacji klienta, który po otrzymaniu referencji do obiektu zdalnego otrzymuje gniazdo do komunikacji z przydzielonym gniazdem po stronie serwera, zawierającego

Zapobieganie dalszemu używaniu substancji psychoaktywnych przez ucznia, poprzez podejmowanie przez szkołę działań interwencyjnych z udziałem rodziców i nastawionych na

Liczba 0x000000FF reprezentuje intensywny kolor czerwony (red) bez domieszki pozostałych dwóch barw, podobnie liczba 0x0000FF00 reprezentuje intensywny kolor zielony (green),

Prawo wykonywania pliku pozwala na uruchomienie pliku wykonalnego, a w przypadku katalogu oznacza prawo dostępu do plików wewnątrz katalogu.. Minimalne prawa wymagane do

Na rynku krajowym proponujemy współpracę organizacjom sektorowym ryn- ku szpitalnego, takim jak Ogólnopolskie Stowarzysze- nie Niepublicznych Szpitali Samorządowych, Stowa-

Warto o emocjach rozmawiać, nazywać je, jeśli jest Ci trudno o nich mówić możesz wyrazić je poprzez rysowanie lub lepienie z plasteliny. Czasami warto też poczekać, aż