2010-05-22 13 views
0

J'essaye d'envoyer un fichier via un socket java et de le recevoir par un autre. Cependant, cela se produit:En-tête de programmation socket Java

Envoyer Contenu:

/* Ceci est simplement un fichier à transférer */

Received:

donc en gros je ne peux pas échapper au contenu reçu en cas de débordement de la pile . Il s'agit essentiellement d'un tas d'octets illisibles (environ 32 octets) et ensuite le message que j'ai envoyé.

OutputStream os = sock.getOutputStream(); 
ObjectOutputStream oos = new ObjectOutputStream(os); 
oos.writeObject(mybytearray); 
oos.flush(); 
oos.close(); 

Et pour le client:

BufferedReader in = new BufferedReader(new InputStreamReader(sock.getInputStream())); 
FileOutputStream fos = new FileOutputStream("newfile.java"); 
BufferedOutputStream bos = new BufferedOutputStream(fos); 
bytesRead = is.read(mybytearray,0,mybytearray.length); 
current = bytesRead; 
bos.write(mybytearray, 0 , current); 
bos.flush(); 
bos.close(); 
sock.close(); 
+0

est-ce le vidage du processus d'expéditeur ou du processus de réception? –

+0

Doit voir le code ... –

Répondre

1

Pourquoi passer par ObjectOutputStream? Utilisez le OutputStream directement via la méthode write ou choisissez par exemple DataOutputStream si vous le jugez nécessaire. De plus, vous ne devriez pas utiliser les classes Reader pour le transfert de données binaires. De l'api de Reader:

Classe abstraite pour la lecture flux de caractères.


Vous trouverez un exemple complet "envoyer le fichier sur socket" ici:

Transfer a file via Socket.

Key Code côté serveur:

OutputStream os = sock.getOutputStream(); 
    System.out.println("Sending..."); 
    os.write(mybytearray,0,mybytearray.length); 
    os.flush(); 
    sock.close(); 

clé du code côté client:

bytesRead = is.read(mybytearray,0,mybytearray.length); 
1

Il serait utile de voir le code, mais ce que vous avez semble là comme des données aléatoires de base. Quelques éléments à vérifier:

  1. De quel type est le tampon de réception?
  2. Combien de caractères semblez-vous envoyer et recevoir?
  3. Etes-vous sûr que votre instruction d'impression sur la fin de réception est pointée au bon endroit?
+0

1. le tampon de réception est un octet [] 2. Je veux envoyer 39 octets et recevoir 66 3. Je pense que la réception pointe vers le bon endroit. Le fichier est créé, il a juste trop de 66 octets au lieu de 39. Je ne suis pas sûr si c'est ce que vous voulez dire. – Andy

+0

Yup. Notez que vous avez reçu environ deux fois plus d'octets que prévu. Cela devrait vous faire réfléchir sur les types correspondants.Maintenant, considérons ce que ObjectOutputStream fait réellement: il * code * un objet pour qu'il puisse être récupéré. Lorsque vous envoyez vos données en tant que ObjectOutputStream, Java l'encodera en tant que tableau. Voir http://java.sun.com/j2se/1.4.2/docs/api/java/io/ObjectOutputStream.html Ce que vous obtenez est la forme "sérialisée" d'un tableau d'octets. –

+0

haha ​​merci, j'étais tellement concentré sur le code client que je ne voyais pas que j'envoyais un flux de sortie d'objet. – Andy

0

Cela ne fait aucun sens. Si vous utilisez un ObjectOutputStream, vous devez utiliser un ObjectInputStream pour le lire. Si vous voulez utiliser un Reader pour le lire, vous devez utiliser un Writer pour l'écrire.