解决Java Socket中POST No Response 的BUG

通常根据习惯来说,新建一个 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 里面了。然后,处理数据呗。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值