作者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/m.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