博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java nio 服务器端读取客户端的输入请求
阅读量:6408 次
发布时间:2019-06-23

本文共 2337 字,大约阅读时间需要 7 分钟。

hot3.png

import java.net.InetSocketAddress;import java.nio.ByteBuffer;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 ServerChannelTest{    public static void main(String[] args)    {	new ServerChannelTest().listen();    }    public void listen()    {	try	{	    ByteBuffer bb = ByteBuffer.allocate(1024);				    ServerSocketChannel ssc = ServerSocketChannel.open();	    ssc.socket().bind(new InetSocketAddress(10011));//绑定端口10011,wildcard ip	    ssc.configureBlocking(false);// 设置为非阻塞	    Selector selector = Selector.open();	    ssc.register(selector, SelectionKey.OP_ACCEPT);// 注册监听	    debug("注册监听成功!");				    while (true)	    {		Thread.sleep(1000);// 为了方便看到输出。						debug("检测是否有SelectionKey,并且select");					if (selector.select(1000) <= 0)// 设置timeout为1秒,否则会阻塞在select() 		{			continue;		}// 没有事件被选中						Set
set = selector.selectedKeys(); Iterator
it = set.iterator(); while (it.hasNext()) { SelectionKey key = it.next(); debug("取出SelectedKeys"); if (key.isAcceptable()) { debug("ACCEPT key"); ServerSocketChannel ssChannel = (ServerSocketChannel)key.channel(); SocketChannel sc = ssChannel.accept();// accept a connection // 重要!否则抛出java.nio.channels.IllegalBlockingModeException。 // 要与ServerSocketChannel一致。 sc.configureBlocking(false); // 注意!不要注册SelectionKey.OP_WRITE.否则每次都能select到它,性能降低。// sc.register(selector, SelectionKey.OP_READ | SelectionKey.OP_WRITE); sc.register(selector, SelectionKey.OP_READ); } else if (key.isReadable()) { debug("READ key"); SocketChannel sc = (SocketChannel)key.channel(); bb.clear(); if (sc.read(bb) < 0) { // read()返回-1表明到达输入流尾。经验证也就是客户端断开了连接。 System.out.println("客户端断开了连接"); sc.close(); break; } bb.flip(); System.out.println(bb.get(0)); }// else if (key.isWritable())// {// debug("WRITE key");// }// 每次都会取得WRITE key,即使你 不需要。 it.remove();//删除处理过的key } } } catch (Exception e) { e.printStackTrace(); } } public static void debug(String str) { System.out.println(str); }}

转载于:https://my.oschina.net/u/196340/blog/36684

你可能感兴趣的文章
lvm实现快速备份文件及数据库,lvm快照原理
查看>>
通常,人们会高估自己的学习能力
查看>>
设计模式之Factory Method(工厂方法)
查看>>
10K入职linux运维岗位小伙伴感谢信及面试经历分享
查看>>
Gartner:智能SOC/情报驱动的SOC的五大特征
查看>>
zookeeper入门之Curator的使用之几种监听器的使用
查看>>
[转]Reporting Service部署之访问权限
查看>>
innerxml and outerxml
查看>>
C# 查农历 阴历 阳历 公历 节假日
查看>>
validform校验框架不显示错误提示
查看>>
flink 获取上传的Jar源码
查看>>
Redis实现聊天功能
查看>>
ZAB协议简介
查看>>
读QT5.7源码(三)Q_OBJECT 和QMetaObject
查看>>
Spring Data JPA Batch Insertion
查看>>
swift Equatable 的缺省实现
查看>>
mongodb索引
查看>>
特征探索经验
查看>>
UEditor自动调节宽度
查看>>
Unity中使用多构造函数
查看>>