2012-01-03 39 views
1

我想打開一個套接字並偵聽。用PHP編寫的客戶端將發送XML請求。此刻,我只是發送字符串「測試」到它,我得到一個內存堆錯誤。來自套接字的Java堆內存錯誤

這裏是服務器我的Java代碼:

import java.io.DataInputStream; 
import java.io.IOException; 
import java.net.ServerSocket; 
import java.net.Socket; 

public class main { 

    /** 
    * @param args 
    */ 
    public static void main(String[] args) { 
     server(); 

    } 

    public static void server() { 
     ServerSocket MyService = null; 
     try { 
      MyService = new ServerSocket(3030); 
     } 
     catch (IOException e) { 
      System.out.println(e); 
     } 

     Socket serviceSocket = null; 
     try { 
      serviceSocket = MyService.accept(); 
     } 
     catch (IOException e) { 
      System.out.println(e); 
     } 

     DataInputStream in; 
     try { 
      in = new DataInputStream(serviceSocket.getInputStream()); 
      System.out.println("DEV STEP 1"); 
      int len = in.readInt(); 
      System.out.println(len); 
      byte[] xml = new byte[len]; 
      in.read(xml, 0, len); 
      //System.out.print(xml.toString()); 
      //Document doc = builder.parse(new ByteArrayInputStream(xml)); 

     } 
     catch (IOException e) { 
      System.out.println(e); 
     } 

    } 

} 

我得到的錯誤是:

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space 
    at main.server(main.java:39) 
    at main.main(main.java:12) 

我已經做了搜索,有很多這個錯誤的解釋就在這裏,但我不能解決爲什麼當我發送一個4字母字符串len是1952805748.

+0

您是否使用DataOutputStream連接到端口3030? – 2012-01-03 00:53:56

回答

3

那麼你得到內存不足的錯誤,因爲len是如此之大。如果您將數據作爲字符發送,然後在其上執行readInt(),那麼這就是導致您的問題的原因。您需要將數據讀取爲字符。

您的數字有效可能是字符串「測試」的二進制文件。你只需要從InputStream中讀取一個字符串,不知道爲什麼你需要一個DataInputStream,因爲這是支持讀取二進制等的東西,這不是你正在做的。只需使用BufferedInputStream,然後對其進行正常讀取。

0

要擴大弗朗西斯厄普頓的回答,你得到了一堆的例外,因爲你試圖讀取從輸入流套接字,其中ñ代表你在你的處理開始閱讀完全任意整數ñ字節循環。我之所以稱它爲完全任意的原因是因爲你實際上從未在客戶端代碼中實際發送過單獨的int。所以你的代碼只是從輸入流的前4個字節中的任何東西中讀取一個int,這可能是任何東西。

看看在Apache Commons IOIOUtils,它包含在一杆(toByteArraytoString等)讀取整個數據流不錯的方法。