[問題] 關於http的connection

看板AndroidDev作者 (汪汪)時間6年前 (2018/01/18 23:43), 6年前編輯推噓0(007)
留言7則, 1人參與, 6年前最新討論串1/1
板上各位大大好, 我這幾天寫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://www.ptt.cc/bbs/AndroidDev/M.1516290185.A.7DA.html

01/19 00:43, 6年前 , 1F
http底層是TCP socket,為了減少重新連線多花的時間
01/19 00:43, 1F

01/19 00:44, 6年前 , 2F
在有keepalive時,disconnect()只是把socket還給連線池而已
01/19 00:44, 2F

01/19 00:46, 6年前 , 3F
不會直接關掉socket,你提的解法是關掉keepalive
01/19 00:46, 3F

01/19 00:47, 6年前 , 4F
這問題原因是拿來重新利用的socket其實已經不能用了(在你的
01/19 00:47, 4F

01/19 00:48, 6年前 , 5F
狀況是透過這個socket都會400),但為什麼會不能重用、為什
01/19 00:48, 5F

01/19 00:48, 6年前 , 6F
麼底層實作分不出這個socket已經不能用了這個就要更詳細的
01/19 00:48, 6F

01/19 00:48, 6年前 , 7F
debug才知道了
01/19 00:48, 7F
感謝回答 聽起來感覺很像是android或server的bug @@" ※ 編輯: Morshues (111.246.39.95), 01/19/2018 10:43:15
文章代碼(AID): #1QOC29VQ (AndroidDev)
文章代碼(AID): #1QOC29VQ (AndroidDev)