作者Morshues (汪汪)
看板AndroidDev
标题[问题] 关於http的connection
时间Thu Jan 18 23:43:02 2018
板上各位大大好,
我这几天写android的时候遇到一个很神秘的问题,
事情是这样的:
有一支我一两年多以前写的程式,
会在呼叫Service之後,背景执行HttpURLConnection,
POST到我本机或线上伺服器API取得资料,
一两年以前这个程式的这部分都没遇到过什麽问题。
这几天为了改版这个程式,
程式在一些地方新增了功能,
而网路连线的部分完全没有改动过,
但是所有的API都只有第一次会成功得到200(OK),
第二个呼叫的API都一定会获得400(Bad Request)
ex:
API-1(200) -> API-2(400) -> API-1(400)
API-1(200) -> API-1(400) -> API-2(400)
API-2(200) -> API-1(400) -> API-2(400)
另外,如果使用HTTPS的话则是都会成功
只有HTTP会遇到这个状况
我上网查了许久
发现stack overflow竟然七年以前就有人问过类似的问题了
https://goo.gl/JXM9vs
里面推荐数较多的两个方法
1. System.setProperty("http.keepAlive", "false");
没有用
2. conn.setRequestProperty("connection", "close");
这个则成功解决了我的问题
我想问的是
我以为conn.disconnect();就应该可以断开连线了
为什麽还需要set preoerty connection = close
是我弄错什麽了吗?或是里面有什麽特殊机制?
另外,如果这个问题很早以前就有
我之前怎麽都没遇到过
是sdk版本的影响吗?
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 125.224.89.111
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/AndroidDev/M.1516290185.A.7DA.html
1F:→ ssccg: http底层是TCP socket,为了减少重新连线多花的时间 01/19 00:43
2F:→ ssccg: 在有keepalive时,disconnect()只是把socket还给连线池而已 01/19 00:44
3F:→ ssccg: 不会直接关掉socket,你提的解法是关掉keepalive 01/19 00:46
4F:→ ssccg: 这问题原因是拿来重新利用的socket其实已经不能用了(在你的 01/19 00:47
5F:→ ssccg: 状况是透过这个socket都会400),但为什麽会不能重用、为什 01/19 00:48
6F:→ ssccg: 麽底层实作分不出这个socket已经不能用了这个就要更详细的 01/19 00:48
7F:→ ssccg: debug才知道了 01/19 00:48
感谢回答 听起来感觉很像是android或server的bug @@"
※ 编辑: Morshues (111.246.39.95), 01/19/2018 10:43:15