tags:

views:

1216

answers:

1

I want to transmit a serialized object over a socket channel. I want make "Hi friend" string as serialized object and then write this object in socket channel while in the other end i want to read the same object and retrieve the data.

All these things I want to do using Java SocketChannel. How to do this? I have tried like below, but did not get any data in the recipient side.

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;
}
+2  A: 

Your SocketChannel handling seems to be incomplete, see this complete example for SocketChannels transferring a 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");
     }
    }
}

And the Reader

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

When you first start the Server and than the Receiver, you'll get the following output:

Server's console

Sender Start
Connection ended

Receiver's console

Receiver Start
String is: 'testtext'
End Receiver

This is not the best solution, but follows your use of Java's ServerSocketChannel

tuergeist
Thanks for your help
Deepak
If you like the answer, I'd appreciate if you'd accept it ;)
tuergeist
What do you mean by "not the best solution". Could you elaborate some more? Also, if you wrap a stream around a channel, do you loose the NIO performance? Thanks!
Jeach
Performance isn't the correct word. What I meant is that I tried incorporating the code above to my existing 'nonblocking' NIO code, but I get the 'java.nio.channels.IllegalBlockingModeException'. Do you have a workaround or 'better solution'?
Jeach
Hi, a) the code above only works blocking. b) I wont elaborate a better solution, you shall answer a separate question for this. And, there is always a better solution.
tuergeist