【问题标题】:How can I handle multipart form data in Java NIO Htttp Server如何在 Java NIO Http Server 中处理多部分表单数据
【发布时间】:2016-07-08 06:00:37
【问题描述】:

我已经使用Java NIO 实现了一个非阻塞HTTP 服务器。它适用于 x-www-form-urlencoded POST 请求。但是当我尝试使用大文件的 HTTP 多部分请求时,它不起作用。在这种情况下,服务器无法响应 http 客户端。这是我的 NIO Server 源代码。

public class TCPServer {

    public static void main(String[] args) {
       TCPServer server = new TCPServer();
       server.listen();
    }

    public void listen() {

        try {

             Selector selector = Selector.open();

             ServerSocketChannel serverSocketChannel = ServerSocketChannel
                .open();

             InetSocketAddress serverAddress = new InetSocketAddress(8080);

             serverSocketChannel.bind(serverAddress);

             serverSocketChannel.configureBlocking(false);

             serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT);

             while (true) {

                  selector.select();

                  Set<SelectionKey> selectionKeys = selector.selectedKeys();
                  Iterator<SelectionKey> iterator =  selectionKeys.iterator();

                  while (iterator.hasNext()) {
                      SelectionKey key = iterator.next();

                      if (key.isAcceptable()) {
                          SocketChannel clientSocketChannel =  serverSocketChannel.accept();

                       clientSocketChannel.configureBlocking(false);

                       clientSocketChannel.register(selector,
                            SelectionKey.OP_READ);

                      } else if (key.isReadable()) {
                           SocketChannel clientSocketChannel = null;
                           try {
                               clientSocketChannel = (SocketChannel) key.channel();

                               ByteBuffer clientBuffer = ByteBuffer.allocate(1024);

                               StringBuilder requestStringBuilder = new StringBuilder();

                                int bytesRead = clientSocketChannel
                                .read(clientBuffer); 

                                while (bytesRead > 0) {

                                     clientBuffer.flip();

                                     String result = new String(clientBuffer.array());
                                     requestStringBuilder.append(result);

                                     clientBuffer.compact();

                                     bytesRead = clientSocketChannel.read(clientBuffer);

                                }

                                System.out.println("request-----");
                                System.out
                                  .println(requestStringBuilder.toString());

                                clientSocketChannel.write(ByteBuffer
                                  .wrap("reply from server".getBytes()));

                                clientSocketChannel.register(selector,
                                SelectionKey.OP_WRITE);
                    } catch (Exception e) {
                        System.err.println(e.getMessage());
                        clientSocketChannel.close();
                    }

                } else if (key.isWritable()) {
                    SocketChannel clientSocketChannel = null;
                    try {
                        clientSocketChannel = (SocketChannel) key.channel();
                        clientSocketChannel.close();
                    } catch (Exception e) {
                        System.err.println(e.getMessage());
                        clientSocketChannel.close();
                    }
                }
                iterator.remove();

            }
          }
        }catch (Exception e) {
             System.err.println(e.getMessage());
        }

    }

 }

有没有其他方法可以在 Java NIO 非阻塞服务器中处理 HTTP 多部分请求。我该如何解决这个问题。谢谢。

【问题讨论】:

  • “服务器无法响应http客户端”不是问题描述。
  • 我会用源码来解释。假设我向服务器发送 HTTP 多部分请求。请求包含图像。根据实现,打印 HTTP 请求,然后服务器向客户端发送消息。问题是此消息未发送到客户端。我认为服务器和客户端之间的连接在服务器中处理时断开了。不知道是什么原因

标签: java nio multipartform-data nonblocking


【解决方案1】:

这类似于另一个问题:Servlet 3.1 - Multipart async processing,但我会在这里回答,因为该解决方案也适用于普通的非阻塞 IO。

Synchronoss Technologies 最近开源了一个非阻塞 HTTP 多部分解析器 here

当您的非阻塞服务器接收数据时,您只需将传入字节传递给NioMultipartParser。解析器将对收到的每个部分的代码进行回调。

免责声明:我在 Synchronoss Technologies 工作。我们为 Servlet 3.1 编写了这个,但它也应该有意在常规的非阻塞应用程序中工作,所以希望其他人会发现这个库很有用。

【讨论】:

  • 您好,谢谢。我认为这适用于 Servlet。但我没有使用 Servlet 来完成这项工作。我使用 Java NIO 来实现 Web 服务器。您能否解释一下我如何将同步库与 Java NIO Web 服务器一起使用。谢谢。
  • 此解析器的行为类似于 OutputStream。因此,您可以在每次到达时向其写入任意数量的字节。您不需要一次提供所有字节。 当它等待字节到达时,解析器不会阻塞线程(因为它没有自己的线程)。然而,当它只解析这些字节时,它会使用调用线程来驱动它的算法并在你的代码中进行回调。另请注意,不依赖于 Servlet API - 由您的代码提供来自任何源的字节。
猜你喜欢
  • 2015-06-05
  • 2012-11-17
  • 2010-11-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-20
  • 1970-01-01
相关资源
最近更新 更多