繁体   English   中英

ServerSocket接受方法 - 如何向下转换为子类类型?

[英]ServerSocket accept method - How can I down cast to a subclass type?

我有一个类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,它从accept接收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;
  }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM