我有一个扩展类Socket的类ClientSocket。我扩展类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地址可能会有所变化。
感谢您的帮助。
答案 0 :(得分:2)
您可以拥有一个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;
}
}