【问题标题】:ServerSocket accept method - How can I down cast to a subclass type?ServerSocket 接受方法 - 如何向下转换为子类类型?
【发布时间】:2011-07-11 02:37:36
【问题描述】:

我有一个扩展类 Socket 的 ClientSocket 类。我扩展类 Socket 的原因是我想包含一个字符串 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 地址可能会发生变化。

感谢您的帮助。

【问题讨论】:

    标签: java sockets classcastexception


    【解决方案1】:

    你可以有一个 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;
      }
    }
    

    【讨论】:

    • 嗨,彼得。谢谢回复。我在想这个。这是一个安全的选择吗?我知道“接受”可能会引发一些异常,但我是否通过上述方法涵盖了所有途径?另外,我不确定我是否理解 ClientSocket 实例化部分。你能解释一下 (SocketImpl) cast 和 'implAccept' 方法吗?确实感谢
    • 抱歉,我刚刚发现 'implAccept()' 是有道理的。谢谢!
    • 我复制了一个 accept() 方法并做了最少的改动。理想情况下,您可以删除参数,因为您的构造函数不必与 Socket 的构造函数相同。
    • 谢谢。但是,我阅读了 ServerSocket 中的 implAccept 方法,并且了解到 ClientSocket 实例将被交给这个 ServerClientSocket 实例。但是,我不确定上述代码的 ((SocketImpl) null) 部分。你可以解释吗?再次感谢
    • 它只是调用一个构造函数,该构造函数接受 (SocketImpl) 和一个空参数。如果你没有这样的构造函数,我建议你使用调用super((SocketImpl) null);的构造函数,所以它的行为是一样的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-23
    • 2021-11-23
    • 1970-01-01
    • 2021-09-12
    • 2014-07-09
    • 2015-03-12
    相关资源
    最近更新 更多