2009-09-21 8 views
24

Ich möchte ein serialisiertes Objekt über einen Socket-Kanal übertragen. Ich möchte "Hallo Freund" Zeichenfolge als serialisierte Objekt und dann dieses Objekt in Socket-Kanal schreiben, während am anderen Ende möchte ich das gleiche Objekt lesen und die Daten abrufen.Wie serialisiertes Objekt in Socket-Kanal senden und empfangen

All diese Dinge möchte ich mit Java SocketChannel tun. Wie macht man das? Ich habe versucht, wie unten, aber keine Daten auf der Empfängerseite erhalten.

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

die Frage des Java fehlt! – tuergeist

+0

Ist Ihr SocketChannel bereits geöffnet und verbunden? – tuergeist

+0

ja Socket-Kanal ist offen und verbunden –

Antwort

31

Ihre Socket Handhabung scheint unvollständig zu sein, finden Sie in diesem komplette Beispiel für SocketChannels ein Byte zu übertragen:

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

und der Leser

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

Wenn Sie zuerst den Server starten , dann der Empfänger, erhalten Sie die folgende Ausgabe:

Server Konsole

Sender Start 
Connection ended 

Empfängers Konsole

Receiver Start 
String is: 'testtext' 
End Receiver 

Dies ist nicht die beste Lösung, aber folgt die Nutzung von ServerSocketChannel

+0

Danke für Ihre Hilfe –

+2

Wenn Sie die Antwort mögen, würde ich mich freuen, wenn Sie es akzeptieren würden;) – tuergeist

+0

Was meinst du mit "nicht die beste Lösung". Könntest du etwas mehr ausarbeiten? Wenn Sie einen Stream um einen Kanal wickeln, verlieren Sie dann die NIO-Leistung? Vielen Dank! – Jeach

Verwandte Themen