gniazda komunikacji sieciowej w języku java

25
1 Gniazda komunikacji sieciowej w języku Java Kamila Jabłońska Aleksandra Kosecka

Upload: brody-gates

Post on 02-Jan-2016

50 views

Category:

Documents


1 download

DESCRIPTION

Gniazda komunikacji sieciowej w języku Java. Kamila Jabłońska Aleksandra Kosecka. Gniazda w Javie. GNIAZDO jest punktem końcowym dwukierunkowej komunikacji pomiędzy odległymi procesami. Gniazda (strumieniowe lub datagramowe). klienckie ( ang. client socket ). serwerowe - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: Gniazda komunikacji sieciowej w języku Java

1

Gniazda komunikacji sieciowej w języku Java

Kamila Jabłońska Aleksandra Kosecka

Page 2: Gniazda komunikacji sieciowej w języku Java

2

Gniazda w Javie

GNIAZDO jest punktem końcowym dwukierunkowej komunikacji pomiędzy odległymi procesami.

Gniazda(strumieniowe lub datagramowe)

klienckie

(ang. client socket)

serwerowe

(ang. server socket)

Page 3: Gniazda komunikacji sieciowej w języku Java

3

Pakiet java.net

Klasy do obsługi komunikacji sieciowej:

Page 4: Gniazda komunikacji sieciowej w języku Java

4

klasa Socket dla gniazda komunikacji strumieniowej peer-to-peer

klasa ServerSocket dla gniazda nasłuchu po stronie serwera

klasa java.net.DatagramSocket dla gniazda komunikacji pakietowej

Pakiet java.net definiuje kilka klas do obsługi gniazd:

Page 5: Gniazda komunikacji sieciowej w języku Java

5

Adres gniazda

Adres gniazda składa się z: adresu komputera (hosta) numeru portu komunikacji sieciowej

Adres komputera może być w postaci: nazwy tekstowej zgodnej z wymogami odpowiedniego

serwisu nazewniczego adresu IP w postaci tekstowej lub numerycznej

Page 6: Gniazda komunikacji sieciowej w języku Java

6

Klasy do reprezentacji adresów

Page 7: Gniazda komunikacji sieciowej w języku Java

7

Metody klasy InetAddress

static InetAddress getByAddress(byte[] addr) — tworzy obiekt na podstawie adresu IP w postaci binarnej,

static InetAddress getByAddress(String host,byte[]addr) —

tworzy obiekt na podstawie nazwy hosta i binarnego adresu IP (bez odwoływania się do serwisu nazw)

static InetAddress getByName(String host) —tworzy obiekt na podstawie nazwy hosta,

static InetAddress getLocalHost() —

tworzy obiekt reprezentujący adres lokalny hosta.

Page 8: Gniazda komunikacji sieciowej w języku Java

8

Klasy SocketAdress i

InetSocketAdress

Klasa SocketAdress jest klasą abstrakcyjną, reprezentującą ogólny adres gniazda (nie związany z żadnym protokołem).

Page 9: Gniazda komunikacji sieciowej w języku Java

9

Klasy SocketAdress i InetSocketAdress

Adres do obiektu klasy InetSocketAddress przypisywany jest tylko w jednym z konstruktorów:

InetSocketAddress(InetAddress addr, int port)

InetSocketAddress(int port)

InetSocketAddress(String hostname, int port)

Page 10: Gniazda komunikacji sieciowej w języku Java

10

Klasy do reprezentacji gniazd

Page 11: Gniazda komunikacji sieciowej w języku Java

11

Konstruktory klasy Socket Socket() — utworzenie gniazda Socket(InetAddress address, int port) — utworzenie gniazda oraz próba nawiązania połączenia z serwerem Socket(InetAddress address, int port,InetAddress

localAddr, int localPort) —utworzenie gniazda z dowiązaniem lokalnym oraz próba nawiązania połączenia z serwerem

Socket(String host, int port) — utworzenie gniazda oraz próba nawiązania połączenia z serwerem na maszynie o podanej nazwie

Socket(String host, int port, InetAddress localAddr, int localPort) — utworzenie gniazda z dowiązaniem lokalnym oraz próba nawiązania połączenia z serwerem na maszynie o podanej nazwie

Page 12: Gniazda komunikacji sieciowej w języku Java

12

Tworzenie gniazda klientaimport java.net.*;import java.io.*;

public class Gniazdo{

public static void main(String args[]){

try{Socket socket = new Socket(„kamola.pl",

80);//konstruktor}catch(UnknownHostException e){

System.out.println("Nieznany host.");}catch(IOException e){

System.out.println(e);}

}}

Page 13: Gniazda komunikacji sieciowej w języku Java

13

Metody klasy Socket void bind(SocketAddress bindpoint) —

przyporządkowanie do lokalnego adresu (nadanie nazwy) void close() — zamknięcie gniazda void connect(SocketAddress endpoint) — próba

nawiązania połączenia z serwerem void connect(SocketAddress endpoint, int

timeout) —

próba nawiązania połączenia z serwerem w określonym czasie

Page 14: Gniazda komunikacji sieciowej w języku Java

14

Nawiązanie połączenia

Socket socket;

InetSocketAddress address;

try {

socket = new Socket();

address = new InetSocketAddress("localhost", 6000);

socket.connect(address);

System.out.println("Polaczenie nawiazane");

}

catch (Exception e) {

System.err.println( e.getMessage() );

e.printStackTrace();

}

Page 15: Gniazda komunikacji sieciowej w języku Java

15

Klasa ServerSocketServerSocket() — utworzenie gniazda bez nadanej nazwy (bez

dowiązania)ServerSocket(int port) — utworzenie gniazda zprzypisanym domyślnym adresem IP oraz podanym numeremportuServerSocket(int port, int backlog) — utworzeniegniazda na podanym numerze portu z określeniemmaksymalnej długości kolejki oczekujących żądańServerSocket(int port, int backlog,InetAddress bindAddr)— utworzenie gniazda podobniejak wyżej z dodatkowym podaniem adresu IP, jaki ma byćprzypisany do gniazda

Page 16: Gniazda komunikacji sieciowej w języku Java

16

Metody klasy ServerSocket

Socket accept() — oczekiwanie na zgłoszenie klientów lub

przyjęcie wcześniej zarejestrowanego zgłoszenia

void bind(SocketAddress endpoint) —

jawne przypisanie adresu (nadanie nazwy)

void bind(SocketAddress endpoint, int backlog)

jawne przypisanie nazwy i określenie maksymalnej długości

kolejki oczekujących żądań

void close() — zamknięcie z gniazda

Page 17: Gniazda komunikacji sieciowej w języku Java

17

Przykładowy program serwera

import java.net.*;

import java.io.*;

public class Server

{

public static void main(String args[]) throws IOException {

ServerSocket server_socket = null;

InetSocketAddress address;

Socket socket;

Page 18: Gniazda komunikacji sieciowej w języku Java

18

Przykładowy program serweratry {

server_socket = new ServerSocket();address = new InetSocketAddress(6000);server_socket.bind(address);System.out.println("Serwer nasluchuje...");socket = server_socket.accept();System.out.println("Zglosil sie klient");System.err.println("Podlaczyl sie z adresu: " + socket.getInetAddress() );

}catch (Exception e) {

System.err.println( e.getMessage() );e.printStackTrace();

}server_socket.close(); }}

Page 19: Gniazda komunikacji sieciowej w języku Java

19

Przykładowy program klientaimport java.net.*;import java.io.*;public class Client{

public static void main(String args[]){

Socket socket = null;try{

socket = new Socket("127.0.0.1", 6000); System.err.println("Nawiazano polaczenie!"); System.out.println(socket);

}catch(UnknownHostException e){

System.out.println("Nieznany host");}catch(IOException e){

System.out.println(e);}

}}

Page 20: Gniazda komunikacji sieciowej w języku Java

20

Przykład wątku serwera współbieżnegopublic class ServiceThread extends java.lang.Thread {

private Socket socket;

private int number;

public ServiceThread(Socket s, int n){

socket = s;

number = n;

}

public void run() {

...

}

}

Page 21: Gniazda komunikacji sieciowej w języku Java

21

Współbieżna obsługa wielu połączeńServerSocket server_socket;Socket socket;int number = 0;try {

server_socket = new ServerSocket(6000);while (true) {

socket = server_socket.accept();System.out.println("Zglosil sie klient");number++;new ServiceThread( socket, number ).start();

}}catch (Exception e) {

System.err.println( e.getMessage() );e.printStackTrace();

}

Page 22: Gniazda komunikacji sieciowej w języku Java

22

Przekazywanie danych przez gniazdo strumieniowe

W trybie połączeniowym gniazdo udostępnia strumień

wejściowy oraz strumień wyjściowy, za pośrednictwem których można odpowiednio odbierać i wysyłać dane. Referencje do strumieni zwracają następujące metody obiektu klasy Socket:

OutputStream getOutputStream() — referencja do strumienia wyjściowego, przez który wysyłane są dane,

IntputStream getIntputStream() — referencja do strumienia wejściowego, przez który odbierane są dane.

Page 23: Gniazda komunikacji sieciowej w języku Java

23

Wysyłanie danych przez gniazdo strumieniowe

try {

DataOutputStream out;

OutputStream out_sock;

out_sock = socket.getOutputStream();

out = new DataOutputStream ( out_sock );

out.writeInt(87);

}

catch (IOException e) {

System.err.println( e.getMessage());

e.printStackTrace();

}

Page 24: Gniazda komunikacji sieciowej w języku Java

24

Filtry

Filtry są szczególnym rodzajem strumieni.

Umożliwiają one łączenie strumieni i tworzenie złożonych potoków dzięki specyficznym konstruktorom:

FilterInputStream(InputStream in) FilterOutputStream(OutputStream out)

Page 25: Gniazda komunikacji sieciowej w języku Java

25

Buforowanie strumieni Filtry BufferedInputStream i BufferedOutputStream

umożliwiają buforowanie danych (strumienia bajtów).

Wielkość bufora można ustalić w czasie tworzenia obiektu

z pomocą konstruktora:

BufferedInputStream(InputStream in, int size)Dane z bufora są przekazywane do strumienia wyjściowego

w wyniku zapełnienia bufora lub wywołania metody flush()

obiektu klasyFilterOutputStream (lub pochodnej).