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