web-dev-qa-db-ja.com

シリアル化されたオブジェクトをソケットチャネルで送受信する方法

シリアル化されたオブジェクトをソケットチャネル経由で送信したい。 「こんにちは」の文字列をシリアル化されたオブジェクトとして作成し、このオブジェクトをソケットチャネルに書き込んで、もう一方の端で同じオブジェクトを読み取ってデータを取得したい。

Java SocketChannelを使用して実行したいこれらすべてのこと。これを行う方法?私は以下のように試しましたが、受信側でデータを取得しませんでした。

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

SocketChannelの処理が不完全なようです。次を参照してくださいcompleteバイトを転送するSocketChannelの例:

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

そして読者

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

最初にサーバー、次にレシーバーを起動すると、次の出力が表示されます。

サーバーのコンソール

Sender Start
Connection ended

受信機のコンソール

Receiver Start
String is: 'testtext'
End Receiver

これは最善の解決策ではありませんが、JavaのServerSocketChannelの使用に従います

35
tuergeist