Question

Je souhaite transmettre un objet sérialisé sur un canal de support. Je veux faire « Salut ami » string comme objet sérialisé puis écrire cet objet dans le canal de prise tandis que dans l'autre extrémité que 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 n'a pas obtenu de données sur le 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;
}
Était-ce utile?

La solution

Votre manipulation de SocketChannel semble être incomplète, voir cette complet par 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, le récepteur, vous obtiendrez le résultat suivant:

console de 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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top