2012-01-03 3 views
1

J'essaie d'ouvrir un socket et d'écouter. Les clients écrits en PHP enverront alors des requêtes XML. Pour le moment, je ne fais que lui envoyer la chaîne "test" et j'obtiens une erreur Memory Heap.Java Heap Erreur de mémoire du socket

Voici mon code java pour le serveur:

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); 
     } 

    } 

} 

L'erreur que je reçois est:

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

Je l'ai fait une recherche et il y a beaucoup d'explications de cette erreur ici , cependant je ne peux pas comprendre pourquoi quand j'envoie une lettre len 4 lettres est 1952805748.

+0

Utilisez-vous un DataOutputStream pour vous connecter au port 3030? –

Répondre

3

Eh bien, vous obtenez l'erreur de mémoire insuffisante, car le len est si énorme. Si vous envoyez les données sous forme de caractères et que vous faites ensuite un readInt() dessus, alors c'est ce qui cause votre problème. Vous devez lire les données en tant que caractères.

Votre valeur numérique est probablement le binaire de la chaîne "test". Vous devriez juste lire une chaîne de l'InputStream, pas sûr pourquoi vous avez besoin d'un DataInputStream car c'est quelque chose qui prend en charge la lecture binaire, etc, ce qui n'est pas ce que vous faites. Il suffit d'utiliser un BufferedInputStream, puis faites une lecture normale dessus.

0

Pour développer la réponse de Francis Upton, vous obtenez une exception tas parce que vous essayez de lire n octets du flux de socket entrant, où n représente l'entier totalement arbitraire vous avez lu au début de votre traitement boucle. Et la raison pour laquelle je l'appelle totalement arbitraire est parce que vous n'avez jamais réellement envoyé un int séparé dans votre code client. Donc votre code lit simplement un int de tout ce qui est dans les 4 premiers octets du flux d'entrée, ce qui pourrait être n'importe quoi.

Jetez un oeil à IOUtils dans Apache Commons IO, il contient des méthodes pour la lecture d'un beau flux de données entière d'un seul coup (toByteArray, toString, etc.).