JAVA NIO 基礎學習
服務端 監聽
package com.hrd.netty.demo.jnio;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
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;
/**
* Created by hurd on 2016/1/26.
*/
public class NioServerListener extends Thread {
protected Selector selector;
protected SocketChannel socketChannel;
public NioServerListener(Selector selector){
this.selector = selector;
}
@Override
public void run(){
try {
//while循環監聽事件
while(true){
//阻塞
selector.select();
//獲取選擇器中已經就緒的SelectionKey集合
Iterator<SelectionKey> iterator = selector.selectedKeys().iterator();
//遍歷
while (iterator.hasNext()){
SelectionKey key = iterator.next();
//刪除
iterator.remove();
//接受連接就緒事件
if(key.isAcceptable()){
ServerSocketChannel ssc = (ServerSocketChannel) key.channel();
socketChannel = ssc.accept();
//套接字通道設置為非阻塞模式
socketChannel.configureBlocking(false);
//向socket通道 注冊讀就緒事件
socketChannel.register(selector, SelectionKey.OP_READ);
}else if(key.isReadable()){
//SocketChannel socketChannel = (SocketChannel) key.channel();
ByteBuffer byteBuffer = ByteBuffer.allocate(100);
int len = socketChannel.read(byteBuffer);
/*StringBuffer dataBuffer= new StringBuffer();
while( -1 != len){
//將寫模式變為讀模式
byteBuffer.flip();
CharBuffer charBuffer = byteBuffer.asCharBuffer();
dataBuffer.append(charBuffer.array());
byteBuffer.clear();
len = socketChannel.read(byteBuffer);
}*/
byteBuffer.flip();
//讀取完畢
if(byteBuffer.limit()>0){
System.out.println("來自服務端消息:" + new String(byteBuffer.array()).trim());
}
}else if(key.isWritable()){
//暫時還沒想明白這個寫就緒事件干嘛用的。。。
System.out.println("暫不處理");
}
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) throws IOException {
//打開一個 ServerSocketChannel實例 并設置為false
ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
serverSocketChannel.configureBlocking(false);
//綁定ip +端口
serverSocketChannel.socket().bind(new InetSocketAddress("127.0.0.1",1024));
//打開一個選擇器
Selector selector = Selector.open();
//向 serverSocketChannel 注冊 接收就緒事件
serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT);
//開啟線程進行監聽
NioServerListener listener = new NioServerListener (selector);
listener.start();
//進行控制太輸入 寫事件 進行通訊
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
while(true){
//java IO 阻塞讀取數據
String data = bufferedReader.readLine();
if("exit".equals(data)){
if(null != listener.socketChannel){
listener.socketChannel.close();
}
System.out.println("主線程關閉.....");
System.exit(0);
}
ByteBuffer buffer = ByteBuffer.wrap(data.getBytes());
listener.socketChannel.write(buffer);
}
}
}
客戶端 監聽
package com.hrd.netty.demo.jnio;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.SelectionKey;
import java.nio.channels.Selector;
import java.nio.channels.SocketChannel;
import java.util.Iterator;
/**
* Created by hurd on 2016/1/26.
*/
public class NioClientListener extends Thread {
public Selector selector;
public SocketChannel socketChannel;
public NioClientListener(Selector selector){
this.selector = selector;
}
@Override
public void run(){
try {
//while循環監聽事件
while(true){
//阻塞
selector.select();
//獲取選擇器中已經就緒的SelectionKey集合
Iterator<SelectionKey> iterator = selector.selectedKeys().iterator();
//遍歷
while (iterator.hasNext()){
SelectionKey key = iterator.next();
//刪除
iterator.remove();
socketChannel = (SocketChannel) key.channel();
//套接字通道設置為非阻塞模式
socketChannel.configureBlocking(false);
//連接就緒事件
if(key.isConnectable()){
socketChannel = (SocketChannel) key.channel();
//判斷連接是否完成
int i =0;
while(! socketChannel.finishConnect()){
if(++i>10){
throw new RuntimeException("socket連接超時");
}
System.out.println("sock連接未完成,等待中....");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//向socket通道 注冊讀就緒事件
socketChannel.register(selector, SelectionKey.OP_READ);
}else if(key.isReadable()){
//SocketChannel socketChannel = (SocketChannel) key.channel();
ByteBuffer byteBuffer = ByteBuffer.allocate(100);
int len = socketChannel.read(byteBuffer);
/*StringBuffer dataBuffer= new StringBuffer();
while( -1 != len){
//將寫模式變為讀模式
byteBuffer.flip();
CharBuffer charBuffer = byteBuffer.asCharBuffer();
dataBuffer.append(charBuffer.array());
byteBuffer.clear();
len = socketChannel.read(byteBuffer);
}*/
byteBuffer.flip();
//讀取完畢
if(byteBuffer.limit()>0){
System.out.println("來自服務端消息:" + new String(byteBuffer.array()).trim());
}
}else if(key.isWritable()){
//暫時還沒想明白這個寫就緒事件干嘛用的。。。
System.out.println("暫不處理");
}
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) throws IOException {
//打開一個SocketChannel實例 并設置為false
SocketChannel socketChannel = SocketChannel.open();
socketChannel.configureBlocking(false);
//綁定ip +端口
socketChannel.connect(new InetSocketAddress("127.0.0.1",1024));
//打開一個選擇器
Selector selector = Selector.open();
//向 serverSocketChannel 注冊 連接就緒事件
socketChannel.register(selector, SelectionKey.OP_CONNECT);
//開啟線程進行監聽
NioClientListener listener = new NioClientListener (selector);
listener.start();
//進行控制太輸入 寫事件 進行通訊
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
while(true){
//java IO 阻塞讀取數據
String data = bufferedReader.readLine();
if("exit".equals(data)){
socketChannel.close();
System.out.println("主線程關閉.....");
System.exit(0);
}
ByteBuffer buffer = ByteBuffer.wrap(data.getBytes());
socketChannel.write(buffer);
}
}
}
本文由用戶 cyjjkz1 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!