非阻塞I/O中服务器得到的SocketChannel怎样进行管理? 一个Selector可以不只生成一个SelectionKey!如果要把这些客户连接进行分类,建议多监视几个端口!!!ServerSocketChannel能支持多少个客户连接,这就不知道了呵呵。。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 能有多少个客户端要看操作系统,以及系统资源。正常情况下,几百个肯定没问题。你可以用几个Selector对象分类注册管理。不是一个Selector只能生成一个SelectionKey。是在同一个Selector对象中注册一个ServerSocketChannel或SocketChannel只能生成一个SelectionKey对象 还有一个问题:public void startServer() throws IOException {........... SelectionKey acceptKey = server.register(sel, SelectionKey.OP_ACCEPT); while (acceptKey.selector().select() > 0) { try { Thread.currentThread().sleep(1); } catch (Exception ex) { } Set readyKeys = sel.selectedKeys(); Iterator it = readyKeys.iterator(); while (it.hasNext()) { SelectionKey key = (SelectionKey) it.next(); it.remove(); if (key.isAcceptable()) { System.out.println("Key is Acceptable"); ServerSocketChannel ssc = (ServerSocketChannel) key.channel(); socket = (SocketChannel) ssc.accept(); socket.configureBlocking(false); SelectionKey another = socket.register(sel, //此处设置有什么用? SelectionKey.OP_READ | SelectionKey.OP_WRITE); } if (key.isReadable()) {//此处的key.isReadable()在什么条件下才会执行 System.out.println("Key is readable"); String ret = readMessage(key); if (ret.length() > 0) { writeMessage(socket, ret); } } if (key.isWritable()) {//此处的key.isWritable()在什么条件下才会执行 String ret = readMessage(key); socket = (SocketChannel) key.channel(); if (result.length() > 0) { System.out.println("SendMSG:"+result); writeMessage(socket, ret); } } } } }为什么客户端连接后发送消息总是由key.isWritable()这一块进行处理 1.注册这个socket对象到selector对象中。selector对象select的时候会观察这个socket对象是否准备好进行读和写,如果准备好进行操作,就将相应的SelectionKey对象放入readyKeys中。2.key.isReadable: 当对端发数据过来,selector察觉到就会把SelectionKey放入readyKeys 中,同时改变对象内部状态,使key.isReadable()返回true。这时就可以进行读操作了3.我觉得,是当socket的缓冲区有空的时候,selector察觉到就会把SelectionKey放入readyKeys中,同时改变对象内部状态,使key.isWritable()返回true。这时就可以进行写操作了。 谢谢大家!我测试了一把发现:SelectionKey another = socket.register(sel,SelectionKey.OP_READ)这样key.isReadable是可以起作用的,而且发送也没有问题.如果是SelectionKey another = socket.register(sel,SelectionKey.OP_READ|SelectionKey.OP_WRITE)这样就算是把key.isWritable屏蔽掉,key.isReadable也是不起作用的,这是为什么? 如何在软件传送信息时实现加密解密? 继承中变量的问题 100分求助~!各位大虾帮帮忙啊~! 难道没有人可以解决我的问题吗? 高手在哪啊 我的一个纸牌游戏出现空指针 求高手帮忙解决 请问如何使Linux下的JVM运行Graphics 关于对象调用方法的问题 像这样的string a = 1+2+3+4; 怎么让他强制计算呢?? 初学java求助 ~急~####高分请教,不知道在哪问了,怎么在oracle中编写存储进程存入BLOB类型数据,最好是要有源程序!! 帮我 看看阿 ? sos.........
public void startServer() throws IOException {
...........
SelectionKey acceptKey = server.register(sel, SelectionKey.OP_ACCEPT); while (acceptKey.selector().select() > 0) {
try {
Thread.currentThread().sleep(1);
}
catch (Exception ex) {
} Set readyKeys = sel.selectedKeys();
Iterator it = readyKeys.iterator(); while (it.hasNext()) {
SelectionKey key = (SelectionKey) it.next();
it.remove();
if (key.isAcceptable()) {
System.out.println("Key is Acceptable");
ServerSocketChannel ssc = (ServerSocketChannel) key.channel();
socket = (SocketChannel) ssc.accept();
socket.configureBlocking(false);
SelectionKey another = socket.register(sel, //此处设置有什么用?
SelectionKey.OP_READ |
SelectionKey.OP_WRITE);
}
if (key.isReadable()) {//此处的key.isReadable()在什么条件下才会执行
System.out.println("Key is readable");
String ret = readMessage(key);
if (ret.length() > 0) {
writeMessage(socket, ret);
}
}
if (key.isWritable()) {//此处的key.isWritable()在什么条件下才会执行
String ret = readMessage(key);
socket = (SocketChannel) key.channel();
if (result.length() > 0) {
System.out.println("SendMSG:"+result);
writeMessage(socket, ret);
}
}
}
}
}
为什么客户端连接后发送消息总是由key.isWritable()这一块进行处理
我测试了一把发现:
SelectionKey another = socket.register(sel,SelectionKey.OP_READ)
这样key.isReadable是可以起作用的,而且发送也没有问题.如果是
SelectionKey another = socket.register(sel,SelectionKey.OP_READ|SelectionKey.OP_WRITE)
这样就算是把key.isWritable屏蔽掉,key.isReadable也是不起作用的,
这是为什么?