Spis treści

REVEAL theme=simple&disableLayout=0&transition=none&controls=1&show_progress_bar=1&build_all_lists=0&show_image_borders=0&horizontal_slide_level=2&enlarge_vertical_slide_headers=0&show_slide_details=1&open_in_new_window=1&size=1024×768

<html> <style type=„text/css”> p { text-align: left; } .reveal { font-size: 30px; } .reveal section { width: 96%; margin: 0 auto; } .reveal .slides { width: 60% !important; } .reveal ul, .reveal ol { margin-left: 1.5em; } .reveal pre code {

height: 100%;
max-height: 100%;
box-sizing: border-box;

} </style> </html>

Programowanie zorientowane sieciowo

Gniazda i HTTP

Programowanie oparte na gniazdach (sockets)

Przetwarzanie adresów URL (HTTP)

Protokoły TCP i UDP

TCP - połączeniowy, niezawodny, strumieniowy, kontrola kolejności

UDP - bezpołączeniowy, szybki, datagramowy, brak retransmisji


Adresacja IP i porty

Java i sieć - podstawowe pakiety


Najważniejsze klasy i interfejsy

InetAddress

InetAddress - reprezentuje adres IP i nazwę hosta. Kluczowe metody:

InetAddress local = InetAddress.getLocalHost();
System.out.println(local.getHostName());
System.out.println(local.getHostAddress());
 
InetAddress google = InetAddress.getByName("www.google.com");
System.out.println(google.getHostAddress());

Komunikacja TCP oparta na gniazdach (sockets)

Komunikacja TCP - Serwer

ServerSocket tworzy gniazdo serwera TCP. Konstruktorzy:

Kluczowe metody:

Komunikacja TCP - Klient

Socket tworzy gniazdo klienta TCP

Metody:

Przykład: prosty serwer TCP

ServerSocket server = new ServerSocket(5000);
Socket client = server.accept();
 
// strumień wejściowy (tekstowy) do komunikacji z klientem
BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream()));
String line = in.readLine();
 
// strumień wyjściowy (tekstowy) do komunikacji z klientem
PrintWriter out = new PrintWriter(client.getOutputStream(), true); 
out.println("ECHO: " + line);

Przykład: prosty klient TCP

try (Socket socket = new Socket("127.0.0.1", 5000);
     BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
     PrintWriter out = new PrintWriter(socket.getOutputStream(), true)) {
 
    out.println("ping");
 
    String response = in.readLine();
    System.out.println("Odpowiedz z serwera: " + response);
}

Gniazda bezpołączeniowe (UDP)

UDP stosujemy, gdy nie jest potrzebna niezawodność i kolejność, a liczy się szybkość i niskie opóźnienia.

Gniazda bezpołączeniowe (UDP)

DatagramSocket tworzy gniazdo UDP:

DatagramPacket - pakiet danych UDP:

Przykład: UDP nadawca

try (DatagramSocket sender = new DatagramSocket()) {
    byte[] data = "hello udp".getBytes(StandardCharsets.UTF_8);
    DatagramPacket packet = new DatagramPacket(
        data,
        data.length,
        InetAddress.getByName("127.0.0.1"),
        6000
    );
    sender.send(packet);
}

Przykład: UDP odbiorca

try (DatagramSocket receiver = new DatagramSocket(6000)) {
    byte[] buffer = new byte[1024];
    DatagramPacket packet = new DatagramPacket(buffer, buffer.length);
    receiver.receive(packet);
    String msg = new String(packet.getData(), 0, packet.getLength(), StandardCharsets.UTF_8);
    System.out.println("UDP: " + msg);
}

URL, URI, URLConnection

URL url = new URL("https://example.com/api/users?page=1");
System.out.println(url.getProtocol()); // https
System.out.println(url.getHost());     // example.com
System.out.println(url.getPath());     // /api/users
System.out.println(url.getQuery());    // page=1
System.out.println(url.getPort());     // -1 (domyślny port)
System.out.println(url.getDefaultPort()); // 443
System.out.println(url.getFile());      // /api/users?page=1
System.out.println(url.getRef());       // null (część po #)
System.out.println(url.getAuthority()); // example.com

URLConnection - pobieranie danych

URL url = new URL("https://api.github.com");
URLConnection conn = url.openConnection();
try (InputStream in = conn.getInputStream()) {
    String content = new String(in.readAllBytes(), StandardCharsets.UTF_8);
    System.out.println(content);
}

URLConnection - najważniejsze metody

HttpURLConnection - prosty klient HTTP

HttpURLConnection to podklasa URLConnection, która dodaje funkcje specyficzne dla protokołu HTTP, takie jak obsługa metod HTTP, nagłówków, kodów statusu i innych aspektów komunikacji HTTP.

Metody:

Nowoczesny HTTP Client (Java 11+)

java.net.http to nowoczesny klient HTTP wprowadzony w Javie 11, który oferuje bardziej elastyczne i wydajne API do pracy z protokołem HTTP/1.1 i HTTP/2

HttpClient client = HttpClient.newBuilder()
    .connectTimeout(Duration.ofSeconds(5))
    .build();
 
HttpRequest request = HttpRequest.newBuilder()
    .uri(URI.create("https://api.github.com"))
    .header("Accept", "application/json")
    .GET()
    .build();
 
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.statusCode());
System.out.println(response.body());

Prosty serwer HTTP w Java

HttpServer server = HttpServer.create(new InetSocketAddress(8080), 0);
server.createContext("/hello", exchange -> {
    String body = "{\"message\":\"hello\"}";
    exchange.getResponseHeaders().add("Content-Type", "application/json; charset=utf-8");
    exchange.sendResponseHeaders(200, body.getBytes(StandardCharsets.UTF_8).length);
    try (OutputStream os = exchange.getResponseBody()) {
        os.write(body.getBytes(StandardCharsets.UTF_8));
    }
});
server.start();

Dokumentacja

Zadanie 9: Komunikator

Stwórz prosty komunikator, który pozwala na bezpośrednią wymianę wiadomości tekstowych między dwiema aplikacjami korzystając z protokołu TCP.

Opcjonalnie:

Przykładowe rozwiązanie: