簡體   English   中英

用 SocketChannel.open().socket() 替換 new Socket() 有什么問題嗎?

[英]Any issues with replacing new Socket() with SocketChannel.open().socket()?

如果我簡單地更換會出什么問題

socket = new Socket()

socket = SocketChannel.open().socket()?

背景:我有一些使用new Socket()遺留代碼,我希望能夠中斷socket.connect()調用。 我不想重寫代碼來使用 NIO。 我了解到Thread.interrupt()不會中斷socket.connect() ,但是另一個線程上的socket.close()應該中斷連接。 奇怪的是,這適用於 Java 7 但不適用於 Java 6。

我以某種方式讓我想到使用socket = SocketChannel().open().socket()會神奇地允許我使用Thread.interrupt()來中斷socket.connect() 它沒有,但奇怪的是,它確實使 Java 6 中的socket.close()中斷socket.connect()

請注意,我沒有以任何方式直接使用附加的SocketChannel ---它在我創建Socket時出現並且再也不會出現。

這有什么問題?

有幾種。

  1. 通過 SocketChannel 獲取的 Socket 似乎不支持讀取超時。
  2. 套接字的 InputStream 和 OutputStream 不是獨立的:它們有共同的互鎖。

為什么要中斷connect() 調用? 當然你想要的只是連接超時?

拋出異常類型的差異可能會破壞現有代碼。

例如,在Socket.getInputStream().read()阻塞時關閉來自不同線程的Socket將在替換后導致AsynchronousCloseException ,而不是遺留代碼可能期望的SocketException AsynchronousCloseException不是SocketException的子類。)

但是,如果來自其他線程的關閉在read()之前進入, Socket.getInputStream().read()仍將拋出SocketException

暫無
暫無

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

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