【问题标题】:How to close or dispose of TCP client properly?如何正确关闭或处置 TCP 客户端?
【发布时间】:2017-03-26 03:27:46
【问题描述】:

当客户端断开连接时,我在服务器上有以下代码:

在每帧运行的更新内部:

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();

            }

        }

    }

现在当我在那之后尝试调试时,仍然在 Update() 内部:

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在控制台中抛出的,只是一个sn-p:

它还在继续。所以一个 - for 循环 不会停止,这意味着客户端会不断添加到列表中,对吗?现在出了什么问题,我怎样才能正确删除(关闭)客户端

在客户端我运行:

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

仅供参考,ClientEntity类:

public class ClientEntity {

  public TcpClient tcpClient;
  public string tcpClientName;

  public ClientEntity(TcpClient tcpClientSocket){

      tcpClientName = "Guest";
      tcpClient = tcpClientSocket;

  }
}

【问题讨论】:

    标签: c# networking unity3d tcp unity5


    【解决方案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);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-03-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多