2011-03-08 2 views
0

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

У меня есть экземпляр 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; 
} 

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

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

ответ

2

У вас может быть 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; 
    } 
} 
+0

Hi Peter. Спасибо за ответ. Я думал об этом. Это безопасный вариант? Я знаю, что «принять» может бросить некоторые исключения, но я охватываю все возможности здесь, беря вышеуказанный подход? Кроме того, я не уверен, что понимаю часть экземпляра ClientSocket. Можете ли вы объяснить (SocketImpl), а также метод «implAccept»? Спасибо, действительно, – Joeblackdev

+0

Извинения, я только что нашел «implAccept()», имеет смысл. Благодаря! – Joeblackdev

+1

Я взял копию метода accept() и сделал минимум изменений. В идеале вы можете отказаться от параметра, поскольку ваш конструктор не должен быть таким же, как для Socket. –

Смежные вопросы