*********如何使ServerSocket只接收一个连接,其他连接都拒掉?****************** 当serverSocket.accept()得到socket后,关掉serverSocket,我自己想的,不知道行不行, 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 这样试试,新建一个类,继承ServerSocket类,然后在里面添加一个静态boolean变量(如connected = false)。在while循环中判断connected是否为false,是的话关掉请求的连接。否的话,接受连接并把connected 置为true。就是用设计模式中的单实例。 shytian(hello)的想法不错,而且也是可行的,但效率就不高了 如果在每次accept()后都关掉serversocket,那么如果发生断链以后还需要启动serversocket。控制比较复杂,我想先找找其他的办法。对于增加while循环判断的方式,我试过,造成大量的CPU消耗,因为CPU始终在判断true和false.代码如下: while(true) { if(!connected) { socket = socketServer.accept(); connected = true;大家还有其他招数吗? 写一个类处理socket连接,这个类不要是多线程的就可以了. ralihm(raly)的想法我试过了,是可行的,可是我用的socket处理类是别人的,这个类一定要起线程,我阻塞不住。我哭。 我有一事不明,难道JAVA不打算让serversocket只连一个连接吗? 1. ServerSocket(int port, int backlog),backlog是指等待队列中存放的最大连接数, 比如说backlog为5, 当同时有15个连接请求时, 这个ServerSocket只会接受前面的5个,把他们放在等待队列中,等待ServerSocket的accept(), 而其他的10个会被立即拒绝.2. socket = socketServer.accept(); .... // 处理socket socketServer.setSoTimeout(0); //解释较长,看api,我试过了,可以 try { ServerSocket sSocket = new ServerSocket(port, 2); sSocket.setSoTimeout(timeout); Socket client = null; while (true) { try { client = sSocket.accept(); if (client == null) { Thread.currentThread().sleep(2 * 1000); continue; } else { client.setSoTimeout(1000); //添加至队列 if (checkSocket(client)) { DealClient(client); } else { Thread.currentThread().sleep(2 * 1000); client.close(); continue; } } } catch (Exception ex) { Thread.currentThread().sleep(2 * 1000); client = null; continue; } client = null; Thread.currentThread().sleep(1000); } }控制方法为checkSocket;自己实现即可 就是这样的,就是这样的,我只想着在accept之前封住连接,没想到可以在accept之后再检验连接呀。。谢谢!另外请教高手,为什么要设置setSoTimeOut呢?我读乐API,它的意思是在serversocket在一段时间没有连接连入的时候抛异常,有什么用呢?一段时间没有连接很正常呀,在异常里要做什么处理呢?另外huidaoren(huidaoren),我也试了你的方法,我不明白为什么要将socketServer.setSoTimeout(0),因为缺省应该就是无限等待,不抛异常吧。试后,也不管用,我的服务器照样能应答两个客户端。现在我的代码改成这样: socketServer = new ServerSocket(tcpPort, 1); logger.info("SocketServer is running ..."); while(true) { socket = socketServer.accept(); //如果已经连上,则断开连接 if(connected) { Thread.currentThread().sleep(2 * 1000); socket.close(); continue; } connected = true; sSocket.setSoTimeout(timeout)是设置socketServer.accept()的阻塞时间。长时间的线程阻塞可能会导致意想不到的错误,具体的错误我记不得了,一般timeout在5秒以内比较合理 catch (Exception ex) { Thread.currentThread().sleep(2 * 1000); client = null; continue; } 多线程join有点不明白,求教 如何创建一个只带有?和关闭窗口的对话框???急! 精通JAVA都需要些什么素质? 在jsp页面调用包中类的方法出错的问题 集合的问题,很纠结,求大神指教 如何安装Eclipse,请教各位! cvs中如何改变时间? 关于Eclipse的讨论 送分问题 java画直线被其他panel遮挡,寻求解决 一些.JAVA文件,没有包,想用JBUILDER7做成一个PROJECT里,然后生成一个JAR到指定的目录 关于prorider的问题
对于增加while循环判断的方式,我试过,造成大量的CPU消耗,因为CPU始终在判断true和false.代码如下:
while(true)
{
if(!connected)
{
socket = socketServer.accept();
connected = true;
大家还有其他招数吗?
ServerSocket sSocket = new ServerSocket(port, 2);
sSocket.setSoTimeout(timeout);
Socket client = null;
while (true) {
try {
client = sSocket.accept();
if (client == null) {
Thread.currentThread().sleep(2 * 1000);
continue;
}
else {
client.setSoTimeout(1000);
//添加至队列
if (checkSocket(client)) {
DealClient(client);
}
else {
Thread.currentThread().sleep(2 * 1000);
client.close();
continue;
}
}
}
catch (Exception ex) {
Thread.currentThread().sleep(2 * 1000);
client = null;
continue;
}
client = null;
Thread.currentThread().sleep(1000);
}
}
控制方法为checkSocket;
自己实现即可
另外请教高手,为什么要设置setSoTimeOut呢?
我读乐API,它的意思是在serversocket在一段时间没有连接连入的时候抛异常,有什么用呢?一段时间没有连接很正常呀,在异常里要做什么处理呢?另外huidaoren(huidaoren),我也试了你的方法,我不明白为什么要将socketServer.setSoTimeout(0),因为缺省应该就是无限等待,不抛异常吧。试后,也不管用,我的服务器照样能应答两个客户端。现在我的代码改成这样:
socketServer = new ServerSocket(tcpPort, 1);
logger.info("SocketServer is running ...");
while(true)
{
socket = socketServer.accept();
//如果已经连上,则断开连接
if(connected)
{
Thread.currentThread().sleep(2 * 1000);
socket.close();
continue;
}
connected = true;
Thread.currentThread().sleep(2 * 1000);
client = null;
continue;
}