我正在使用Apache Commons TelnetClient爲某些交換機創建自動telnet界面。如果我直接從機器telnet到交換機,連接似乎永遠不會超時。隨機地,在Java程序中,連接似乎與InputStream一起立即關閉。我試圖建立一個檢查,看到連接失敗,並嘗試再次進行連接,但如果它第一次失敗,它總是失敗。Java TelnetClient InputStream在打開後關閉
import org.apache.commons.net.telnet.TelnetClient;
public String connect()
{
String errorMessage = null;
tcConnectionHandle = new TelnetClient();
tcConnectionHandle.setDefaultTimeout(iTimeOutMilliseconds);
try
{
tcConnectionHandle.connect(strConnectionIP, intConnectionPort);
osOutput = tcConnectionHandle.getOutputStream();
isInput = tcConnectionHandle.getInputStream();
int availableBytes = isInput.available();
while(availableBytes <= 0)
{
tcConnectionHandle = null;
isInput = null;
osOutput = null;
Thread.sleep(500);
tcConnectionHandle = new TelnetClient();
Thread.sleep(500);
tcConnectionHandle.setDefaultTimeout(iTimeOutMilliseconds);
Thread.sleep(500);
tcConnectionHandle.connect(strConnectionIP, intConnectionPort);
Thread.sleep(500);
osOutput = tcConnectionHandle.getOutputStream();
Thread.sleep(500);
isInput = tcConnectionHandle.getInputStream();
Thread.sleep(500);
availableBytes = isInput.available();
System.out.println("reopened: " + availableBytes);
}
}
catch(InterruptedException iX)
{
errorMessage = "Could not establish connection. " + iX.getLocalizedMessage();
}
catch(SocketException sX)
{
errorMessage = sX.getMessage();
}
catch(IOException ioX)
{
errorMessage = ioX.getMessage();
}
return errorMessage;
}
如果我遺漏了Thread.sleep(500)
它永遠不會有任何availableBytes。暫停後,結果爲20,但是,如果我嘗試使用isInput.read()
,它將返回-1,這表示InputStream已關閉。
我正在尋找一種方法來捕捉連接失敗並再次嘗試連接。它發生得太頻繁,不能再試一次。
爲什麼要測試可用字節爲負數或零?測試它有什麼意義?誰說必須立即連接數據?只要讀一下。它會阻止,直到數據到達。使用讀取超時來控制它。 – EJP
我正在做測試,因爲讀取失敗並返回-1(如我的代碼塊所述)。直到數據到達,因爲InputStream被關閉,它才被阻塞。 –