打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
Java 网络IO编程总结(BIO、NIO、AIO均含完整实例代码)
  • 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();  
  •         }  
  •     }  
  • 本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
    打开APP,阅读全文并永久保存 查看更多类似文章
    猜你喜欢
    类似文章
    【热】打开小程序,算一算2024你的财运
    JAVA NIO 简介
    Java NIO与IO的区别和比较
    Java NIO API详解
    JavaNIO中的Channel概述
    Java NIO:NIO概述
    Java NIO TCP编程
    更多类似文章 >>
    生活服务
    热点新闻
    分享 收藏 导长图 关注 下载文章
    绑定账号成功
    后续可登录账号畅享VIP特权!
    如果VIP功能使用有故障,
    可点击这里联系客服!

    联系客服