当serverSocket.accept()得到socket后,关掉serverSocket,我自己想的,不知道行不行,

解决方案 »

  1.   

    这样试试,新建一个类,继承ServerSocket类,然后在里面添加一个静态boolean变量(如connected = false)。在while循环中判断connected是否为false,是的话关掉请求的连接。否的话,接受连接并把connected 置为true。就是用设计模式中的单实例。
      

  2.   

    shytian(hello)的想法不错,而且也是可行的,但效率就不高了
      

  3.   

    如果在每次accept()后都关掉serversocket,那么如果发生断链以后还需要启动serversocket。控制比较复杂,我想先找找其他的办法。
    对于增加while循环判断的方式,我试过,造成大量的CPU消耗,因为CPU始终在判断true和false.代码如下:
                while(true)
                {
                    if(!connected)
                    {
                        socket = socketServer.accept();
                        connected = true;
    大家还有其他招数吗?
      

  4.   

    写一个类处理socket连接,这个类不要是多线程的就可以了.
      

  5.   

    ralihm(raly)的想法我试过了,是可行的,可是我用的socket处理类是别人的,这个类一定要起线程,我阻塞不住。我哭。
      

  6.   

    我有一事不明,难道JAVA不打算让serversocket只连一个连接吗?
      

  7.   

    1. ServerSocket(int port, int backlog),backlog是指等待队列中存放的最大连接数, 比如说backlog为5, 当同时有15个连接请求时, 这个ServerSocket只会接受前面的5个,把他们放在等待队列中,等待ServerSocket的accept(), 而其他的10个会被立即拒绝.2. socket = socketServer.accept();   ....           // 处理socket   socketServer.setSoTimeout(0); //解释较长,看api,我试过了,可以
      

  8.   

    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;
    自己实现即可
      

  9.   

    就是这样的,就是这样的,我只想着在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;
      

  10.   

    sSocket.setSoTimeout(timeout)是设置socketServer.accept()的阻塞时间。长时间的线程阻塞可能会导致意想不到的错误,具体的错误我记不得了,一般timeout在5秒以内比较合理
      

  11.   

    catch (Exception ex) {
              Thread.currentThread().sleep(2 * 1000);
              client = null;
              continue;
            }