我想從線程連接到遠程服務器並繼續發送字符串。如果連接被拒絕,線程應該繼續輪詢端口直到服務器重新啓動。我該如何處理這個異常並讓我的線程崩潰?服務器可能不會長時間運行,但線程應無限期地運行。從輪詢線程連接到遠程端口(服務器)
public void SendMessage(String message){
try {
socket = new Socket(actuatorAddress, destPort.get());
outToServer = socket.getOutputStream();
out = new DataOutputStream(outToServer);
out.flush();
out.write(message.getBytes());
} catch (IOException ex) {
System.out.println(ex.getMessage());
} catch (Exception e) {
System.out.println(e.getMessage());
}
}
我改變了一部分代碼如下。首次調用Connect函數,然後通過線程調用Send Message函數。添加到重新連接的延遲有助於減少由於連接到非現有服務器而導致的時滯。仍然認爲對基本問題可能有更好的解決方案。
public boolean ConnectToActuator() {
try {
if(actuatorAddress.isReachable(2000)){
socket = new Socket();
socket.setPerformancePreferences(1, 2, 0);
socket.setTcpNoDelay(false);
socket.setSendBufferSize(32);
socket.connect(new InetSocketAddress(actuatorAddress, destPort.get()));
outToServer = socket.getOutputStream();
out = new DataOutputStream(outToServer);
connected = true;
disconnectedTimeout = 0;
}
}catch (ConnectException e) {
// TODO Auto-generated catch block
System.out.println(e.getMessage());
}catch (IOException ex) {
connected = false;
System.out.println(ex.getMessage());
}
return connected;
}
public boolean SendToActuator(String message) {
if(connected == false){ //socket.isOutputShutdown()
disconnectedTimeout++;
if(disconnectedTimeout>20){
disconnectedTimeout = 0;
ConnectToActuator();
} else {
return connected;
}
}
try {
out.flush();
out.writeBytes(message);
disconnectedTimeout = 0;
connected = true;
} catch (UnknownHostException uhe) {
connected = false;
System.out.println(uhe.getMessage());
} catch (IOException ioe) {
connected = false;
System.out.println(ioe.getMessage());
}
return connected;
}
以分鐘計,「長時間」意味着什麼?此外,您的代碼的目標是什麼:您是在嘗試測試服務是否已啓動,或者確信即使您不知道服務何時可用,最終還是會發送該消息?你是否在意偶爾有些信息會丟失?或者你需要確定他們都收到了? – TreyE
目標是在網絡中連接大約10臺服務器,從該線程讀取消息。服務器可能會斷開幾分鐘甚至幾小時,或者它可能會被取出網絡。但我仍然希望該任務能夠繼續運行並將消息發送給其他連接的服務器。消息的丟失不是問題。 – rohittheozzy
基本上我想處理連接拒絕異常。或者,如果我能夠在創建套接字之前檢查連接是否會被拒絕,那麼更好。 – rohittheozzy