2014-12-19 83 views
1

hello everybady我有簡單的服務器,通過tcp接收文件通常工作正常,但如果請求不是來自客戶端2小時,我的服務器無事可做。如果客戶想在2小時後請求從服務器,服務器無事可做。 你有任何建議Java Server在兩個小時後停止

import java.io.BufferedInputStream; 
import java.io.IOException; 
import java.net.ServerSocket; 
import java.net.Socket; 
import java.net.SocketTimeoutException; 
/* w ww . jav a 2 s . c o m*/ 


public class Main extends Thread { 
    private ServerSocket serverSocket; 
    public final static int FILE_SIZE =128*1204;//128k 
    int bytesRead; 

    public Main() throws IOException { 
    serverSocket = new ServerSocket(1072); 

    } 

    public void run() { 

     BufferedInputStream bis=null; 

     System.out.println("Waiting for client on port " + serverSocket.getLocalPort() + "..."); 
     Socket client=null; 

try { 
     client = serverSocket.accept(); 
     System.out.println("1:"+client.getKeepAlive()); 
     client.setKeepAlive(true); 

    } catch (IOException e1) { 
     e1.printStackTrace(); 
    } 

     System.out.println("Just connected to " + client.getRemoteSocketAddress()); 

while (true) { 

    try { 

     byte [] mybytearray_rec = new byte [FILE_SIZE]; 
     bis = new BufferedInputStream(client.getInputStream()); 
     String s=null; 
     while(bis.available()>0) 
     { 
     bytesRead =bis.read(mybytearray_rec); 
     s = new String(mybytearray_rec,0,bytesRead); 
     System.out.print(s); 
     } 

     } catch (SocketTimeoutException s) { 
      System.out.println("SocketTimeoutException:"+s); 
      break; 
     } catch (IOException e) { 
     System.out.println("IOException:"+e); 
     e.printStackTrace(); 
     break; 
     }catch (Exception e) { 
     System.out.println("Exception:"+e); 
     e.printStackTrace(); 
     break; 
    } 


    }//While; 



    } 

    public static void main(String[] args) throws InterruptedException { 
    try { 
     Thread t = new Main(); 
     t.start(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
    } 
} 
+0

你想在2小時後結束服務器? – 2014-12-19 08:33:28

+0

你有哪些服務器?如果你使用'Redhat的'Openshift'或類似的解決方案,這可能是正常的,因爲我注意到他們傾向於關閉用戶機器,如果他們閒置一段時間。 – spoko 2014-12-19 08:36:23

+0

很難理解你的問題。你可以試着翻譯它與谷歌,即再次發佈?將Buffersize從1204調整爲1024.將while(true)替換爲非無限狀態並刪除中斷。 – Stefan 2014-12-19 08:56:57

回答

2

至於你的問題目前正在寫的,這是可能發生的事情只是胡亂猜測。

while環的位置提出了以下邏輯服務器(僞代碼):

LISTEN for a client 
ACCEPT a client 
LOOP 
    PROCESS A TRANSATION with client 
    [ wait next message possibly 2 hours] 

那將是錯誤的。網絡中可能有很多組件會中止一個不活動的連接,因爲它包含未使用的資源。

你應該使用:

LISTEN for a client 
LOOP 
    ACCEPT a client 
    PROCESS A TRANSATION with client 
    CLOSE the connection 
    [ wait next message possibly 2 hours] 

這樣的連接是正常關閉,而不是繼續無效,客戶端打開每個新事務的清潔連接。