Working with Networking

1. Using URL and URI Classes

ClassUse
URIParse/manipulate identifier (preferred)
URLOpen connection to resource
Converturi.toURL() / url.toURI()
ComponentsgetScheme/getHost/getPort/getPath/getQuery

2. Making HTTP Requests with HttpClient JAVA 11+

Example: Sync GET

HttpClient client = HttpClient.newBuilder()
    .version(HttpClient.Version.HTTP_2)
    .connectTimeout(Duration.ofSeconds(10))
    .followRedirects(HttpClient.Redirect.NORMAL)
    .build();

HttpRequest req = HttpRequest.newBuilder()
    .uri(URI.create("https://api.example.com/users"))
    .header("Accept", "application/json")
    .timeout(Duration.ofSeconds(5))
    .GET()
    .build();

HttpResponse<String> res = client.send(req, BodyHandlers.ofString());
System.out.println(res.statusCode() + ": " + res.body());
ClassPurpose
HttpClientReusable, thread-safe
HttpRequestImmutable request
HttpResponseGeneric over body type
BodyHandlersString, byte[], file, stream, discard

3. Sending GET Requests

StepDetail
Default methodGET (just call .GET())
Query paramsAppend manually to URI
Headers.header(k,v) / .headers(k1,v1,k2,v2)

4. Sending POST Requests

Example: POST JSON

HttpRequest req = HttpRequest.newBuilder()
    .uri(URI.create("https://api.example.com/users"))
    .header("Content-Type", "application/json")
    .POST(BodyPublishers.ofString("{\"name\":\"Alice\"}"))
    .build();
BodyPublisherSource
ofString(s)String body
ofByteArray(b)Bytes
ofFile(p)File
ofInputStream(supplier)Stream
noBody()Empty

5. Handling HTTP Responses

MethodReturns
statusCode()int
body()Generic T
headers()HttpHeaders
uri()Final URI (after redirects)
version()HTTP/1.1 or HTTP/2

6. Making Async HTTP Requests

Example: Async

CompletableFuture<String> future = client
    .sendAsync(req, BodyHandlers.ofString())
    .thenApply(HttpResponse::body)
    .exceptionally(ex -> "ERROR: " + ex.getMessage());
MethodReturns
sendAsync(req, handler)CompletableFuture<HttpResponse<T>>
CompositionthenApply / thenCompose / thenAccept

7. Setting Request Headers

MethodDetail
.header(name, value)Add header
.setHeader(name, value)Replace
.headers(k1,v1,k2,v2,...)Bulk add
Restricted headersConnection, Content-Length, Host, etc. set by client

8. Working with Sockets

ClassUse
SocketTCP client
ServerSocketTCP server (accept)
DatagramSocketUDP send/receive
StreamsgetInputStream / getOutputStream

9. Implementing TCP Client/Server

Example: Echo server

try (ServerSocket server = new ServerSocket(8080)) {
    while (true) {
        try (Socket s = server.accept();
             var in = new BufferedReader(new InputStreamReader(s.getInputStream()));
             var out = new PrintWriter(s.getOutputStream(), true)) {
            String line;
            while ((line = in.readLine()) != null) out.println(line);
        }
    }
}
StepDetail
Servernew ServerSocket(port)accept()
Clientnew Socket(host, port)
ConcurrencyThread per connection or virtual threads

10. Implementing UDP Communication

StepDetail
Createnew DatagramSocket(port)
Sendsend(DatagramPacket)
Receivereceive(DatagramPacket) (blocks)
NoteNo connection guarantees, best-effort

11. Handling Network Errors

ExceptionCause
UnknownHostExceptionDNS failure
ConnectExceptionRefused connection
SocketTimeoutExceptionRead/connect timeout
HttpTimeoutExceptionHttpClient timeout

12. Setting Timeouts

SettingMethod
Connect timeoutHttpClient.Builder.connectTimeout(d)
Request timeoutHttpRequest.Builder.timeout(d)
Socket SO_TIMEOUTsocket.setSoTimeout(ms)

13. Working with WebSockets

Example: WebSocket client

WebSocket ws = HttpClient.newHttpClient().newWebSocketBuilder()
    .buildAsync(URI.create("wss://example.com/socket"), new WebSocket.Listener() {
        public CompletionStage<?> onText(WebSocket ws, CharSequence data, boolean last) {
            System.out.println("Got: " + data);
            return null;
        }
    })
    .join();
ws.sendText("Hello", true);
APIDetail
BuilderHttpClient.newWebSocketBuilder()
Listener callbacksonOpen/onText/onBinary/onClose/onError
SendsendText/sendBinary/sendPing/sendClose