2017-03-29 2 views
0

Je rencontre des problèmes avec cette question en ce moment. Pour cette question, je dois:Compresser et décompresser des données via des sockets

côté client: compresser chaque ligne d'entrée de la console, l'envoyer au serveur et décompressez chaque message du serveur

côté serveur: décomprimer les données du client, changer la partie inférieure -mettre les lettres en majuscules, les compresser et les renvoyer au client

Le mieux que je puisse faire est de faire tout ce qui précède avec une seule ligne.

côté client:

/* SOCKET CONNECTING STUFF UP HERE */ 

    /*PROBLEMS START AROUND HERE */ 
    String line; 
    BufferedReader bis = new BufferedReader(new InputStreamReader(System.in)); 

    DeflaterOutputStream compress = new DeflaterOutputStream(socket.getOutputStream(), true); 


    InflaterInputStream decompress = new InflaterInputStream(socket.getInputStream()); 
    BufferedReader fromClient = new BufferedReader(new InputStreamReader(decompress)); 

    line = bis.readLine(); 

    line = line + "\n"; 
    compress.write(line.getBytes(), 0, line.length()); 
    compress.finish(); 
    System.out.println("Message sent: " + line); 
    System.out.println("Message Returned : " +fromClient.readLine()); 

    /* closing the streams here */ 
    bis.close(); 
    decompress.close(); 
    compress.close(); 
    fromClient.close(); 
    socket.close(); 
} 

} 

côté serveur:

String line = ""; 
    OutputStream outstream = new FileOutputStream("compessserver.txt"); 

    InflaterInputStream decompress = new InflaterInputStream(clientsocket.getInputStream()); 
    BufferedReader fromClient = new BufferedReader(new InputStreamReader(decompress)); 
    DeflaterOutputStream compress = new DeflaterOutputStream(clientsocket.getOutputStream()); 

    while ((line = fromClient.readLine()) != null) { 
     String upperLine = line.toUpperCase(); 
     System.out.println("Message received and converted: " + upperLine); 
     System.out.println(); 
     upperLine = upperLine + "\n"; 
     byte[] input = upperLine.getBytes(); 
     outstream.write(input); 
     outstream.write("\r\n".getBytes()); 
     compress.write(input); 
     System.out.println("Message returned : " + upperLine); 
     compress.finish(); 
     if (upperLine.equalsIgnoreCase("x")) { 
      break; 
     } 

    } 

    decompress.close(); 
    compress.close(); 
    fromClient.close(); 
    outstream.close(); 
    socket.close(); 
} 
} 

J'ai vraiment besoin d'aide dans ce s'il vous plaît. Si j'essaye de faire ces entrées multiples à la place, le code entier gâche juste. Été à cela pendant des jours.

EDIT: J'ai oublié de le mentionner. Ce que je suis supposé faire est d'entrer une ligne, de la compresser, de l'envoyer au serveur, de la décompresser par le serveur et des majuscules, de la compresser, de la renvoyer au client. Et puis-je supposé entrée plusieurs lignes jusqu'à ce que je mets dans une seule lettre comme « Q » qui, en cas, se termine le programme

J'ai essayé le code suivant pour le faire fonctionner pour plusieurs lignes

Deuxième essai côté client :

String line; 
    BufferedReader bis = new BufferedReader(new InputStreamReader(System.in)); 

    DeflaterOutputStream compress = new DeflaterOutputStream(socket.getOutputStream(), true); 


    InflaterInputStream decompress = new InflaterInputStream(socket.getInputStream()); 
    BufferedReader fromClient = new BufferedReader(new InputStreamReader(decompress)); 
    line = bis.readLine(); 
    while ((!line.equalsIgnoreCase("x"))) { 
     compress.write(line.getBytes(), 0, line.length()); 
     System.out.println("Message sent: " + line); 
     System.out.println("Message returned:" +fromClient.readLine()); 
     line = bis.readLine(); 
    } 

    bis.close(); 
    fromClient.close(); 
    socket.close(); 
} 

}

côté Deuxième essai du serveur:

OutputStream outstream = new FileOutputStream("compessserver.txt"); 
    InflaterInputStream decompress = new InflaterInputStream(clientsocket.getInputStream()); 
    BufferedReader fromClient = new BufferedReader(new InputStreamReader(decompress)); 
    DeflaterOutputStream compress = new DeflaterOutputStream(clientsocket.getOutputStream()); 

    while ((line = fromClient.readLine()) != null) { 
     String upperLine = line.toUpperCase(); 
     System.out.println("Message received and converted: " + upperLine); 
     System.out.println(); 
     upperLine = upperLine + "\n"; 
     byte[] input = upperLine.getBytes(); 
     outstream.write(input); 
     outstream.write("\r\n".getBytes()); 
     compress.write(input); 
     System.out.println("Message returned : " + upperLine); 

     if (upperLine.equalsIgnoreCase("x")) { 
      break; 
     } 

    } 

    decompress.close(); 
    fromClient.close(); 
    outstream.close(); 
    socket.close(); 
} 

}

+0

Quel est le problème? Qu'attendez-vous qu'il se passe? Qu'est-ce qui se passe à la – cubrr

+0

Eh bien, je ne peux le faire fonctionner que si je saisis une seule ligne sur la console. Ce que je suis supposé faire est d'entrer une ligne, de la compresser, de l'envoyer au serveur, de la décompresser par le serveur et des majuscules, de la compresser, de la renvoyer au client. Et puis je devais entrer plus de lignes jusqu'à ce que je mette une seule lettre comme "Q" – BeyondDays

+0

Que se passe-t-il lorsque vous essayez avec deux lignes? Est-ce que vous tapez quelque chose, appuyez sur Entrée, la demande est exécutée, le serveur renvoie la réponse appropriée, puis le programme client se termine? Pouvez-vous indiquer la ligne de code qui, selon vous, devrait amener le programme à demander une deuxième ligne? –

Répondre

0

Vous ne pouvez pas utiliser ces flux de manière interactive. Vous devrez appeler finish() après chaque écriture, ou plutôt avant chaque lecture, ce qui signifie que vous ne pouvez écrire qu'une seule fois. Ils sont conçus pour les grands flux à sens unique, et non pour les sessions de demande/réponse interactives.

Dans tous les cas, il n'y a aucun avantage à compresser des lignes simples. Vous avez besoin de beaucoup de données pour que la compression commence à fonctionner.

NB compress.write(line.getBytes(), 0, line.length()) n'est pas valide. Il suppose que le nombre de caractères dans le String est le même que le nombre d'octets lors de la conversion, ce qui n'est pas toujours le cas. Il devrait être compress.write(line.getBytes(), 0, line.getBytes().length()), ou plus simplement compress.write(line.getBytes()).

+0

Donc, dans ce cas, est-il préférable de mettre les lignes d'entrée dans un fichier texte d'abord, compresser cela et l'envoyer sur le serveur? DeflaterOutputStream va bien, non? – BeyondDays

+0

@BeyondDays 'DeflaterOutputStream' serait une meilleure option. L'écriture d'un fichier texte est certainement futile; écrire un fichier compressé puis l'envoyer ajoute beaucoup de latence dont vous n'avez pas besoin. – EJP