2011-03-08 21 views
0

我有一个扩展类Socket的类ClientSocket。我扩展类Socket的原因是我想包含一个String clientId,它唯一标识套接字另一端的客户端。我也有一个名为'getClientId'的方法返回clientId。ServerSocket接受方法 - 如何将其转换为子类型?

我有我的服务器上运行的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地址可能会改变。

感谢您的帮助。

回答

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

嗨,彼得。谢谢回复。我在想这个。这是一个安全的选择吗?我知道'接受'可以抛出一些例外,但我是否采用上述方法覆盖了所有途径?另外,我不确定我是否理解ClientSocket实例化部分。你能解释(SocketImpl)类型,还有'implAccept'方法吗?非常感谢 – Joeblackdev 2011-03-08 13:12:56

+0

道歉,我刚刚发现'implAccept()',这很有道理。谢谢! – Joeblackdev 2011-03-08 14:04:44

+1

我拿了accept()方法的一个副本,并做了最少的更改。理想情况下,您可以删除参数,因为您的构造函数不必与Socket的相同。 – 2011-03-08 14:12:50

相关问题