当前位置: 首页 > 面试题库 >

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

益清野
2023-03-14
问题内容

我正在使用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吗?

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


问题答案:

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



 类似资料:
  • 我正在使用Spring5、Netty和Spring webflux开发和API网关。有时,我希望网关停止请求,但我也希望读取请求的主体以记录它,例如,并向客户机返回一个错误。 我尝试在WebFilter中通过订阅body来实现这一点。 当我这样做的时候,它在身体的内容很少的时候起作用。但当我有一个大的身体时,只有第一个元素的通量被读取,所以我不能有整个身体。知道怎么做吗?

  • 我正在尝试从HTML中读取post请求参数。我可以使用以下JavaScript代码读取get请求参数。 但对post请求不起作用。有人能告诉我如何使用JavaScript读取HTML中的post请求参数值吗?

  • 问题内容: 我正在尝试从HTML中读取发布请求参数。我可以使用JavaScript中的以下代码读取get请求参数。 但这不适用于发布请求。谁能告诉我如何使用JavaScript读取HTML中的发布请求参数值? 问题答案: POST数据是在服务器端处理的数据 。Javascript位于客户端。因此,您无法使用JavaScript读取帖子数据。

  • 问题内容: 我需要能够 使用 OKHTTP* 来 管理 一些请求,使用来通过输入地址来接收一些预测。该 问题是 ,我插入每次 CHAR 它将使一个新的请求,但在同一时间,我需要取消前一个!例如:纽约市=同时请求13个!因此,我仅使用一个实例来尝试取消已请求但没有成功的任何内容。这就是我所做的! * 我检查对象是否为null并取消请求,但仍然不断! 问题答案: 关于以下内容:

  • 那么,这种情况下有没有变通的办法呢?我是否应该使用简单的rest客户端,比如reverfit,或者在每个新请求上创建新的ApolloClient和OkHttpClient实例,并带有所需的头集?或者也许还有别的变通办法?

  • 我如何解析JSON请求之类的东西? 示例代码: 带有_名称的位置_为无