[英]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.