本文提供一個最簡單的非阻塞 I/O 範例,展示如何使用 SocketChannel、ByteBuffer 連接 HTTP 伺服器、發送請求並接收回應,幫助讀者建立感性認識,後續章節將深入解析通道與緩衝區細節。
package test;
import java.net.*;
import java.nio.*;
import java.nio.channels.*;
import java.io.*;
public class FirstNonBlockingIO {
public static void main(String[] args) throws Exception {
SocketAddress remote = new InetSocketAddress("www.sina.com.cn", 80);
SocketChannel channel = SocketChannel.open(remote);
String request = "GET / HTTP/1.1\r\n" +
"Host:www.sina.com.cn\r\n" +
"Connection:close\r\n\r\n";
ByteBuffer header = ByteBuffer.wrap(request.getBytes());
channel.write(header);
ByteBuffer buffer = ByteBuffer.allocate(1024);
WritableByteChannel out = Channels.newChannel(System.out);
while (channel.read(buffer) != -1) {
buffer.flip();
out.write(buffer);
buffer.clear();
}
channel.close();
}
}
java test.FirstNonBlockingIO > sina.txt
sina.txt 將包含 HTTP 回應頭與 HTML 內容。
| 操作 | 同步 I/O | 非阻塞 I/O (NIO) |
|---|---|---|
| 連接伺服器 | Socket | SocketChannel.open() |
| 寫入資料 | OutputStream | SocketChannel.write(ByteBuffer) |
| 讀取資料 | InputStream | SocketChannel.read(ByteBuffer) |
flip()/clear() 切換讀寫模式。此範例雖簡單,但展示了 NIO 核心 API 的基本協作流程。掌握通道與緩衝區操作,是進入非阻塞網路程式設計的第一步。