2009-09-21 26 views
24

Tôi muốn truyền một đối tượng được tuần tự hóa qua một kênh ổ cắm. Tôi muốn tạo chuỗi "Hi friend" làm đối tượng được tuần tự hóa và sau đó viết đối tượng này vào kênh socket trong khi ở đầu kia tôi muốn đọc cùng một đối tượng và lấy dữ liệu.Cách gửi và nhận đối tượng được tuần tự hóa trong kênh ổ cắm

Tất cả những điều này tôi muốn thực hiện bằng Java SocketChannel. làm như thế nào? Tôi đã thử như dưới đây, nhưng không nhận được bất kỳ dữ liệu nào ở phía người nhận.

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; 
} 
+0

Java được thiếu! – tuergeist

+0

SocketChannel của bạn đã được mở và kết nối chưa? – tuergeist

+0

kênh ổ cắm có mở và kết nối –

Trả lời

31

xử lý SocketChannel của bạn có vẻ là không đầy đủ, xem hoàn ví dụ này cho SocketChannels chuyển một 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"); 
     } 
    } 
} 

Và 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"); 
    } 
} 

Khi bạn lần đầu tiên bắt đầu Server , sau đó là Người nhận, bạn sẽ nhận được kết quả sau:

console Server

Sender Start 
Connection ended 

console người nhận

Receiver Start 
String is: 'testtext' 
End Receiver 

Đây không phải là giải pháp tốt nhất, nhưng sau việc bạn sử dụng câu hỏi ServerSocketChannel

+0

Cảm ơn sự giúp đỡ của bạn –

+2

Nếu bạn thích câu trả lời, tôi đánh giá cao nếu bạn chấp nhận nó;) – tuergeist

+0

Bạn có ý nghĩa gì bởi "không phải là giải pháp tốt nhất". Bạn có thể giải thích thêm một chút không? Ngoài ra, nếu bạn quấn một luồng xung quanh một kênh, bạn có làm mất hiệu suất NIO không? Cảm ơn! – Jeach

Các vấn đề liên quan