2013-11-15 53 views
0

我有一个聊天Java服务器,实际上它接收客户端并将他的id插入到一个deque中,并将其id和socket插入到hashmap中。在另一个线程中,服务器迭代deque并检查客户端是否正在发送消息,以防服务器在另一个线程中使用某个操作符来管理它。我的“问题”是迭代deque(或列表)是一个缓慢的操作,如果我有数以百万计的人连接它应该迭代太多的项目。所以我问你是否有更好的方法来做到这一点。这里是瓶颈的代码:检查在Java服务器中是否有来自客户端的消息

while(true){ 
    String id = MainServer.deque_id.poll(); 
    Socket socket = MainServer.map_socket.get(id); 
    if(new PushbackInputStream(socket.getInputStream()).available() > 0) 
     MainServer.queue_manage_message.put(new ManageMessageTask(id, socket, true)); 
    MainServer.deque_id.addLast(id); 
} 

回答

0

你不需要构造一个PushbackInputStream来调用available()然后抛出流。所有的InputStream都有可用的(),尽管它并不适用于所有的InputStream。

对于阻塞I/O,每个连接至少需要一个线程,也许两个,一个用于输入,一个用于输出。

否则,您需要查看使用选择器和通道的非阻塞和多路复用I/O。请参阅java.nio.channels包。

+0

我试着从inputStream类调用available(),它不起作用(解决方案是使用PushbackInputStream)。我将学习NIO。谢谢 – AnimalsPf

+0

PushbackInputStream.available()不可能比它包装的流的available()方法更好地工作,除非你已经推回了它的东西,而你没有。 – EJP

+0

@AnimalsPf:您对PIS的使用是根据[源代码](http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/io/ PushbackInputStream.java#PushbackInputStream。%3Cinit%3E%28java.io.InputStream%2Cint%29)无操作。 – maaartinus

相关问题