1. 客户端要主动去连接:channel.connect(new InetSocketAddress("localhost",8888)); //用channel.finishConnect();才能完成连接
2. 客户端的阻塞配置放到连接前面:socketClient.configureBlocking(false);
3. 客户端连接成功以后要断开连接:
// 如果正在连接,则完成连接
if(channel.isConnectionPending()){
channel.finishConnect();
}
4. 往通道里写数据:channel.write(ByteBuffer.wrap(new String("向服务端发送了一条信息").getBytes())); 从通道里读数据:channel.read(buffer);
5. 客户端调用:channel.close(), 服务端从channel中读取数据返回值为-1。
如果强制关闭客户端,服务器端会报异常:java.io.IOException: 远程主机强迫关闭了一个现有的连接。需要对服务器端通道做关闭处理,否则会一直异常。
6. 判断连接的类型:key.isConnectable(),key.isReadable(),key.isAcceptable()
8. java.io.IOException: 远程主机强迫关闭了一个现有的连接。
出现该异常的原因是因为:客户端没有调用close,直接关闭了通道,导致服务器端的连接通道依旧处于可读状态,但却无法读取数据,所以报IO异常。
这里需要加一个异常捕获,在捕获到异常后,服务器端应该主动关闭通道连接。
参考:http://blog.csdn.net/abc_key/article/details/29295569
9. 当客户端通道调用close()方法关闭通道的时候,服务端从通道读取获取的值为:-1。这里需要加一个判断,来关闭服务器端通道。