2012-01-03 11 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に接続していますか? –

答えて

3

lenは非常に巨大であるため、メモリ不足の問題が発生しています。データを文字として送信してからreadInt()を実行すると、問題が発生します。あなたは文字としてデータを読む必要があります。

有効な数値はおそらく文字列 "test"のバイナリです。 InputStreamから文字列を読み取るだけで、DataInputStreamが必要な理由がわからない場合は、バイナリなどの読み込みをサポートしているものが必要です。ちょうどBufferedInputStreamを使用して、通常の読み取りを行います。

0

フランシス・アプトンの答えに展開するには、あなたがNはあなたの処理の最初に読み、完全に任意の整数を表し、着信ソケットストリームからのnバイトを読み取ろうとしているため、ヒープの例外を取得していますループ。そして私が完全に恣意的と呼ぶのは、あなたが実際にあなたのクライアントコードに別のintを送信したことがないからです。だから、あなたのコードは、入力ストリームの最初の4バイトにあるものをintから読み込むだけです。

Apache Commons IOIOUtilsを見て、それがワンショット(toByteArraytoString、など)で全体のデータ・ストリームを読み取るための素敵なメソッドが含まれています。

関連する問題