【发布时间】:2013-07-08 21:27:43
【问题描述】:
以下方法有时不会捕获数据。我相信这是因为 .ready() 函数。
我们已经通过睡眠破解了我们的方法,但我认为这不是充分的证据,而且似乎是一个糟糕的破解。
您能否就如何修复此方法提出建议,使其在请求被完全读取时起作用?
提前致谢
/**
* Parses a client request and calls the appropriate handler
* @throws Exception
*/
private void processClientRequest() throws Exception{
Socket connectedClient = null;
BufferedReader clientRequest = new BufferedReader(new InputStreamReader(connectedClient.getInputStream()));
System.out.println(clientRequest);
String requestString = clientRequest.readLine();
String header = requestString;
//Break up request
StringTokenizer tokenizer = new StringTokenizer(header);
//Different request parts
String httpMethod = tokenizer.nextToken();
String httpQueryString = tokenizer.nextToken();
//Print client request
StringBuffer responseBuffer = new StringBuffer();
//Sleep to bypass weird clientRequest.ready() error
if (httpMethod.equals("POST")) {
Thread.sleep(100);
}
while (clientRequest.ready()) {
responseBuffer.append(requestString + " ");
System.out.println(requestString);
requestString = clientRequest.readLine();
}
//Process GET request
if (httpMethod.equals("GET")) {
processGETRequests(httpQueryString, requestString);
}else if (httpMethod.equals("POST")) {
processPOSTRequests(responseBuffer, httpQueryString);
}
}
【问题讨论】:
-
首先,你不应该在现代代码中使用
StringTokenizer,也没有理由使用ready() -
您似乎正在编写自己的 http 服务器。你到底想做什么?
-
我致力于优化。有人建议布赖恩吗?
-
David,我正在尝试编写一个 http 服务器 :) API 已经可以正常工作了......只是这个错误
-
不要那样做。使用 Embedded jetty,或者使用 jdk 中包含的轻量级 http 服务器。再次。不要编写自己的 http 服务器,除非您只是想学习并且不会在生产中使用它。
标签: java bufferedreader