使Server Socket在每次迭代中等待Client Socket

时间:2014-02-23 11:17:44

标签: java sockets while-loop timeout

我启动Server程序,它只等待客户端30秒。它在第一次迭代中工作正常,并且不会在剩余的迭代中等待。任何建议。

这里

minLinkWt() sets the index. 

然而,该计划仍然保持不变。

import java.sql.*;
import java.net.*;
import java.lang.*;
class Democ{
 int index,port,min=100;
ServerSocket ss=null;
Socket s=null;

void begin(){
int av=0;boolean b=false;
    minLinkWt();
    while(!b){
    av=checkStatus(index);
    if(av==1){b=true;}
             }
        if(av==1)
        Connect();
        else
        System.out.println("No Routers Available");
}
 void Connect()
    {
    System.out.println("Enter the Message to send to clients::");
    try{
    BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
    String msg=br.readLine();
    PrintStream ps=new PrintStream(s.getOutputStream());
    ps.println(msg);
    }catch(Exception e){e.printStackTrace();}
    }
void callSwitch(int index_formal)
{
switch(index_formal)
{
case 1:
port=2000;
break;
case 2:
port=2001;
break;
case 3:
port=2002;  
break;
case 4:
port=2003;
break;
default:
System.out.println("No Routers in Available");
}
}

 int checkStatus(int index_formal){
            try
            {
             ss=new ServerSocket(port);
            ss.setSoTimeout(30000);     
             s=ss.accept();             
            }catch(InterruptedIOException e){
            System.out.println("Cannot connect through Router1 Waiting for Router2");}
            catch(Exception g){g.printStackTrace();}    
            if(s==null)
            return 0;
            else 
            return 1;
    }
class DemoCopy{
public static void main(String s[])
{
Democ obj=new Democ();
obj.begin();
}
}

所以在每次迭代时,服务器必须等待客户端,但不等待。 我得到输出

hello
hello
hello
hello
min is6
AT index2
Cannot connect through Router1 Waiting for Router2
No Routers Available

1 个答案:

答案 0 :(得分:0)

看起来begin()中的“index”可以是数组的索引,因此您要检查服务器套接字端口的状态,从0到x或者其他什么。

可能你应该发布更多的源代码,但看起来你在checkStatus()中使用单个端口值,这意味着ServerSocket每次都绑定相同的端口。

在第一次迭代时没关系,因为服务器套接字没有绑定到任何端口,但是在第一次迭代结束时你根本没有关闭服务器套接字。

因此服务器套接字仍然绑定在给定端口,并且创建具有相同端口号的新ServerSocket将失败,因为它已经绑定,除非先关闭它,否则不能再绑定它。

您应该使用单个ServerSocket,并且一旦serverSocket.accept()返回套接字,您就可以将其存储到数组并经常检查它的状态。或者也许你可以每次区分端口号,让客户端每次连接不同的端口也可以工作,但我不认为这是你想要做的。