У меня есть класс 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-адрес может быть изменен.
Спасибо за помощь.