Java - ReadObject mit nio
In einem traditionellen blocking-thread-server, ich würde so etwas tun
class ServerSideThread {
ObjectInputStream in;
ObjectOutputStream out;
Engine engine;
public ServerSideThread(Socket socket, Engine engine) {
in = new ObjectInputStream(socket.getInputStream());
out = new ObjectOutputStream(socket.getOutputStream());
this.engine = engine;
}
public void sendMessage(Message m) {
out.writeObject(m);
}
public void run() {
while(true) {
Message m = (Message)in.readObject();
engine.queueMessage(m,this); //give the engine a message with this as a callback
}
}
}
Nun, das Objekt kann erwartet werden, ziemlich groß sein. In meinem nio-Schleife, ich kann nicht einfach warten, bis das Objekt, durch zu kommen, alle meine anderen verbindungen (mit viel kleinerer workloads) wartet auf mich.
Wie bekomme ich nur mitgeteilt, dass eine Verbindung für das gesamte Objekt, bevor es erzählt meine nio-Kanal bereit?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Schreiben Sie das Objekt in einen ByteArrayOutputStream so dass Sie geben Sie die Länge, bevor ein Objekt gesendet. Auf der empfangenden Seite, Lesen Sie die Menge der Daten, die erforderlich sind, bevor Sie versuchen, Sie zu entschlüsseln.
Jedoch, werden Sie wahrscheinlich finden es viel einfacher und effizienter zu bedienen-blocking IO (anstatt NIO) mit der Object*Stream
Bearbeiten, so etwas wie dieses
new ObjectOutputStream(new ByteArrayOutputStream
mit jedem Objekt (oder Gruppe von Objekten) auf diese Weise haben Sie keine Daten in die Warteschlange eingereiht. Senden Sie die Länge des byte-Arrays alsint
gefolgt von dem byte-array. Auf der Seite Lesen, sollten Sie Lesen, 4 byte, minimum, das Ihnen die Länge der den rest für die Daten für das Objekt.new ObjectOutputStream()
mit jedem Objekt über eine einzigeObjectOutput/InputStream
- pair-Mädchen für die gesamte Sitzung: Erstens, Daten müssen nur einmal gesendet werden, wie die Header und verschiedene meta-Informationen über Arten, wird sich ärgern, für jeden senden. Zweite, gemeinsame Instanzen auf sender-Seite werden Unterschied verweist, wenn Sie empfangen auf mehrere sendet.Inspiriert durch den code oben habe ich einen (GoogleCode-Projekt)
Es enthält einen einfachen unit-test: