作者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)
1F:→ danny8376:block <= 直到读到东西前会一直停在这 01/17 17:14
2F:→ danny8376:以你这来说唯一能知道对方可能close就是写入失败 01/17 17:16
3F:→ darkk6:可是在 Browser 关闭後,将资料 write 过去也是没有喷错 01/19 09:12
4F:→ dou0228:看 Socket 的 isClosed(), 而不是看 InputStream 01/20 17:13