1

私はSocketオブジェクトを次のように拡張しようとしました...

public class TestSocket extends Socket
{
  private String id=String.valueOf(Math.random());

  ...

  public void setId(String id){this.id=id;}
  public String getId(){return this.id;}

}

initas。。。

TestSocket testSocket = new TestSocket(SERVER_HOSTNAME, SERVER_PORT);

私が見ることができるように、サーバー側のServerSocket標準コードは

TestSocket mySocket = (TestSocket) serverSocket.accept();

...ドキュメントによるとaccept()メソッドはソケットオブジェクトを再初期化し、新しいオブジェクトを返すため、id値はクライアントのものではなく、再生成されたものになります:(

クライアントIDを保持することは可能ですか?はいの場合、どのように?

4

3 に答える 3

1

私はラインを推測します

TestSocket mySocket = (TestSocket) serverSocket.accept();

class のインスタンスを返すClassCastExceptionので、 を発生させます(ServerSocket から継承しない限り) 。java.io.ServerSocket.accept()SocketTestSocket

次のように、2 つのソケットを接続する場合は、おそらく接続を介して ID を送信し、受信側で設定する必要があります。

public void sendID() {
   DataOutputStreak dos = new DataOutputStream(getOuputStream());
   dos.writeUTF(this.getId());
}

public void receiveID() {
   DataInputStream dis = new DataInputStream(getInputStream());
   setId(dis.readUTF());
}

2 つのテスト ソケットの 1 つは 1 つのメソッドを呼び出し、もう 1 つは他のメソッドを呼び出します。ただし、Socket クラスから継承してこれを実行するのではなく、より高いレベルでこれを処理します。

于 2012-06-21T19:52:22.567 に答える
0

あなたができることの1つは、ソケットをデータ構造に保持することです。地図。

于 2012-06-21T19:34:16.370 に答える
0

受け入れられたソケットのによって返される値getRemoteSocketAddress()は一意です (クライアントが異なる IP アドレスまたは同じ IP アドレス内の異なるポートを持つため)。それだけです。

于 2012-06-22T00:07:26.443 に答える