Pergunta

Eu quero transmitir um objeto serializado sobre um canal de soquete. Quero fazer a string "Oi Friend" como objeto serializado e, em seguida, escreva esse objeto no canal de soquete enquanto estiver no outro lado, quero ler o mesmo objeto e recuperar os dados.

Todas essas coisas que eu quero fazer usando Java SocketChannel. Como fazer isso? Eu tentei como abaixo, mas não obtive nenhum dado no lado do destinatário.

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;
}
Foi útil?

Solução

Seu manuseio de socketchannel parece estar incompleto, veja isso completo Exemplo de Socketchannels transferindo um byte:

/*
 * 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");
        }
    }
}

E o leitor

/*
 * 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");
    }
}

Quando você inicia o servidor pela primeira vez, depois o receptor, você obterá a seguinte saída:

Console do servidor

Sender Start
Connection ended

Console do receptor

Receiver Start
String is: 'testtext'
End Receiver

Esta não é a melhor solução, mas segue o uso do Java's ServerSocketChannel

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top