[問題] 關於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