2012-01-03 40 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等)读取整个数据流不错的方法。