我创建了一个充当Rest Web Server的java程序。它获取http请求并发送响应。我在服务器内输入http请求作为输入流。我想将此输入流转换为String,然后根据某些预定义模式解析字符串。问题是当我得到输入流并尝试将其转换为String时,它将无法完成操作,直到新请求到来或原始请求终止。如果这两个事件中的任何一个发生只有输入流成功转换为字符串,否则它将被挂在那里。我错过了什么吗?任何建议都会非常有用。
ServerSocket service = new ServerSocket(Integer.parseInt(argv[0]));
Socket connection = service.accept();
InputStream is = connection.getInputStream();
String ss = IOUtils.toString(is);
System.out.println("PRINT : "+ss);
现在仅在旧请求终止或套接字接受新请求时打印ss。我想在同一个请求中将其转换为字符串。
请告诉我我做错了什么?
谢谢, 塔拉辛格
答案 0 :(得分:1)
您应该逐步阅读请求。首先读取标题,换行。然后,如果是POST
请求,则会有一个请求正文。如果是这种情况,您应该先读取Content-Length
标题,该标题表示正文以字节为单位。您应该从输入流中读取该字节数。
如果您使用HTTP服务器库将此应用程序作为servlet,或者如果不可能,则已经为您处理了大部分内容。
答案 1 :(得分:0)
您所做的错误是您希望将流转换为字符串,该操作仅在流完成时才可用。这就是为什么你在连接终止时得到你的字符串。如果没有更多的数据提交并且应该开始转换,那么toString方法应该怎么知道呢?如果它吐出一个字符串,同时更多数据到达流中会怎么样?我猜你也不会高兴:)
简而言之:在转换为字符串之前,您必须知道何时完成接收。重新设计您的应用。