2011-03-08 3 views
0

私はクラスSocketを継承するクラスClientSocketを持っています。ソケットクラスを拡張する理由は、ソケットの反対側のクライアントを一意に識別するString clientIdを含めることです。私はまた、クライアントIDを返す「getClientId」というメソッドを持っています。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; 
} 

あなたが見ることができるようにソケットインスタンスはClientSocketインスタンスではありませんので、私が得るよう、ここに私のキャストが間違っています私が期待したように、クラスキャスト例外。コードで明らかなように、クラスClientSocketで 'getClientId'を呼び出す必要があります。しかし、serverSocket.acceptメソッドはClientSocketではなく実行時にSocketオブジェクトを返すので、これを行うことはできません。私の質問は、これを回避する道があるのか​​?そうでない場合は、クライアントにバインドされているソケットを一意に識別できる、欲しいことを行うためのより良い方法がありますか? IPアドレスは変更される可能性があります。

ありがとうございます。

答えて

2

acceptからClientSocketを返すServerClientSocketを持つことができます。何かのように

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

+0

申し訳ありません、私は 'implAccept()'が意味を成していることを発見しました。ありがとう! – Joeblackdev

+1

私はaccept()メソッドのコピーをとり、最小限の変更を行いました。理想的には、コンストラクタがSocketのコンストラクタと同じである必要はないため、パラメータを削除できます。 –

関連する問題