c# - ¿Cómo puedo reutilizar Networkstream[] ns = new NetworkStream[10] en el caso de que un cliente se desconecte?

CorePress2024-01-24  10

Estoy usando Networkstream[] ns = new NetworkStream[10]; para realizar los streams, uno para cada cliente. cuando el cliente no devuelve una respuesta de mantenimiento de actividad, el servidor ejecuta el siguiente código:

                        connectedClientsCount -= 1;
                        connectedClientsStreams[i].Dispose();
                        connectedClientsStreams[i] = new NetworkStream[i]; //Issue here
                        connectedClients[i].Close();
                        connectedClients[i] = new TcpClient(); //no issue
                            arrKeepAlive[i, 0] = 0;
                            arrKeepAlive[i, 1] = 0;

                        

Al intentar asignar connectClientsStreams[i] a una nueva instancia de networkstream, recibo este error: No se puede convertir implícitamente el tipo 'System.Net.Sockets.NetworkStream[]' a 'System.Net.Sockets.NetworkStream

Una de las respuestas sugiere que inicialice un nuevo flujo de red usando parámetros como IPA y Puerto, esto no tiene sentido lógico para mí en una arquitectura cliente/servidor. Como servidor nunca tendrás esa información a mano.

Una descripción más detallada debería evitar más interpretaciones erróneas.

Los clientes se conectan al servidor, el servidor agrega la conexiónAl conectar los sockets del cliente a la matriz antes mencionada, todos los flujos de red se inicializan en tiempo de ejecución en una matriz separada, los índices de ambas matrices se correlacionan con cada cliente, tras la desconexión del cliente, los datos asociados para dicho cliente se eliminarán de ambas matrices, sin reinicializar ni actualizar los índices asociados un nuevo cliente no puede utilizar esos índices.

Así que tengo entendido que desecho/cierro el flujo de red y el socket existentes a los que se hace referencia en las 2 matrices, y luego los reinicializa para que estén listos para cualquier conexión futura desconocida.

Ya tengo la sensación de que Tom quiere puntos SE impersonales en lugar de proporcionar una solución/respuesta a una pregunta mal interpretada/mal escrita. Pido disculpas por no poder hacer una pregunta que atienda a todas las necesidades.comprensión de Ryone.



------------------------------------

Si entiendo correctamente deseas crear un nuevo NetWorkStream en lugar del que se eliminó, en tu línea que lo crea con el comentario //Issue here debería ser lo siguiente:

connectedClientsCount -= 1;
connectedClientsStreams[i].Dispose();
connectedClientsStreams[i] = new NetworkStream(new Socket(...));  // initalize new object instead of array
connectedClients[i].Close();
connectedClients[i] = new TcpClient(); //no issue
arrKeepAlive[i, 0] = 0;
arrKeepAlive[i, 1] = 0;

El problema está en la inicialización de una nueva matriz de NetworkStream en lugar de un objeto.

2

Hola Kshkarin, el saque.r recorre periódicamente la matriz y hace ping a cada cliente esperando una respuesta para garantizar que aún exista una conexión; de lo contrario, el código anterior se ejecuta para eliminar al cliente del servidor, el objeto tcpclient del cliente existe en una matriz y el flujo tcpclients existe en la otra. , quiero eliminar los objetos antiguos de su índice en las matrices respectivas y preparar los índices para usarlos nuevamente. Entonces, en su ejemplo, se espera una nueva conexión de socket que puede ser útil para volver a conectarse, pero no creo que sea aplicable para preparar los índices para conexiones futuras.

- Cosas de José Liicks

28 de marzo de 2021 a las 6:59

@JoseLiicksStuff la pregunta era sobre asignar un nuevo NetworkStream y resolver la excepción, esto es lo que proporciona la respuesta. Si tiene una nueva pregunta para el siguiente paso, abra una nueva pregunta. Si esta respuesta resolvió su pregunta original, acéptela stackoverflow.com/help/someone-answers

-kshkarin

28 de marzo de 2021 a las 7:08



------------------------------------

La solución a mi consulta fue la siguiente:

connectedClientsCount -= 1;
connectedClientsStreams[i].Close(); //since close includes dispose
connectedClientsStreams[i] = null; //removes the closed NS reference
connectedClients[i].Close();
connectedClients[i] = new TcpClient(); //no issue
arrKeepAlive[i, 0] = 0;
arrKeepAlive[i, 1] = 0;

Al establecer el valor en el índice [i] en nulo después del cierre, me permite reutilizar el flujo de red.

Compartir mejorar esta respuesta Seguir Respondido

29 de marzo de 2021 a las 10:39

Cosas de José Liicks

Cosas de José Liicks

1

1

1 insignia de bronce

Su guía para un futuro mejor - libreflare
Su guía para un futuro mejor - libreflare