2009-09-21 10 views
24

Je souhaite transmettre un objet sérialisé sur un canal de socket. Je veux créer une chaîne "Hi friend" en tant qu'objet sérialisé, puis écrire cet objet dans le canal de socket alors que dans l'autre extrémité je veux lire le même objet et récupérer les données.Comment envoyer et recevoir un objet sérialisé dans le canal de socket

Toutes ces choses que je veux faire en utilisant Java SocketChannel. Comment faire ça? J'ai essayé comme ci-dessous, mais je n'ai reçu aucune donnée du côté du destinataire.

private static void writeObject(Object obj, SelectionKey selectionKey) { 
    ObjectOutputStream oos; 
    try { 
     SocketChannel channel = (SocketChannel) selectionKey.channel(); 
     oos = new ObjectOutputStream(Channels.newOutputStream(channel)); 

     oos.writeObject(obj); 
    } catch (IOException ex) { 
     ex.printStackTrace(); 
    } 
} 

private static Object readObject(SelectionKey selectionKey) { 
    ObjectInputStream ois; 
    Object obj = new Object(); 
    SocketChannel channel = (SocketChannel) selectionKey.channel(); 
    try { 
     ois = new ObjectInputStream(Channels.newInputStream(channel)); 
     obj = ois.readObject(); 
    } catch (Exception ex) { 
     ex.printStackTrace(); 
    } 
    return obj; 
} 
+0

La question est manquante! – tuergeist

+0

Votre SocketChannel est-il déjà ouvert et connecté? – tuergeist

+0

oui canal de socket est ouvert et connecté –

Répondre

31

Votre manipulation de SocketChannel semble être incomplète, voir ce complet exemple pour SocketChannels transférer un octet:

/* 
* Writer 
*/ 
import java.io.IOException; 
import java.io.ObjectOutputStream; 
import java.net.InetSocketAddress; 
import java.nio.channels.ServerSocketChannel; 
import java.nio.channels.SocketChannel; 

public class Sender { 
    public static void main(String[] args) throws IOException { 
     System.out.println("Sender Start"); 

     ServerSocketChannel ssChannel = ServerSocketChannel.open(); 
     ssChannel.configureBlocking(true); 
     int port = 12345; 
     ssChannel.socket().bind(new InetSocketAddress(port)); 

     String obj ="testtext"; 
     while (true) { 
      SocketChannel sChannel = ssChannel.accept(); 

      ObjectOutputStream oos = new 
         ObjectOutputStream(sChannel.socket().getOutputStream()); 
      oos.writeObject(obj); 
      oos.close(); 

      System.out.println("Connection ended"); 
     } 
    } 
} 

Et le lecteur

/* 
* Reader 
*/ 
import java.io.IOException; 
import java.io.ObjectInputStream; 
import java.net.InetSocketAddress; 
import java.nio.channels.SocketChannel; 

public class Receiver { 
    public static void main(String[] args) 
    throws IOException, ClassNotFoundException { 
     System.out.println("Receiver Start"); 

     SocketChannel sChannel = SocketChannel.open(); 
     sChannel.configureBlocking(true); 
     if (sChannel.connect(new InetSocketAddress("localhost", 12345))) { 

      ObjectInputStream ois = 
        new ObjectInputStream(sChannel.socket().getInputStream()); 

      String s = (String)ois.readObject(); 
      System.out.println("String is: '" + s + "'"); 
     } 

     System.out.println("End Receiver"); 
    } 
} 

Lorsque vous démarrez le serveur , puis le récepteur, vous obtiendrez la sortie suivante:

console du serveur

Sender Start 
Connection ended 

console de récepteur

Receiver Start 
String is: 'testtext' 
End Receiver 

Ce n'est pas la meilleure solution, mais suit votre utilisation de ServerSocketChannel Java

+0

Merci pour votre aide –

+2

Si vous aimez la réponse, j'apprécierais si vous l'accepteriez;) – tuergeist

+0

Que voulez-vous dire par "pas la meilleure solution". Pourriez-vous élaborer un peu plus? En outre, si vous encapsulez un flux autour d'un canal, perdez-vous la performance NIO? Merci! – Jeach

Questions connexes