Socket 是 TCP/UDP 之上的應用層接口。Java 採用**流式抽象** (InputStream/OutputStream),.NET 提供**多層次封裝** (Socket/TcpClient/UdpClient) 統一歸口 NetworkStream,核心差異在於數據收發的編程模型:流式透明 vs 緩衝區顯式。
// Java 標準寫法
DataOutputStream out = new DataOutputStream(socket.getOutputStream());
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String msg = in.readLine(); // 阻塞讀行
out.writeBytes(msg + "\n"); // 寫入流
out.flush();
InputStream/OutputStream 後,像操作本地文件/內存流一樣收發。BufferedReader, DataOutputStream) 透明完成。.NET 提供三種等價入口,底層均走 NetworkStream:
socket.Send(byte[], offset, size, flags) / socket.Receive(...),最底層,需手動管理字節數組、偏移、長度。client.GetStream() 返回 NetworkStream,再 stream.Write/Read。Write(byte[], offset, count) / Read(byte[], offset, count)。
// .NET 典型模式 (TcpClient + NetworkStream)
TcpClient client = listener.AcceptTcpClient();
NetworkStream ns = client.GetStream();
byte[] buffer = new byte[4];
ns.Write(buffer, 0, 4); // 顯式指定偏移、長度
// 或
client.Client.Send(buffer, 0, buffer.Length, SocketFlags.None);
| 維度 | Java Socket | .NET Socket |
|---|---|---|
| 編程範式 | 流式 (Stream-oriented) | 緩衝區顯式 (Buffer-explicit) |
| 數據操作 | readLine(), writeBytes() 等高級流操作 | Write/Read/ Send/Receive 必須處理 byte[]、offset、count |
| 封裝層次 | 單一 Socket → InputStream/OutputStream → 裝飾器 | Socket / TcpClient / UdpClient → NetworkStream |
| 控制力 | 低 (難以精確控制發送時機、分包) | 高 (可精確控制每次發送字節數、標誌位、異步模式) |
| 學習曲線 | 平緩 (類文件 IO) | 稍陡 (需理解緩衝區、異步 IO、SocketFlags) |
.NET 的顯式緩衝區模型雖代碼較繁瑣,但賦予開發者**精確控制網絡數據幀**的能力 (如應用層協議封裝、心跳包、零拷貝優化),配合
BeginSend/EndSend/SocketAsyncEventArgs高性能異步模式,是高性能網絡編程的基石。