我现在正在做一个游戏的服务器,使用java中的NIO。
    需要大概是这样的:客户端跟服务器通过Socket连接后,双方相互交互数据。(客户端是 Flash)服务器端对客户端进行分房间,然后跟据房间发送相应的数据。
    现在的问题是:现在的问题是NIO是通过Selector事件监听的,好像是轮训式的,只有客户端发送请求了才可以给予回复。
我如何才可以把客户端过来的连接分成房间,然后主动给不同的房间发送不同的数据呢?

主要代码如下:

protected Selector getSelector(int port) throws IOException {
server = ServerSocketChannel.open();
selector = Selector.open();
server.socket().bind(new InetSocketAddress(port));
server.configureBlocking(false);
server.register(selector, SelectionKey.OP_ACCEPT);
System.out.println("服务器已经启动,端口号:"+port);
return selector;
} public void listen() {
try {
while (true) {
selector.select();
Iterator<SelectionKey> iterator = selector.selectedKeys().iterator();
while (iterator.hasNext()) {
SelectionKey key = (SelectionKey) iterator.next();
iterator.remove();
process(key);
}
}
} catch (IOException e) {
e.printStackTrace();
}
} protected void process(SelectionKey key) throws IOException {
if (key.isAcceptable()) {
ServerSocketChannel server = (ServerSocketChannel) key.channel();
SocketChannel channel = server.accept();
channel.configureBlocking(false);
channel.register(selector, SelectionKey.OP_READ);
} else if (key.isReadable()) {
SocketChannel channel = (SocketChannel) key.channel();
Reader reader = new Reader(channel);
pool.execute(reader);

}

解决方案 »

  1.   

    NIO有其复杂性,不搞清楚原理,你很难用好。看看这篇文章吧:
    http://rox-xmlrpc.sourceforge.net/niotut/
      

  2.   

    需要了解消息发送方的协议,是如何进行分包发送的。 如果消息发送方也是你自己实现的就比较好办了。 一般来说,分包发送需要有sessionID和序列号。 
    sessionID用于解决你的第二个问题,序列号解决你的第一个问题。 
    也可以参考TCP的实现,不过TCP协议中好像没有sessionID每个连接都会有IP吧
      

  3.   

    楼主的问题似乎不是nio的问题,不知我理解的是否正确,似乎是,server端收到消息后,根据消息内容或者协议,按照约定的规则分发给不同的客户端。这个似乎是server端调度的问题。楼主考虑一下这种方式是否可行:
    1、客户端跟服务端链接,每个客户端要有固定的id;并且存储id跟链接的对应《id,客户端》。
    2、server端收到消息后,解析处理,根据消息内容,从存储的《id,客户端》获取跟客户端的链接,发送消息。建议楼主看一下apache的mina项目,
      

  4.   


    这个文章确实不错,不过我的英文一般,我理解的意思这篇文章只是对NIO的使用的一些体会和自己的一些例子,但是我好像没有找到针对我问题的答案啊。不过还是谢谢你推荐的文章!
      

  5.   


    你的这个解决方案好像就是 java.net中 socket的处理逻辑和方法。原本也想用这个呢,但是这是个阻塞式的socket连接,服务器所能承受的连接最多7500左右服务器就崩了。用NIO非阻塞可以承受到2万左右。
    但是在NIO里面我无法使用你的这个方案,因为NIO的机制目前我理解还是不够,现在掌握的情况是实现不了的
      

  6.   


        我想NIO的实现应该也是有一个ID或者序列号之类的来区分不同的客户端,但是在NIO的API好像没有提供给我们使用啊,或者是有的,但是我还不知道怎么用。
      

  7.   


    其实这篇文章已经基本包含了你要的所有,只是你可能真的没有看太明白,或者没有耐心看下去。因为这篇文章,也是在讲基于NIO的一个server,有如何侦听,如何接受链接,如何读数据,如何发送数据等等。
      

  8.   


       可能本人水平确实有限,文章中确实有如何侦听,如何接受链接,如何读数据,如何发送数据,这些我都已经明白了。但是这个模式是每次都要轮训的,没有把每一个客户端过来的socket连接保存起来,有一个管理,并且主动给客户端发送数据,只是客户端有请求过来了,服务器端根据请求再做处理。我需要的是只要客户端建立连接后,不需要客户端再次发送请求,服务器端也可以直接发送数据的。
      

  9.   

    我明白你的意思:例子里的都是这样的,基于请求/响应模式的--也就是说,客户端来了请求,然后服务器响应。而你需要的是,保留连接状态,然后,服务器主动发消息给客户端。现在,你不知道,服务器怎样主动发消息给客户端,对吧?我知道,这个NIO用起来,非常麻烦。
      

  10.   

    你把程序发到我邮箱,[email protected],我给你改改