解决Java Socket中POST No Response 的BUG

来源:互联网 发布:vb语言可以干什么 编辑:程序博客网 时间:2024/05/18 02:34
通常根据习惯来说,新建一个BufferedReader 来监听输入端口。

    BufferedReader inFromClient = new BufferedReader(new InputStreamReader(connectionSocket.getInputStream()));


然后用while循环进行 ReadLine();

不过,会碰到怎么着都读不出POST内容的问题。

其实在POST的内容中,最后一行是没有“\n”的,所以造成最后一行,也就是POST的内容不能被读取,并且程序停止响应。
这里有一个方法来解决这个问题。

首先查看HTTP报文:

    connection from Socket[addr=/127.0.0.1,port=4996,localport=2000] onSocket:4996    POST / HTTP/1.1    /    Host: localhost:2000    User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.0.1) Gecko/20    08070208 Firefox/3.0.1    Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8    Accept-Language: en-us,en;q=0.5    Accept-Encoding: gzip,deflate    Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7    Keep-Alive: 300    Connection: keep-alive    Referer: http://localhost:2000/index.html    Content-Type: application/x-www-form-urlencoded    Content-Length: 109 // here    

这里,我们可以看到Content-Length返回了一个POST的长度。

根据程度进行Read(),而不是直接去ReadLine();。因为没有Line可以Read。找不到行结束符。

这样就获得了Content-Length。

 while((!clientSentence.equals("")))     {                clientSentence = inFromClient.readLine();                 System.out.println(clientSentence);                                  // here to fix post no response bug                if(clientSentence.startsWith("Content-Length"))                 {                    try {                        contentLength = Integer.parseInt(clientSentence.substring(clientSentence.indexOf(':') + 1).trim());                    } catch (Exception e) {                        e.printStackTrace();                    }                }            }



然后根据Content-Length的值进行Read:
char[] tmpPost = new char[contentLength];                                for(int i = 0; i < contentLength; i++)                 {                    tmpPost[i] = (char)inFromClient.read();                    clientSentence += String.valueOf(tmpPost[i]);                }


这样,POST的值就存在clientSentence 里面了。然后,处理数据呗。

原创粉丝点击