web-dev-qa-db-fra.com

Comment envoyer et recevoir un objet sérialisé dans un canal de socket

Je veux 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 tandis qu'à l'autre extrémité, je veux lire le même objet et récupérer les données.

Toutes ces choses que je veux faire en utilisant Java SocketChannel. Comment faire? J'ai essayé comme ci-dessous, mais je n'ai pas obtenu de données 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;
}
26
Sunil Kumar Sahoo

Votre gestion SocketChannel semble être incomplète, voir cet exemple complet 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 obtenez la sortie suivante:

Console du serveur

Sender Start
Connection ended

Console du récepteur

Receiver Start
String is: 'testtext'
End Receiver

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

35
tuergeist