→ Slide 1

Programowanie zorientowane sieciowo

→ Slide 2

Gniazda i HTTP

Programowanie oparte na gniazdach (sockets)

Przetwarzanie adresów URL (HTTP)

→ Slide 3

Protokoły TCP i UDP

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

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

→ Slide 4

Adresacja IP i porty

→ Slide 5

Java i sieć - podstawowe pakiety

→ Slide 6

Najważniejsze klasy i interfejsy

→ Slide 7

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());
→ Slide 8

Komunikacja TCP oparta na gniazdach (sockets)

→ Slide 9

Komunikacja TCP - Serwer

ServerSocket tworzy gniazdo serwera TCP. Konstruktorzy:

Kluczowe metody:

→ Slide 10

Komunikacja TCP - Klient

Socket tworzy gniazdo klienta TCP

Metody:

→ Slide 11

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);
→ Slide 12

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);
}
→ Slide 13

Gniazda bezpołączeniowe (UDP)

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

→ Slide 14

Gniazda bezpołączeniowe (UDP)

DatagramSocket tworzy gniazdo UDP:

DatagramPacket - pakiet danych UDP:

→ Slide 15

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);
}
→ Slide 16

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);
}
→ Slide 17

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
→ Slide 18

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);
}
→ Slide 19

URLConnection - najważniejsze metody

→ Slide 20

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:

→ Slide 21

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());
→ Slide 22

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();
→ Slide 23

Dokumentacja

→ Slide 24

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: