[問題] Socket做HttpServer 偵測 Client 斷線 ?

看板java作者 (Mr. Pan)時間11年前 (2014/01/17 17:02), 編輯推噓0(004)
留言4則, 3人參與, 最新討論串1/1
大家好~ 不好意思,不太能夠在標題講清楚要做啥: 小弟現在要用 ServerSocket 和 Scoket 做一個簡單的 MJPEG over HTTP server 基本的 header 和 response 格式之類的都已經 OK 了,現在遇到一個問題 和一般的 HTTP Server 不同, 處理 Client 的 Thread 並非輸出完要輸出的 東西後就會自行將 socket close , 而是 會循環將某個資料夾底下的圖片給 輸出給 Client (有點像是 IP Camera , 會一直把畫面傳過去),因此在處理 Client 的 Thread 是這樣寫的: // Client 是 Browser 或 IPCamera Viewer public void run(){ try{ /* 收取 request 和輸出 response header 的部分 */ while(ipt.read()!=-1){ /* 沒做甚麼事,就是利用 .read 讓他 block */ } }catch(Exception e){} } public void echoJPEG(byte[] data){ /* 輸出一些 bondary 之類的資料 */ opt.write(data); /* 輸出一些結束的資料 */ } 當圖片更換的時候,會有一個 Thread 統籌呼叫各個 Client 的 echoJPEG() 把圖片輸出給 Client ,因此其實處理 Client 的 Thread 在輸出完 response header 之後就是在那邊等待了 原本以為當 Client 關閉 (如 Browser 關閉),理論上應該 ipt.read 會 "到底" 傳回 -1 或者遇到 IOException 離開迴圈而結束掉這個 Thread 但是不管怎麼測試, IPCam Viewer 或者 Browser 關閉的時候,這個 Thread 都 還是繼續執行,而且呼叫 echoJPEG 也沒有發生任何 exception.... 想請問在這種狀況應該要如何偵測 Client 已經關閉了呢? 還是根本無解? 感謝大家~ -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 218.164.200.149 ※ 編輯: darkk6 來自: 218.164.200.149 (01/17 17:02)

01/17 17:14, , 1F
block <= 直到讀到東西前會一直停在這
01/17 17:14, 1F

01/17 17:16, , 2F
以你這來說唯一能知道對方可能close就是寫入失敗
01/17 17:16, 2F

01/19 09:12, , 3F
可是在 Browser 關閉後,將資料 write 過去也是沒有噴錯
01/19 09:12, 3F

01/20 17:13, , 4F
看 Socket 的 isClosed(), 而不是看 InputStream
01/20 17:13, 4F
文章代碼(AID): #1IsF6aWY (java)
文章代碼(AID): #1IsF6aWY (java)