在传统的阻塞线程的服务器,我会做这样的事情爪哇 - 的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