0

クラスSocketを拡張するクラスClientSocketがあります。クラスSocketを拡張する理由は、ソケットの反対側にあるクライアントを一意に識別するStringclientIdを含めたいためです。clientIdを返す「getClientId」というメソッドもあります。

次のようなソケット接続を受け入れる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メソッドは実行時にClientSocketではなくSocketオブジェクトを返すため、これを行うことはできません。私の質問は、これを回避する方法はありますか?そうでない場合は、クライアントにバインドされているソケットを一意に識別できる、私がやりたいことを実行するためのより適切な方法はありますか?IPアドレスは変更される可能性があります。

助けてくれてありがとう。

4

1 に答える 1

3

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;
  }
}
于 2011-03-08T13:10:20.993 に答える