DatagramChannel datagramChannel_T=null;
try {
selector = Selector.open(); datagramChannel_T=DatagramChannel.open();
datagramChannel_T.configureBlocking(false);//设置为非阻塞
datagramChannel_T.socket().bind(new InetSocketAddress(10000)); // 收数据端口 // OP_ACCEPT(用于服务器端)、OP_CONNECT(用于客户端)、OP_READ和OP_WRITE
datagramChannel_T.register(selector, SelectionKey.OP_READ); //因为UDP 不存在 客户端和服务器连接,所以不能用 OP_ACCEPT
}
catch ( Exception e )
{
e.printStackTrace () ;
}
byte[] bufferData=new byte[1500];
ByteBuffer byteBuffer = ByteBuffer.wrap(bufferData); while ( true)
{
try
{
int eventsCount = selector.selectNow();
if(eventsCount == 0)
{
continue;
} if ( eventsCount > 0 ) {
Iterator<SelectionKey> iterator = selector.selectedKeys () .iterator ();
while ( iterator.hasNext ()) {
SelectionKey sk = ( SelectionKey ) iterator.next () ;
iterator.remove () ;
if ( sk.isReadable ()) {
DatagramChannel datagramChannel = ( DatagramChannel ) sk .channel () ;
datagramChannel.receive(byteBuffer);
byteBuffer.flip () ;
byte[] byten = new byte[byteBuffer.limit()]; // 可用的字节数量
byteBuffer.get(byten, byteBuffer.position(), byteBuffer.limit()); // 得到目前为止缓冲区所有的数据
byteBuffer.clear () ;
}
}
}
}
catch ( Exception e )
{
e.printStackTrace ();
break;
}
}
}
}
这代码 是android 下利用NIO技术 来通过udp协议收流, 这个是非阻塞的, 是基于IO事件来轮训 ,效率高于socket那种阻塞模型,这个NIO技术还是基于socket 的