如何使用 CompletionHandlers 和小于请求的 ByteBuffer 读取请求?

2023-12-04

我正在使用 Java 7 和AsynchronousSocketChannel。我想阅读一个请求(例如HTTP POST)但我正在努力想出一个很好的解决方案来读取完整的请求(如果它大于大小)ByteBuffer我在用着。例如。如果ByteBuffer为 4048 字节,HTTP POST 包含大于 4kB 的图像。

有什么好的递归解决方案或循环吗?

这是我的阅读请求代码:

public void readRequest(final AsynchronousSocketChannel ch) {
    final ByteBuffer buffer = ByteBuffer.allocate(BUFFER_SIZE);
    final StringBuilder strBuilder = new StringBuilder();
    final CharsetDecoder decoder = Charset.forName("US-ASCII").newDecoder();
                    
    ch.read(buffer, null, new CompletionHandler<Integer, Void>() {
                        
        public void completed(Integer bytes, Void att) {
                        
            buffer.flip();                          
            try {
                decoder.reset();
                strBuilder.append(decoder.decode(buffer).toString());
            } catch (CharacterCodingException e) {
                e.printStackTrace();
            }           
            buffer.clear();         

            // More data to read or send response
            if(bytes != -1) {

                // More data to read
                ch.read(...);

            } else {
            
                // Create and send a response
    
            }
        }

        public void failed(Throwable exc, Void att) {
            exc.printStackTrace();
        }

    });
}

我在其中写道:

// More data to read
ch.read(...);

它看起来是代码重用的好地方,但我无法想出一个好的解决方案。有什么办法可以在这里重用 CompletionHandler 吗?对于阅读有限的完整请求的任何建议ByteBuffer?

我想以非阻塞和异步的方式解决这个问题。


The completed当读取数据块时,从 java 管理的线程异步调用方法。要重用 CompletionHandler:

// More data to read
ch.read(buffer, null, this); //here you pass the same CompletionHandler you are using

java 人员建议当您完成读取操作时(else块)你应该使用另一个线程上下文。

该文件指出要避免在 a 内阻塞和长期运行CompletionHandler,查看第33页http://openjdk.java.net/projects/nio/presentations/TS-4222.pdf

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 CompletionHandlers 和小于请求的 ByteBuffer 读取请求? 的相关文章

  • 使用 java 删除 XML 根的子级

    这是我的 xml 文件
  • Android:java.lang.OutOfMemoryError:

    我在 Android 上开发了一个使用大量图像的应用程序 可绘制文件夹中有很多图像 比如说超过 100 张 我正在开发图像动画应用程序 我使用 imageview 来显示 GIF 图像 我使用了将 gif 图像分割成多个 PNG 格式图像的
  • 将处理项目移至 Eclipse

    我已经在处理项目上工作了一段时间 现在想将其移至 Eclipse 中 我已经在 Eclipse 环境中安装了 Proclipse 我有很多扩展名为 pde 的文件 然而 Proclipse 文件都以 java 结尾 所有 pde 文件都存在
  • 如何在 Android 中的 Chrome 或 Firefox 等特定浏览器的 Web 视图中加载应用程序

    我是 Android 新手 我正在做一个应用程序 我需要在平板电脑上的 Web 视图中加载现有的应用程序 在平板电脑中 当我使用 Web 视图加载应用程序时 我的应用程序将加载到默认浏览器中 如何在平板电脑上的 Web 视图中的特定浏览器
  • Hashset - 创建 Set 后使对象相同

    如果我们在 HashSet 中添加两个不同的对象 可变的 然后通过调用 setter 更改对象的值 使它们相同 则大小仍然是 hashSet 的 2 我无法理解其原因 public static void main String args
  • H2数据库:如何进行加密保护,而不暴露文件加密密钥

    我们在服务器模式下使用Java H2数据库 因为我们不希望用户访问数据库文件 为了对数据库文件添加更多保护 我们计划使用 AES 加密 将 CIPHER AES 添加到数据库 URL 以防存储被盗 但是 每个用户在连接时还需要提供文件保护密
  • 使用全局变量从内部函数获取空字符串

    请帮助我解决一些小问题 我确信你能做到 D 我试图在 firestore 文档 user cases information 上设置一个字段 其中包含一个字段 case number 首先我声明这个全局变量 private String c
  • Java Junit 测试 HTTP POST 请求

    我需要测试以下方法而不改变方法本身 该方法向服务器发出 POST 方法 但我需要制作一个独立于服务器的测试用例 在将其重定向到本地文件之前 我测试了类似的方法 但为此我将协议指定为文件 主机名指定为 localhost 端口指定为 1 我的
  • 绘制平滑曲线

    我想创建更平滑的曲线 而不仅仅是线角 这是我现在画的图 这是我的代码 case FREEHAND float pts float ptk ptk new float 2 imageMatrix invert inv if mCurrentS
  • 但是创建静态实用方法不应该被过度使用吗?如何避免呢? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 随着时间的推移 java项目中引入了许多实用方法来完成更复杂和简单的任务 当使用静态方法时 我们在代码中引入了紧密耦合 这使得我们的代
  • 如何让“循环”泛型在 Java 中工作?

    我在编译以下涉及一些泛型的代码时遇到错误 public abstract class State
  • 避免 @Secured 注释的重复值

    我正在尝试使用以下方法来保护我的服务方法 Secured如下 public interface IUserService Secured ROLE ROLE1 ROLE ROLE2 ResponseEntity saveUser Creat
  • ActiveMQ JNDI 查找问题

    尝试使用 JNDI 运行以下 ActiveMQ http activemq apache org jndi support html http ActiveMQ 20JNDI 并且我的 jboss server node lib 文件夹中有
  • Java HashSet 是线程安全的只读吗?

    如果我通过 Collections unmodifyingSet 运行 HashSet 实例后 它是线程安全的吗 我问这个是因为 Set 文档声明它不是 但我只是执行读取操作 来自 Javadoc 请注意 此实现不是同步的 如果多个线程同时
  • 从字节数组设置 img src

    我需要设置img src我在对象中拥有的字节数组的属性 img
  • 为什么不能在 if 语句中声明变量?

    以下 Java 代码无法编译 int a 0 if a 1 int b 0 if a 1 b 1 为什么 不能有任何代码路径导致程序将 1 分配给b无需先声明 我突然想到b的变量范围可能仅限于第一个if声明 但后来我不明白为什么 如果我实在
  • java Web应用程序中的日期转换

    String date1 13 03 2014 16 56 46 AEDT SimpleDateFormat sdf new SimpleDateFormat dd MM yyyy HH mm ss z sdf setTimeZone Ti
  • Java 中序列化的目的是什么?

    我读过很多关于序列化的文章 以及它如何如此美好和伟大 但没有一个论点足够令人信服 我想知道是否有人能真正告诉我通过序列化一个类我们真正可以实现什么 让我们先定义序列化 然后我们才能讨论它为什么如此有用 序列化只是将现有对象转换为字节数组 该
  • com.sun.xml.ws.message.saaj.SAAJHeader 无法转换为 com.sun.xml.ws.security.opt.impl.outgoing.SecurityHeader

    我正在尝试访问第三方 Web 服务 该服务要求我创建一个传递时间信息 用户名和密码的安全标头 我在网上搜索了可行的示例 并尝试了多种方法 我正在尝试使用 Java 6 中内置的内容来做到这一点 我不确定我做错了什么 从 WSDL 生成 We
  • Android ClassNotFoundException:在路径上找不到类

    10 22 15 29 40 897 E AndroidRuntime 2561 FATAL EXCEPTION main 10 22 15 29 40 897 E AndroidRuntime 2561 java lang Runtime

随机推荐

  • Ftplib ConnectionRefusedError:[Errno 111]连接被拒绝(python 3.5)

    我有一个应该连接到 FTP 的脚本 from ftplib import FTP with FTP IP as ftp ftp login user my user passwd my password ftp cwd MY DIR ftp
  • 搜索小部件,空指针?

    您好 在我的应用程序中实现搜索小部件时遇到问题 它似乎无法找到菜单项的 actionview 但它找到该项目就好了 我四处寻找答案 但没有看到明确的解决方案 这是我在 XML 中声明的菜单 menu menu
  • 如何在设计视图中打开Java窗体?

    我在互联网上找到了这段代码 我正在我的新笔记本电脑上设置一个新的 Eclipse 我希望能够在设计视图中打开它 如何在设计视图中打开带有 JComponents 的类 是否有办法将其设为默认值 看起来很简单 但我一直在 Eclipse 中寻
  • 多CPU、多核、超线程有什么区别?

    谁能向我解释一下多CPU 多核和超线程之间的区别 我总是对这些差异以及不同场景下每种架构的优缺点感到困惑 这是我在网上学习和参考别人的评论后目前的理解 我认为超线程是其中最劣质的技术 但是便宜 其主要思想是重复寄存器以节省上下文切换时间 多
  • sqlite 按总和过滤

    我有一个包含 1000 条记录的数据库 每行包含文件名和文件大小 如果所有文件大小的总和超过特定限制 则 我需要创建一个 sql 查询来删除所有剩余的行 从最旧到最新 有什么建议么 谢谢 假设这样创建了一个表 CREATE TABLE Fi
  • 在 csv 中写入数据帧时,“‘EncodeElement’中未实现类型‘列表’”

    我有下面的数据框 df Place Name Places abc delhi bcd mumbai delhi cde chennai hyderabad delhi def mumbai efg bangalore mumbai ghi
  • 动态获取数据表中$Columns数组中的列名

    首先我会提到我想要实现的目标 我正在使用 PHP 的 CodeIgniter 框架 我的数据库中有 5 个表 我想通过单击显示页面上的按钮以数据表格式显示它们 我使用服务器端处理 php 作为数据源 因此 一开始我编写了仅以数据表格式显示一
  • 使用一个数字数据成员定义类的所有比较运算符的便捷方法?

    如果我有一个由单个数字数据成员组成的类型 例如 int 和各种方法 有没有一种方便的方法告诉编译器自动生成所有明显的比较运算符 即 而不是这个 使用inline代替constexpr当然 对于 C 03 class MyValueType
  • 将 Google 表单上的空字段替换为字符串

    这段代码效果很好 提交表单后 它会自动填充我创建的模板 然后将其发送到我的电子邮件 除非用户在表单上留下空白字段 否则这非常有效 如果是这样的话 自动填充的顺序是错误的 如果用户决定将字段留空 是否可以自动包含文本 例如 未指定 如果用户输
  • 正 lambda:'+[]{}' - 这是什么魔法? [复制]

    这个问题在这里已经有答案了 在堆栈溢出问题中C 11 不允许重新定义 lambda 为什么 给出了一个无法编译的小程序 int main auto test test 问题得到了解答 一切似乎都很好 然后来了约翰内斯 绍布并做了一个有趣的观
  • 使用文本文件作为 Powershell 脚本的输入

    我的团队正在迁移到一个新网络 我们无法直接从网络 A 中的计算机复制到网络 B 中的新计算机 在网络 A 中的这台计算机上运行多年后 我的项目文件散布在整个磁盘上 我需要构建一个脚本来将文件夹和文件复制到备份磁盘 没问题 但是网络技术人员需
  • WebView:网页不可用,但我从 html 字符串加载它

    我的 html 字符串是这样的 p style text align justify paragraph p p style text align justify another one with strong strong attr st
  • viewPager 中的 onClick 按钮?

    我有一个 viewPager 在第二页我有一个按钮 我希望它在 onClick 上执行某些操作 但它没有执行 我已经在 xml 文件上完成了 android onClick 按钮点击 而且我也尝试过 onCreate 内部和外部的 setO
  • PowerShell 的 -f 运算符的 RHS“到底”是如何工作的?

    上次我很困惑顺便一提电源外壳急切地展开收藏 基思总结其启发如下 将结果 数组 放入分组表达式 或子表达式 例如 中使其再次符合展开条件 我已经牢记了这个建议 但仍然发现自己无法解释一些深奥的知识 特别是 Format 运算符似乎不遵守规则
  • Xamarin Forms Webview 不播放视频

    我有一个在 Xamarin Forms Xaml 中声明的 webview 无论我在代码后面还是在 Xaml 中设置源 视频控件都会呈现良好 但当您单击播放图标时 它不会播放 我可以通过点击渲染的底部搜索栏来向前和向后跳跃 视频将向前跳过并
  • 在django中的requirements.txt中安装psycopg2时出现错误代码

    我尝试仅手动安装 psycopg2 模块 以及 pip3 install rrequirements txt 如果有人以前遇到过此错误 请提供指导 ERROR Failed building wheel for psycopg2 Runni
  • 为什么小写“p”比大写“P”大? [复制]

    这个问题在这里已经有答案了 print Python gt python equals False print python gt Python equals True 有人可以解释一下这是如何解释的吗p是较小的情况然后是资本P 但还没有p
  • java 过滤对象列表的最佳方法[关闭]

    Closed 这个问题需要细节或清晰度 目前不接受答案 我有一个对象列表 上面写着 销售 我只想要其产品与另一个列表中的产品匹配的销售对象 例如 saleProductList 除了循环之外 还有没有更好的方法 如果您已经在使用 Googl
  • Java jit 编译器每次运行时都会编译其代码吗?

    我是java新手 很难理解以下内容 每次运行代码时 jit 都会编译吗 我知道 jit 优化了经常运行的代码 但我问的是 热代码 以外的问题 JIT 不记得上次运行的任何内容 这意味着它可能会在您每次运行代码时编译代码 JIT 甚至可以在代
  • 如何使用 CompletionHandlers 和小于请求的 ByteBuffer 读取请求?

    我正在使用 Java 7 和AsynchronousSocketChannel 我想阅读一个请求 例如HTTP POST 但我正在努力想出一个很好的解决方案来读取完整的请求 如果它大于大小 ByteBuffer我在用着 例如 如果ByteB