![](/img/trans.png)
[英]NetworkStream.Write data seems not to arrive at receiving socket
[英]NetworkStream.Write vs. Socket.Send
我有一個 c# 應用程序,我使用自定義 FTP 庫。 現在我使用 Socket.Send 發送數據,但我想知道用套接字啟動 NetworkStream 並改用 NetworkStream.Write 是否會更好。
使用其中一個有什么優勢嗎?
NetworkStream
的優勢主要源於它是Stream
。 Socket
的缺點是從抽象 I/O 源(如Stream
)讀取和寫入的通用代碼無法處理Socket
。
NetworkStream
的主要用例是您在其他地方有一些從Stream
讀取或寫入的代碼,並且您希望可以將它與Socket
一起使用。 您會知道是否處於這種情況,然后NetworkStream
將有很大幫助!
例如,假設您有一個通信庫,並且您支持從文件、命名管道和 TCP/IP 序列化消息。 I/O class 的理想選擇是Stream
。 然后您的序列化方法可以接受FileStream
、 PipeStream
或NetworkStream
。 它甚至會接受MemoryStream
。 這是抽象的好處,因為在我們創建了 stream 之后,一個方法可以與它交互,而無需知道它是哪種 stream。
從這個意義上說, NetworkStream
使用適配器設計模式。 它將Socket
API 適配到Stream
API 以便期望Stream
的客戶可以使用它。
所以最后的問題是,如果NetworkStream
是Socket
的Stream
適配器,我們應該使用哪一個? 好吧,如果您需要Stream
,那么NetworkStream
是您唯一的選擇。 如果您不需要Stream
,那么您可以使用您最熟悉的 API 。 如果您已經成功使用了Socket
,則沒有迫切的理由切換到NetworkStream
。
您可以單獨創建NetworkStream
並像使用抽象Stream
一樣使用它 - 這樣您就可以更改傳輸或簡單地創建Stream
存根進行測試。
作為方法本身的問題 - NetworkStream.Write
里面有唯一的操作(除了 state 檢查) streamSocket.Send(buffer, offset, size, SocketFlags.None);
- 所以它與在套接字上調用它幾乎相同。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.