2009-09-21 15 views
24

Seri hale getirilmiş bir nesneyi bir soket kanalı üzerinden aktarmak istiyorum. Seri hale getirilmiş nesne olarak "Merhaba arkadaşım" dizesini yapmak ve sonra bu nesneyi soket kanalına yazmak istiyorum, diğer ucunda ise aynı nesneyi okumak ve veriyi almak istiyorum.Senkronize edilmiş nesneyi soket kanalında nasıl gönderilir ve alırsınız

Java SocketChannel kullanarak yapmak istediğim tüm bu şeyler. Bu nasıl yapılır? Aşağıdaki gibi denedim, ancak alıcı tarafında herhangi bir veri almadım.

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

soruya kullanımınızı takip! – tuergeist

+0

SocketChannel'iniz zaten açık ve bağlı mı? – tuergeist

+0

evet soket kanalı açık ve bağlı –

cevap

31

Kişisel SocketChannel taşıma eksik gibi görünüyor, bir bayt aktarımı SocketChannels için bu tam örneğe bakın:

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

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

ilk Sunucusu başlatmak , daha sonra Alıcı, aşağıdaki çıktıyı alırsınız:

Sunucunun konsol

Sender Start 
Connection ended 

Alıcının konsol

Receiver Start 
String is: 'testtext' 
End Receiver 

Bu en iyi çözüm değildir, fakat eksik Java'nın ServerSocketChannel

+0

Yardımınız için teşekkürler –

+2

Cevabı beğenirseniz, kabul ederseniz memnun olurum;) – tuergeist

+0

"En iyi çözüm değil" ile ne kastediyorsunuz? Biraz daha detaylandırır mısın? Ayrıca, bir kanalın etrafına bir akış katıyorsanız, NIO performansını kaybediyor musunuz? Teşekkürler! – Jeach

İlgili konular