作者darkk6 (Mr. Pan)
看板java
标题[问题] ServerSocket 接收浏览器连线
时间Fri Jun 29 17:05:51 2012
先针对上面我问的问题做一个小结 (
#1Fx9G3PQ)
这几篇主题虽然是问 wait 和 notify 可不可以做到
某件事,经过我实际测试之後是OK 没问题(那表示当初想法没错XD)
问题是出在连线,也就是 ServerSocket
-------------------
[底下有 demo 的原始码]
先叙述一下我的 Server:
while(true){
socket=serverSocket.accept();
ClientHandler client=new ClientHandler(socket);
client.start();
}
// ClientHandler 是自己写的 extends Thread class.
Client 的部分则是直接使用浏览器(chrome,firefox...)
我在 ClientHandler 的 run 里面用了 wait(); 来暂停 :
public void run(){
// blablabla
synchronized(this){wait();}
//blablabla
}
理论上不影响主执行绪对吧?(serverSocket 的部分)
而当某见实情发生的时候,我会对所有的 client thread 进行 notify
这个部分也没有问题(实测过了)
现在测试的情况有底下三种:
1. 一台电脑 用浏览器开两个连线 连到这个 Server
(不论浏览器是否相同都一样)
都要等到第一个 client thread 结束後第二个才会被 serverSocket accept
2. 一台电脑 用 Java 的 URL openConnection , 连到 server
不论开几条连线,都能顺利的被 server accept,并且进入他们各自的
client thread 而且 wait();
3. 两台电脑 各用浏览器开一条连线 到 Server
两个连线都顺利的被 accept , 并进入自己的 thread wait.
就我所认知的,第一个情况很奇怪... 有没有人遇过
或者是知道这有可能是甚麽原因吗?
任何只要是透过浏览器的,同一台电脑都只有第一个连线会被 accept..
我把我的 class 简化,做成 demo 版 (只有 source code , 请自行编译XD)
http://www.mediafire.com/download.php?h8m0k14cvn5myyq
启动 server 之後五秒内 用同一台电脑浏览器连两次
http://localhost:8888/
以及用不同电脑各连一次 (五秒内)
观察 console 出现的讯息。
接着可以把 sleep 时间调长,以及同电脑不同浏览器连,结果也一样。
里面有附两张图,分别是我用
同电脑 Chrome , Firefox 五秒内各连一次
以及 电脑连一次,手机连一次(五秒内)
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 140.116.39.75
1F:推 LaPass:如果用两种不同的浏览器连结呢? 例如IE + FOX? 06/29 18:30
2F:→ samtree:同一个浏览器开的两个连线对Server来说是同一个session 06/29 20:06
3F:→ darkk6:不同浏览器也是後面那条会卡住@@ 06/30 01:15
※ 编辑: darkk6 来自: 118.171.117.163 (06/30 02:13)
4F:→ darkk6:补上 demo source code , 可以参考看看 06/30 02:13