El envío y la recepción de datos desde localhost en Unity provocó el error "IOException: demasiados archivos abiertos"

Para probar la parte de red de mi aplicación Unity, tengo un objeto de juego "imitado" que se mueve de acuerdo con la entrada del teclado. El componente del administrador de redes (1) obtiene los datos de movimiento del "imitatee" y los envía a un servidor localhost de node.js usando PUT y también (2) recupera los datos de localhost y los aplica al objeto "imitator". El programa funcionó bien, pero después de un tiempo recibí el error:

IOException: Too many open files

También apareció una ventana en el editor de Unity que decía "Error al abrir archivos" y luego el editor se bloqueó. Creo que fue causado por la memoria que no se eliminó correctamente, pero no he descubierto exactamente cómo. Aquí está el código de GameManager:

NetworkingManager.cs

public class Data
{
    public float posX;
    ...

    public Data(float posX...)
    {
        this.posX = posX;
        ...
    }
}

public class NetworkingManager : MonoBehaviour
{

    private GameObject imitator;
    private GameObject imitatee;

    private Data data;
    private string jsonData;
    private Data receivedData;

    private string uri = "http://localhost:3000/";

    private void Awake()
    {
        // Assign references
        ...
    }

    private IEnumerator SendData()
    {
        data = new Data(
            imitatee.transform.position.x,
            ...
            );

        jsonData = JsonUtility.ToJson(data);

        using (UnityWebRequest req = UnityWebRequest.Put(uri, jsonData))
        {
            req.SetRequestHeader("Content-Type", "application/json");
            yield return req.SendWebRequest();
    

            if (req.isNetworkError || req.isHttpError)
            {
                Debug.Log(req.error);
            }
        }

    }

    private IEnumerator ReceiveData()
    {

        using (UnityWebRequest req = UnityWebRequest.Get(uri))
        {
            yield return req.SendWebRequest();

            if (req.isNetworkError)
            {
                Debug.Log(req.error);
            }
            else
            {
                receivedData = JsonUtility.FromJson<Data>(req.downloadHandler.text);

                imitator.transform.position = new Vector3(
                    receivedData.posX,
                    ...
                    );

                ...
            }
        }
        
    }

    void Update()
    {
        StartCoroutine(SendData());
        StartCoroutine(ReceiveData());
    }
}

Además, no se registró ningún error para el backend de node.js.

backend.js

const express = require('express')
const app = express()
app.use(express.json())
const port = 3000
var data

app.get('/', (req, res) => {
  if (data) res.json(data)
})

app.put('/', (req, res) => {
  data = req.body
  console.log("Received " + req.body) 
})

app.listen(port, () => {
  console.log(`App listening at http://localhost:${port}`)
})

¡Aprecio tu ayuda!

Answer