【问题标题】:Bufferedreaded ready method losing dataBufferedreader 就绪方法丢失数据
【发布时间】: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


【解决方案1】:

当您使用字符串时,您必须始终同意编码并且永远不要使用默认值。在你的

// use wathever charset encoding you know is pressent on the socket stream like UTF-8
new InputStreamReader(socket.getInputStream(), "US-ASCII") 

你不需要调用 ready 方法,方法 readLine() 将阻塞直到有新的行被读取。你的 while 应该是

while ((requestString = clientRequest.readLine()) != null) {
    // ...
}

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2017-02-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-05
  • 2021-07-10
  • 2019-07-23
  • 1970-01-01
相关资源
最近更新 更多