分享

Java 网络IO编程总结(BIO、NIO、AIO均含完整实例代码)

 land_zhj 2018-04-13
  • import java.io.IOException;  
  • import java.io.UnsupportedEncodingException;  
  • import java.nio.ByteBuffer;  
  • import java.nio.channels.AsynchronousSocketChannel;  
  • import java.nio.channels.CompletionHandler;  
  • import com.anxpp.io.utils.Calculator;  
  • public class ReadHandler implements CompletionHandler<Integer, ByteBuffer> {  
  •     //用于读取半包消息和发送应答  
  •     private AsynchronousSocketChannel channel;  
  •     public ReadHandler(AsynchronousSocketChannel channel) {  
  •             this.channel = channel;  
  •     }  
  •     //读取到消息后的处理  
  •     @Override  
  •     public void completed(Integer result, ByteBuffer attachment) {  
  •         //flip操作  
  •         attachment.flip();  
  •         //根据  
  •         byte[] message = new byte[attachment.remaining()];  
  •         attachment.get(message);  
  •         try {  
  •             String expression = new String(message, "UTF-8");  
  •             System.out.println("服务器收到消息: " + expression);  
  •             String calrResult = null;  
  •             try{  
  •                 calrResult = Calculator.cal(expression).toString();  
  •             }catch(Exception e){  
  •                 calrResult = "计算错误:" + e.getMessage();  
  •             }  
  •             //向客户端发送消息  
  •             doWrite(calrResult);  
  •         } catch (UnsupportedEncodingException e) {  
  •             e.printStackTrace();  
  •         }  
  •     }  
  •     //发送消息  
  •     private void doWrite(String result) {  
  •         byte[] bytes = result.getBytes();  
  •         ByteBuffer writeBuffer = ByteBuffer.allocate(bytes.length);  
  •         writeBuffer.put(bytes);  
  •         writeBuffer.flip();  
  •         //异步写数据 参数与前面的read一样  
  •         channel.write(writeBuffer, writeBuffer,new CompletionHandler<Integer, ByteBuffer>() {  
  •             @Override  
  •             public void completed(Integer result, ByteBuffer buffer) {  
  •                 //如果没有发送完,就继续发送直到完成  
  •                 if (buffer.hasRemaining())  
  •                     channel.write(buffer, buffer, this);  
  •                 else{  
  •                     //创建新的Buffer  
  •                     ByteBuffer readBuffer = ByteBuffer.allocate(1024);  
  •                     //异步读  第三个参数为接收消息回调的业务Handler  
  •                     channel.read(readBuffer, readBuffer, new ReadHandler(channel));  
  •                 }  
  •             }  
  •             @Override  
  •             public void failed(Throwable exc, ByteBuffer attachment) {  
  •                 try {  
  •                     channel.close();  
  •                 } catch (IOException e) {  
  •                 }  
  •             }  
  •         });  
  •     }  
  •     @Override  
  •     public void failed(Throwable exc, ByteBuffer attachment) {  
  •         try {  
  •             this.channel.close();  
  •         } catch (IOException e) {  
  •             e.printStackTrace();  
  •         }  
  •     }  
    • 本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
      转藏 分享 献花(0

      0条评论

      发表

      请遵守用户 评论公约

      类似文章 更多