0

我有一个扩展类 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地址可能会发生变化。

谢谢您的帮助。

4

1 回答 1

3

您可以拥有一个 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;
  }
}
于 2011-03-08T13:10:20.993 回答