簡體   English   中英

擴展SocketChannel以添加自定義讀寫

[英]Extend SocketChannel to add custom read and write

我正在嘗試通過通道發送序列化對象。 這個想法是用方法構造函數擴展SocketChannel ,該方法構造函數保存要發送的Object,並添加方法writeObj()以便發送序列化對象的大小,然后發送序列化的對象。

使用私有字段,我試圖以非阻塞模式管理所有過程,因此構造函數將對象保存為序列化到ByteBuffer src字段中,並使用super.write(ByteBuffer src)寫入對象writeObj() super.write(ByteBuffer src) (相應的Object readObj()返回空如果對象沒有被完全接收到,或者如果對象super.read()返回-1)

問題在於SocketChannel是抽象類,因此super.read()super.write(..)

我應該擴展SocketChannelImpl還是有其他正確的方法來做到這一點?

經典XY問題。

擴展SocketChannel

你不能

添加自定義讀寫

你不能

我正在嘗試通過通道發送序列化對象。 這個想法是用方法構造函數擴展SocketChannel的,該方法構造函數保存要發送的Object,並添加方法writeObj()以便發送序列化對象的大小,然后發送序列化的對象。

你不能 不用了 您可以將任何Serializable對象序列化為ByteArrayOutputStream ,獲取其字節,然后通過與發送任何其他字節相同的技術來發送這些字節。

使用私有字段,我試圖以非阻塞模式管理所有過程,因此在構造函數中,將對象保存為要序列化為ByteBuffer src字段的對象,並使用super.write(ByteBuffer src)將writeObj()寫入對象。

我不理解“使用私有字段”與這一切有什么關系,因為實際上您不能首先擴展SocketChannel :我也不理解為什么為什么需要私有字段,或者您為什么會這樣認為。

(如果未完全接收到Object,則對象分別為null;如果super.read()返回-1,則分別返回null)

這已經是兩個主要的設計錯誤。 如果未完全接收到對象,則應繼續接收,如果在完全接收到對象之前發生EOS,則應引發異常,而不返回任何內容。

問題在於SocketChannel是抽象類,因此不允許super.read()和super.write(..)。

問題在於(a)您的設計方法和(b)您的設計細節都(c)根本上有缺陷,並且(d)完全沒有必要。 除了在非阻塞模式下接收任何應用程序協議消息所需要的代碼之外,您不需要任何其他代碼。 這很復雜,因為您必須在接收方處理流的部分讀取和流過早結束,而在發送方處理部分寫入,但這不需要擴展SocketChannel或您提到的其他措施。

我應該擴展SocketChannelImpl

沒有。

還是有其他正確的方法來做到這一點?

這里有很多關於如何處理這兩種情況的文章。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM