Java NIO 一直接收OP_ACCEPT的问题
import java.io.IOException;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.nio.channels.ClosedChannelException;
import java.nio.channels.SelectionKey;
import java.nio.channels.Selector;
import java.nio.channels.ServerSocketChannel;
import java.nio.channels.SocketChannel;
import java.util.Iterator;
import java.util.Set;
public class TCP {
ServerSocketChannel socketChannel;
Selector selector;
int port = 8778;
String[] opsName=new String[17];
public TCP(){
opsName[SelectionKey.OP_ACCEPT]="OP_ACCEPT";
opsName[SelectionKey.OP_CONNECT]="OP_CONNECT";
opsName[SelectionKey.OP_READ]="OP_READ";
opsName[SelectionKey.OP_WRITE]="OP_WRITE";
try {
socketChannel=ServerSocketChannel.open();
socketChannel.configureBlocking(false);
socketChannel.socket().setReuseAddress(true);
socketChannel.socket().bind(new InetSocketAddress(port));
selector=Selector.open();
System.out.println(socketChannel.hashCode());
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void start(){
try {
socketChannel.register(selector, SelectionKey.OP_ACCEPT);
} catch (ClosedChannelException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
System.out.println("server start port "+port);
while(true){
int n;
try {
System.out.print("wait...");
n = selector.select(60000);
System.out.println(n);
if(n<=0)continue;
Iterator<SelectionKey> it = selector.selectedKeys().iterator();
while(it.hasNext()){
SelectionKey key = it.next();
it.remove();
System.out.println("key:"+opsName[key.interestOps()]+","+key.channel().hashCode());
if(key.isReadable()){
System.out.println(key.hashCode()+" isReadable");
socketChannel.accept().register(selector, SelectionKey.OP_READ);
//问题2:socketChannel 与 (SocketChannel)socketChannel.accept() 这两个channel什么区别
}
else if(key.isAcceptable()){
//问题1:当一个客户端连接进来时,为什么这句话会一直重复地打印
System.out.println(key.hashCode()+" accepted");
}
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public static void main(String[] args) {
TCP tcp = new TCP();
tcp.start();
}
}
...全文
相关推荐
Java NIO原理图文分析及代码实现
- **事件注册与选择**:服务端的Selector注册了感兴趣的事件,例如OP_ACCEPT、OP_READ、OP_WRITE等,当这些事件发生时,Selector会通知服务端的处理线程。3.
浅谈java中nio的使用方式
SelectionKey的常量字段如OP_READ、OP_WRITE等标识了相应的操作。4.
深入了解java NIO之Selector(选择器)
3.可以使用或运算符(|)组合多个事件,例如,SelectionKey.OP_READ | SelectionKey.OP_WRITE。
java nio基础使用示例
```java SelectionKey skey = ssc.register(selector, SelectionKey.OP_ACCEPT); ```4.
Java NIO原理 图文分析及代码实现
传统的阻塞I/O模型在面对大量并发连接时存在明显的性能瓶颈,为了解决这一问题,Java NIO(New Input/Output)应运而生。


Java SE

