Working with Network Programming

1. Using HttpClient API

Builder OptionUse
version(HTTP_2)HTTP/2 default
followRedirects(NORMAL)Auto-follow
connectTimeout(d)TCP connect
executor(exec)Async pool
cookieHandler(h)Cookie store
authenticator(a)Basic/Digest
proxy(ProxySelector)Proxy

2. Sending HTTP Requests

MethodBody Publisher
GETBodyPublishers.noBody()
POSTBodyPublishers.ofString(json)
FileBodyPublishers.ofFile(path)
BytesBodyPublishers.ofByteArray(b)
ReactiveBodyPublishers.fromPublisher(...)

Example: POST JSON

HttpClient client = HttpClient.newHttpClient();
HttpRequest req = HttpRequest.newBuilder(URI.create("https://api.example.com/users"))
    .header("Content-Type", "application/json")
    .POST(BodyPublishers.ofString(json))
    .build();
HttpResponse<String> res = client.send(req, BodyHandlers.ofString());

3. Handling HTTP Responses

BodyHandlerResult
ofString()String
ofByteArray()byte[]
ofFile(path)Path
ofLines()Stream<String>
discarding()Drop body

4. Using Async HTTP Requests

Example: Async with chain

client.sendAsync(req, BodyHandlers.ofString())
    .thenApply(HttpResponse::body)
    .thenAccept(System.out::println);
APIReturns
sendAsync(req, handler)CompletableFuture<HttpResponse>
sendAsync(req, h, pushHandler)HTTP/2 push

5. Configuring HttpClient (timeouts, redirects, authenticators)

SettingAPI
Request timeoutHttpRequest.newBuilder().timeout(d)
Connect timeoutClient builder
RedirectsNEVER / NORMAL / ALWAYS
SSLsslContext(ctx)

6. Working with WebSocket

APIUse
HttpClient.newWebSocketBuilder().buildAsync(uri, listener)Connect
WebSocket.ListeneronOpen/onText/onBinary/onClose
sendText / sendBinary / sendPingSend
request(n)Backpressure

7. Using ServerSocket and Socket

ClassUse
ServerSocket(port)Listen
accept()Block for client
Socket(host, port)Connect
getInputStream / getOutputStreamI/O

8. Using DatagramSocket

APIUse
DatagramSocket(port)UDP socket
send(DatagramPacket)Send packet
receive(DatagramPacket)Block for inbound
MulticastSocketMulticast (use ND for IPv6)

9. Configuring Socket Options

OptionEffect
SO_TIMEOUTRead timeout
SO_KEEPALIVETCP keepalives
TCP_NODELAYDisable Nagle
SO_REUSEADDRBind reuse
SO_LINGERClose behavior
SO_RCVBUF / SO_SNDBUFBuffer sizes

10. Using NIO Channels

ChannelUse
SocketChannelNon-blocking TCP
ServerSocketChannelNon-blocking listener
DatagramChannelUDP
FileChannelFile I/O + transferTo (zero-copy)
PipeIn-process channels

11. Understanding Selectors

APIUse
Selector.open()Create
channel.register(sel, ops)Register interest
select() / select(t) / selectNow()Block / timed / poll
OpsOP_READ, OP_WRITE, OP_ACCEPT, OP_CONNECT

12. Implementing Non-Blocking Server

Example: Selector loop

Selector sel = Selector.open();
ServerSocketChannel ssc = ServerSocketChannel.open();
ssc.bind(new InetSocketAddress(8080)).configureBlocking(false);
ssc.register(sel, SelectionKey.OP_ACCEPT);
while (sel.select() > 0) {
    for (var key : sel.selectedKeys()) {
        if (key.isAcceptable()) accept(key);
        else if (key.isReadable()) read(key);
    }
    sel.selectedKeys().clear();
}
PatternDetail
ReactorSingle thread, multiplex
Modern altVirtual threads + blocking I/O