nio不是一个异步的通讯模式
只是提供了一个非阻塞模式,避免了通讯效率过低
一个线程可以管理多个连接,来减少线程的压力
selector = Selector.open();
socketChannel = SocketChannel.open();
socketChannel.configureBlocking(false); // 非阻塞
if (socketChannel.connect(new InetSocketAddress(host, port)))
{
socketChannel.register(selector, SelectionKey.OP_READ);
doWrite(socketChannel);
}
else
{
socketChannel.register(selector, SelectionKey.OP_CONNECT);
}
selector.select(1000);
//检查是否有响应
Set<SelectionKey> selectedKeys = selector.selectedKeys();
Iterator<SelectionKey> it = selectedKeys.iterator();
SelectionKey key = null;
while (it.hasNext())
{
//如果有响应开始进行处理
key = it.next();
it.remove();
try
{
//处理每一个channel
handleInput(selector, key);
}
catch (Exception e) {
if (key != null) {
key.cancel();
if (key.channel() != null)
key.channel().close();
}
}
}
if (key.isValid()) {
// 判断是否连接成功
SocketChannel sc = (SocketChannel) key.channel();
if (key.isConnectable()) {
if (sc.finishConnect()) {
sc.register(selector, SelectionKey.OP_READ);
}
}
if (key.isReadable()) {
ByteBuffer readBuffer = ByteBuffer.allocate(1024); //分配空间
int readBytes = sc.read(readBuffer);//读数据
if (readBytes > 0) {
//如果有数据的话转成字符串做其他处理
readBuffer.flip();
byte[] bytes = new byte[readBuffer.remaining()];
readBuffer.get(bytes);
String body = new String(bytes, "UTF-8");
System.out.println("Server said : " + body);
} else if (readBytes < 0) {
// 对端链路关闭
key.cancel();
sc.close();
} else
; // 读到0字节,忽略
}
Thread.sleep(3000);
doWrite(sc);
}
并发变成的同步:是指多个线程需要以一种同步的方式来访问某一个数据结构。这里的同步反义词是非同步的,也就是线程不安全的。
网络通讯的同步:是指客户端和服务端直接的通讯等待方式。这里的同步的反义词是异步,也就是无需等待另外一段操作完成。