0

チャットアプリケーション(サーバー)を作成しているところですが、問題があります。

サーバーはで接続を受け入れてから、クラスTcpClientの新しいインスタンスを作成し、そのインスタンスへの参照を渡します。この新しいインスタンスは、将来の使用のために参照を保存します。次に、新しいインスタンスがリストに追加されます。ConnectionTcpClientConnectionConnectionUsers

擬似コードを見てみましょう:

while(true)
{
    // 1. Accept connection into new Client instance
    Client = new TcpClient()
    Client = AcceptTcpClient();
    // 2. Create new Connection object and pass Client's reference to it.
    Connection abc = new Connection(Client);

    // Add new user to users collection
    Users.Add(Connection);
}

これで、abcインスタンスはClientオブジェクトへの参照を持ちます。ここまでは問題ありませんが、while()ループが次の反復に入るたびに、デバッガーでClientインスタンスが破棄されていることがわかります(ガベージコレクターによって)。

したがって、別の反復が開始されるとConnection、リスト内のすべてのインスタンスUsersはOKですが、それらの参照は、TcpClient再利用されたインスタンスのみを参照します。したがって、接続はすぐに閉じられ、作業を行うことはできません。

問題がどこにあるか知っていますか?答えてくれてありがとう。

正確なソースコードが必要な場合があります。その場合は、もちろん提供できます。

4

1 に答える 1

1

その単一の接続ではありません。

ここには2つのことが重なっています。

「接続」は作成されるクライアントに依存し、いくつかのクライアントといくつかのそれぞれの接続を作成しているという事実。

null 参照を使用してガベージ コレクターを少し騙し、ループの外側で変数を宣言することができます。

public void Dummy(ref Connection AConnection, ref TcpClient AClient)
{
  AConnection = null;
  AClient = null;
} // void Dummy(...)

public void Example()
{
  TcpClient Client = null;
  Connection abc = null;

  while(true)
  {
      // 1. create new Client instance, WITHOUT connection
      Client = new TcpClient()
      //Client = AcceptTcpClient();

      // 2. Create new Connection object that requires Client's reference to it.
      Connection abc = new Connection(Client);

      // Add new user to users collection
      Users.Add(abc);

      // uncomment only when debugging
      Dummy(ref abc, ref Client)
  } // while

  // uncomment only when debugging
  Client = null;
  abc = null;
} // void Example(...)

乾杯。

于 2012-06-07T18:59:57.937 に答える