/** {@inheritDoc} */
  @SuppressWarnings("deprecation")
  public void start(int port) {
    if (this.objServerSocket_ != null) {
      return;
    }

    this.startPort_ = port;
    this.port_ = this.startPort_;

    if (this.isRange_ == true) {
      String key = "";
      String message = "";
      if (isPortNumValid(this.port_, this.rangeMax_) == true) {
        key = "javelin.communicate.JavelinAcceptThread.initRange";
        message = CommunicatorMessages.getMessage(key, this.startPort_, this.rangeMax_);
        LOGGER.info(message);
      } else {
        key = "javelin.communicate.JavelinAcceptThread.rangeError";
        message = CommunicatorMessages.getMessage(key, this.startPort_);
        LOGGER.warn(message);
        this.isRange_ = false;
      }
    }

    // クライアント接続の受付を開始する。
    try {
      this.acceptThread_ = new Thread(this, acceptThreadName_);
      this.acceptThread_.setDaemon(true);
      this.acceptThread_.start();
    } catch (Exception objException) {
      LOGGER.warn(objException);
    }
  }
  @SuppressWarnings("deprecation")
  private void accept(final ThreadGroup group) throws SocketException {
    Socket clientSocket = null;

    String key = "";
    String message = "";
    try {
      // モニター
      clientSocket = this.objServerSocket_.accept();
    } catch (SocketException se) {
      // stop()でソケットを閉じた場合にSocketExceptionが発生する。
      throw se;
    } catch (IOException ioe) {
      key = "javelin.communicate.commonMessage.serverSocketAcceptError";
      message = CommunicatorMessages.getMessage(key);
      LOGGER.warn(message, ioe);
      return;
    }

    int clientCount = sweepClient();
    if (clientCount > MAX_SOCKET) {
      LOGGER.info("接続数が最大数[" + MAX_SOCKET + "]を超えたため、接続を拒否します。");
      try {
        clientSocket.close();
      } catch (IOException ioe) {
        key = "javelin.communicate.commonMessage.clientSocketCloseError";
        message = CommunicatorMessages.getMessage(key);
        LOGGER.warn(message, ioe);
      }
      return;
    }

    InetAddress clientIP = clientSocket.getInetAddress();
    key = "javelin.communicate.commonMessage.clientConnect";
    message = CommunicatorMessages.getMessage(key, clientIP);
    LOGGER.info(message);

    // クライアントからの要求受付用に、処理スレッドを起動する。
    JavelinClientThread clientRunnable;
    try {
      clientRunnable = createJavelinClientThread(clientSocket);
      Thread objHandleThread =
          new Thread(
              group, clientRunnable, acceptThreadName_ + "-JavelinClientThread-" + clientCount);
      objHandleThread.setDaemon(true);
      objHandleThread.start();

      // 通知のためのクライアントリストに追加する。
      synchronized (this.clientList_) {
        this.clientList_.add(clientRunnable);
      }
    } catch (IOException ioe) {
      LOGGER.warn("クライアント通信スレッドの生成に失敗しました。", ioe);
    }

    // 接続完了をリスナに通知
    String hostName = clientIP.getHostName();
    String ip = clientIP.getHostAddress();
    int port = clientSocket.getPort();
    notifyClientConnected(hostName, ip, port);
  }
  /** 通信用スレッドを実行する。 */
  @SuppressWarnings("deprecation")
  public void run() {
    try {
      Thread.sleep(this.waitForThreadStart_);
    } catch (Exception ex) {
      // Do nothing.
    }

    ThreadGroup group = new ThreadGroup("JavelinThreadGroup");
    String key = "";
    String message = "";

    this.isRunning_ = true;

    while (this.isRunning_ == true && this.isListening_ == false) {
      try {
        this.objServerSocket_ = new ServerSocket(this.port_);

        key = "javelin.communicate.JavelinAcceptThread.start";
        message = CommunicatorMessages.getMessage(key, this.port_);
        LOGGER.info(message);
        this.isListening_ = true;
      } catch (IOException objIOException) {
        int interval = this.bindInterval_;
        key = "javelin.communicate.JavelinAcceptThread.restart";
        message = CommunicatorMessages.getMessage(key, this.port_, interval);
        LOGGER.warn(message);
        if (this.isRange_ == true) {
          // ポート番号を1増やして再接続を行う。
          // 接続範囲を超えた場合には、javelin.bind.intervalの間スリープした後、処理を再度実行する。
          this.port_++;
          if (this.port_ > this.rangeMax_) {
            key = "javelin.communicate.JavelinAcceptThread.overRange";
            message = CommunicatorMessages.getMessage(key, this.rangeMax_, this.startPort_);
            LOGGER.info(message);
            this.port_ = this.startPort_;
          }
        }
        sleep();
      }
    }

    while (this.isRunning_) {
      try {
        try {
          accept(group);
        } catch (RuntimeException re) {
          key = "javelin.communicate.snmp.TrapListener.SendingTelegramErrorMessage";
          message = CommunicatorMessages.getMessage(key);
          LOGGER.warn(message, re);
        }
      } catch (Throwable th) {
        LOGGER.warn(th);
      }
    }

    synchronized (this.clientList_) {
      for (int index = this.clientList_.size() - 1; index >= 0; index--) {
        JavelinClientThread client = this.clientList_.get(index);
        client.stop();
      }
    }

    try {
      if (this.objServerSocket_ != null && this.isConnected()) {
        this.objServerSocket_.close();
      }
    } catch (IOException ioe) {
      key = "javelin.communicate.commonMessage.serverSocketCloseError";
      message = CommunicatorMessages.getMessage(key);
      LOGGER.warn(message, ioe);
    }
  }