我有一个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实例,因此我的转换是不正确的,因此,正如我所料,我得到了一个类转换异常。从代码中可以明显看出,我想在ClientSocket类上调用“ getClientId”。但是我不能这样做,因为serverSocket.accept方法在运行时返回Socket对象,而不是ClientSocket。我的问题是,有办法解决吗?如果不是,是否有一种更整洁的方式来做我想做的事情,即能够唯一地标识绑定到客户端的套接字? IP地址可能会更改。

谢谢您的帮助。

最佳答案

您可以有一个ServerClientSocket,它从接受返回一个ClientSocket。就像是

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;
  }
}

关于java - ServerSocket accept方法-如何向下转换为子类类型?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5232833/

10-13 05:00