在傳統的阻塞線程的服務器,我會做這樣的事情爪哇 - 的readObject與NIO
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
}
}
}
現在,對象可以被預期是相當大的。在我的nio循環中,我不能簡單地等待對象通過,所有其他連接(工作量更小)都會等待我。
如何纔可以通知連接具有整個對象,然後它會告訴我的nio通道它已準備好?
阻塞IO不會縮放。由於堆棧線程大小在整個JVM中都是不變的,因此每個連接線程將與我的引擎線程(這將需要相當大)相同的堆棧大小。因此,即使只有3000個連接,這也使我處於384Mb只是爲了連接。這不會爲1Gb盒子上的系統,堆和數據庫留下太多空間。 cpu的需求將會足夠小,以至於我可以輕鬆處理超過10000個連接,從而限制內存使用量。 – corsiKa 2011-05-02 22:18:14
因此,在我發送大量數據首先讀取的情況下,我怎麼知道我排隊了多少數據直到...我讀了它? – corsiKa 2011-05-02 22:19:41
對每個對象(或對象組)使用一個新的ObjectOutputStream(新的ByteArrayOutputStream)這樣你就沒有數據排隊了,你把字節數組的長度發送爲一個int,接着是字節數組。 ,你需要讀取4字節的最小值,這將給你對於該對象的數據的其餘部分的長度 – 2011-05-02 22:25:23