ServerSocket принимает метод - Как я могу привести к приведению к типу подкласса? - PullRequest
0 голосов
/ 08 марта 2011

У меня есть класс ClientSocket, который расширяет класс Socket. Причина, по которой я расширяю класс Socket, заключается в том, что я хочу включить String clientId, который однозначно идентифицирует клиента на другой стороне сокета. У меня также есть метод getClientId, который возвращает clientId.

У меня на сервере запущен экземпляр ServerSocket, который принимает подключения к сокетам следующим образом:

public Socket acceptNextConnection() throws IOException {
    Socket socket = serverSocket.accept();

    // put the client socket into the map
    ClientSocket clientSocket = (ClientSocket) socket;
    clientConnections.put(clientSocket.getClientId(), clientSocket);

    return clientSocket;
}

Как видите, мое приведение здесь неверно, поскольку экземпляр Socket НЕ ЯВЛЯЕТСЯ экземпляром ClientSocket, и поэтому я получаю исключение приведения класса, как я и ожидал. Как видно из кода, я хочу вызвать getClientId для класса ClientSocket. Однако я не могу этого сделать, потому что метод serverSocket.accept возвращает объект Socket во время выполнения, а не ClientSocket. У меня вопрос, есть ли способ обойти это? Если нет, есть ли более аккуратный способ делать то, что я хочу, - это возможность однозначно идентифицировать сокет, связанный с клиентом? IP-адрес может быть изменен.

Спасибо за помощь.

1 Ответ

2 голосов
/ 08 марта 2011

У вас может быть ServerClientSocket, который возвращает ClientSocket от accept.Что-то вроде

public class ServerClientSocket extends ServerSocket {
  public ClientSocket accept() throws IOException {
  if (isClosed())
    throw new SocketException("Socket is closed");
  if (!isBound())
    throw new SocketException("Socket is not bound yet");
  ClientSocket s = new ClientSocket((SocketImpl) null);
  implAccept(s);
  return s;
  }
}
...