كيفية إرسال واستقبال كائن متسلسل في قناة المقبس

StackOverflow https://stackoverflow.com/questions/1453028

  •  12-09-2019
  •  | 
  •  

سؤال

أريد أن أحيل كائن متسلسل عبر قناة مأخذ. أريد أن أجعل سلسلة "مرحبا صديق" ككائن متسلسل ثم اكتب هذا الكائن في قناة المقبس أثناء وجودك في الطرف الآخر أريد قراءة نفس الكائن واسترجاع البيانات.

كل هذه الأشياء أريد أن أفعل باستخدام جافا 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;
}
هل كانت مفيدة؟

المحلول

يبدو أن معالجة Socketchannel غير مكتملة، راجع هذا اكتمال مثال ل Socketchannels نقل بايت:

/*
 * 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

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top