作者darkk6 (Mr. Pan)
看板java
標題[問題]Socket做HttpServer 偵測 Client 斷線 ?
時間Fri Jan 17 17:02:26 2014
大家好~ 不好意思,不太能夠在標題講清楚要做啥:
小弟現在要用 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)
→ danny8376:block <= 直到讀到東西前會一直停在這 01/17 17:14
→ danny8376:以你這來說唯一能知道對方可能close就是寫入失敗 01/17 17:16
→ darkk6:可是在 Browser 關閉後,將資料 write 過去也是沒有噴錯 01/19 09:12
→ dou0228:看 Socket 的 isClosed(), 而不是看 InputStream 01/20 17:13