2012-10-29 76 views
0

我正在嘗試創建一個服務器偵聽器。它位於後面並等待來自客戶端的數據,並根據數據的性質執行設置操作。但是現在,在接收到第一個數據流之後,它進入資源管理器,內存使用率開始上升,並且CPU使用率超過了單個內核。單個java線程使用多餘的系統資源

1 - 我該如何解決這個問題?我怎樣才能使它沒有所有的資源豬,因爲你可以看到它是一個非常小的程序。

2 - 發送這些數據流的客戶端本身運行一次。它啓動,連接到服務器,發送數據並退出。雖然服務器仍處於「打開」狀態,但如果我再次嘗試運行客戶端,則服務器不會收到數據。

服務器代碼:

package mediaserver; 

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.net.ServerSocket; 
import java.net.Socket; 
import java.util.logging.Level; 
import java.util.logging.Logger; 

public class Main { 
    ServerSocket ss; 
    Socket s; 
    BufferedReader br; 

    public Main() throws IOException{ 
     ss = new ServerSocket(1111); 
     s = ss.accept(); 
     br = new BufferedReader(new InputStreamReader(s.getInputStream())); 
     new Thread(new runner()).start(); 
    } 

    class runner implements Runnable{ 

     public void run(){ 
      while(true){ 
      try { 
       String n = br.readLine(); 
       System.out.println(n); 
      } catch (IOException ex) { 
      } 
      finally{ 
       try { 
         s.close(); 
         ss.close(); 
        } catch (IOException ex) { 
        } 

      } 
      } 
     } 
    } 

    public static void main(String[] args) throws IOException { 
     new Main(); 
    } 

} 

package mediaserver; 

import java.io.BufferedWriter; 
import java.io.IOException; 
import java.io.OutputStreamWriter; 
import java.net.Socket; 
import java.net.UnknownHostException; 

public class test { 
public static void main(String [] args) throws UnknownHostException, IOException, InterruptedException{ 
    Socket s = new Socket("127.0.0.1", 1111); 
    BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(s.getOutputStream())); 
    bw.write(""); 
    bw.newLine(); 
    bw.flush(); 

    } 
} 
+1

只需在調試器中按* Pause *並檢查它在做什麼。 – Codo

+1

這是調試器的用途。學習時間。 –

回答

0

下面這段代碼是一個無限循環客戶端代碼:

while(true) { 
    try { 
     String n = br.readLine(); 
     System.out.println(n); 
    } catch (IOException ex) { 
     throw new RuntimeException(ex); 
    } 
    finally { 
     ... 
    } 
} 

一旦客戶端斷開連接時,BufferedReader實例會遇到文件結束和readLine將返回null。循環然後將繼續無限地打印null

修復它,檢查null

while(true) { 
    try { 
     String n = br.readLine(); 
     if (n == null) 
      break; 
     System.out.println(n); 
    } catch (IOException ex) { 
    } 
    finally { 
     ... 
    } 
} 
+0

我已經添加了null修復。但資源使用率仍然很高。 – Mob

+0

你在調試器中看過嗎? – Codo

+1

將一些日誌記錄添加到空的catch塊或將其移出while循環。 –

0

服務器從來沒有得到額外運行的數據,因爲ss.accept()只調用一次。您需要將其封裝在一個循環中:

s = ss.accept(); 
br = new BufferedReader(new InputStreamReader(s.getInputStream())); 
new Thread(new runner()).start();