【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,我给你改改