[问题] 关于http的connection

楼主: Morshues (汪汪)   2018-01-18 23:43:02
板上各位大大好,
我这几天写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版本的影响吗?
作者: ssccg (23)   2018-01-19 00:43:00
http底层是TCP socket,为了减少重新连线多花的时间在有keepalive时,disconnect()只是把socket还给连线池而已不会直接关掉socket,你提的解法是关掉keepalive这问题原因是拿来重新利用的socket其实已经不能用了(在你的状况是透过这个socket都会400),但为什么会不能重用、为什么底层实作分不出这个socket已经不能用了这个就要更详细的debug才知道了

Links booklink

Contact Us: admin [ a t ] ucptt.com