2011-03-08 20 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

相關問題