2010-06-16 4 views
1

Je dois créer un serveur de journalisation dans java, et une tâche consiste à envoyer les données compressées. Maintenant, je l'envoie ligne par ligne en texte clair, mais je dois le compresser. Le serveur gère la requête "HTTP like". Par exemple, je peux obtenir un journal d'envoi "GET xxx.log". Cela établira une connexion TCP au serveur, la réponse du serveur avec un en-tête et le journal, et fermera la connexion. Le client lit ligne par ligne et analyse chaque entrée de LOG. J'ai essayé certains moyens sans succès. Mon problème principal est que je ne sais pas où chaque ligne se termine (dans la taille du client). Une idée?Envoi de données compressées via le socket

Répondre

1

La seule chose qui ferait le plus de sens est quelque chose comme ça

  1. client envoie GET foo.log
  2. Server envoie "Taille: 15042 \ n"
  3. Server envoie le fichier journal compressé, toute
  4. client parse la taille: en-tête (lecture jusqu'à ce qu'un saut de ligne) et sait combien d'octets à attendre
  5. client lit alors tous les octets du serveur (15042 dans l'exemple)
  6. client décompresse les données reçues
  7. client traite ensuite le journal (décompressé, vous trouverez les sauts de ligne)
+0

cela ne fonctionne pas pour moi, parce que je veux traiter les lignes aussi vite que possible (les fichiers journaux peuvent être très grands) – Pizza

+0

Ensuite, le faire en morceaux, répétez les étapes 3 à 6 en morceaux de taille octets –

0

Vous pouvez jeter un oeil à l'en-tête Range HTTP. Le client peut demander une plage d'octets et le serveur renverra uniquement ces octets. Utilisez la compression GZIP.

Vous pourriez avoir une action que vous appelez du client qui fournira un index, avec des plages d'octets, avant de demander une partie du journal.

Les en-têtes HTTP étant très volumineux, vous pouvez envisager d'envoyer 100 lignes à la fois ou plus. Enfin, regardez le codage de transfert en bloc, qui vous permettra de diffuser les données au client.

3

Utilisez un GZIPOutputStream sur le serveur et un GZIPInputStream sur le client, avec un InputStreamReader autour de celui-ci et un BufferedReader autour de celui-ci. Alors juste lire les lignes.

+0

Je l'ai essayé, mais quand j'essaye de readline(), il jette cette exception: java.io.EOFException: fin inattendue du flux d'entrée ZLIB – Pizza

+2

Ensuite, il pourrait être bon si vous avez collé un échantillon de code de reproduction dans une nouvelle question. Les flux sont en effet un bon moyen de le faire. –

Questions connexes