2017-03-26 12 views
1

私のクライアントが切断されたときに、サーバー上で次のコードを持っている:私は更新の内側にはまだ、試してみて、デバッグ右その後とき今TCPクライアントを正しく閉じるか廃棄するには?

foreach (ClientEntity client in connectedClients) { 

     if (!isClientStillConnected(client.tcpClient)) { 

      disconnectedClients.Add(client); 
      client.tcpClient.Close(); 
      Debug.Log (" :: Client " + client.tcpClientName + " has disconnected! ::"); 
      continue; 

     } else { 

      Do_The_Stuff_And_Things(); 

      } 

     } 

    } 

:すべてのフレームを実行しているアップデートの内側

、 ():

for (int i = 0; i < disconnectedClients.Count; i++) { 

     Debug.Log(":: Disconnected clients count: " + disconnectedClients.Count.ToString()); 
     Debug.Log(":: Disconnected client at index " + i + ": " + disconnectedClients[i]); 

    } 

このセクションでは、disconnectedClientsリストから切断クライアントを削除することですが、私はそれを実行し、クライアントを終了すると、ここだけのスニペット、Unityはコンソールにスロー何:

enter image description here

そしてそれが続きます。したがって、ループのは停止しません。つまり、クライアントが常にリストに追加されています。今何が問題なのですか?クライアントを閉じる(閉じる)にはどうすればいいですか??クライアント側では

私が実行します。

 nwReader.Close(); 
     nwWriter.Close(); 
     tcpClient.Close(); 
     socketReady = false; 

だけFYI、クラスClientEntity

public class ClientEntity { 

    public TcpClient tcpClient; 
    public string tcpClientName; 

    public ClientEntity(TcpClient tcpClientSocket){ 

     tcpClientName = "Guest"; 
     tcpClient = tcpClientSocket; 

    } 
} 

答えて

1

TcpClient.Close方法は、あなたのケースで正しく動作しています。ただし、接続を解除した後でconnectedClientsリスト/アレイからクライアントを削除していないため、if !isClientStillConnected(client.tcpClient))ステートメントが再び真と評価されます。次のようにコードを変更してください:

//This loop is unchanged 
foreach (ClientEntity client in connectedClients) 
{ 
    if (!isClientStillConnected(client.tcpClient)) { 

     disconnectedClients.Add(client); 
     client.tcpClient.Close(); 
     Debug.Log (" :: Client " + client.tcpClientName + " has disconnected! ::"); 
     continue; 

    } else { 

     Do_The_Stuff_And_Things(); 

     } 

    } 

} 

//Remove all disconnected clients from the list of connected clients 
foreach (var disconnectedClient in disconnectedClients) 
{ 
    connectedClients.Remove(disconnectedClient); 
} 
関連する問題