当前位置: 代码迷 >> J2SE >> 【JAVA NIO多线程访问有关问题】 -候,立马给分
  详细解决方案

【JAVA NIO多线程访问有关问题】 -候,立马给分

热度:76   发布时间:2016-04-24 00:22:32.0
【JAVA NIO多线程访问问题】 --在线等候,立马给分
我现在正在做一个游戏的服务器,使用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);

}


------解决方案--------------------
NIO有其复杂性,不搞清楚原理,你很难用好。

看看这篇文章吧:
http://rox-xmlrpc.sourceforge.net/niotut/
------解决方案--------------------
需要了解消息发送方的协议,是如何进行分包发送的。 

如果消息发送方也是你自己实现的就比较好办了。 

一般来说,分包发送需要有sessionID和序列号。 
sessionID用于解决你的第二个问题,序列号解决你的第一个问题。 
也可以参考TCP的实现,不过TCP协议中好像没有sessionID







每个连接都会有IP吧
------解决方案--------------------
你把程序发到我邮箱,SnowingXimen@163.com,我给你改改
  相关解决方案