簡體   English   中英

通過套接字連接銷毀Java對象

[英]Java object destruction with socket connection

所以我有一個帶有套接字連接的Client類。 當客戶端連接到服務器時,我首先對該套接字進行讀取以獲取有關客戶端的信息。 然后,我將客戶端移動到具有所有已連接客戶端(發送其信息的客戶端)的表中。 然后,我在其中偵聽新連接的主套接字就是創建客戶端的地方。 問題是我不確定何時以及是否銷毀了套接字上具有待決讀取的對象。 我當前的策略是擁有另一個表,該表包含所有尚未發送信息的客戶端(如果有的話,則為未連接的客戶端)。 一旦客戶發送了他的信息,我便將他從未連接表移至已連接表。 我真的很討厭這種方法。 我只想在accept回調中創建客戶端,而不將其添加到表中。 一旦收到信息,就將客戶端移至連接的表。

我當前的實現:

myMainChannel.accept(null, new CompletionHandler<AsynchronousSocketChannel,Void>() 
        {
                public void completed(final AsynchronousSocketChannel ch, void att) 
                {
                    // accept the next connection
                    myMainChannel.accept(null, this);
                    //add client to unconnected table
                    allUnconnectedClients.put(ch, new Client(ch));
                }
                public void failed(Throwable exc, Void att) 
                {                       
                    exc.printStackTrace();  
                }

         });

客戶端的構造函數內部是第一個讀取操作。

id想要做的就是簡單地創建客戶端而不將其添加到表中。 所以換句話說:

allUnconnectedClients.put(ch, new Client(ch));

有了這個:

new Client(ch);

我知道只是創建一個局部變量而不使用它有點奇怪,但是有一個讀取超時(在構造函數內部),如果在5秒鍾之內什么都沒收到,它將關閉所有內容。

由於您可能會在任何給定時間等待讀取或寫入,因此可以使用在任何給定時間接受附件+完成處理程序的讀/寫方法 您的Client就是附件。 處理程序將負責注冊下一個讀取或寫入回調。 如果沒有,那么客戶端將有資格進行垃圾回收。

認為它是延續過去。

暫無
暫無

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

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