sjsteve33171 Ответов: 2

C# правильное хранение информации и очистка


Всем Привет,

У меня есть сокет-сервер и клиент на языке c#. Когда кто - то подключается, я сохраняю этот сокет, а также храню кучу информации о нем в словаре. Скажем, один из них отключается, каков наилучший способ очистить эту конкретную информацию? Кроме того, нужно ли мне даже хранить acceptedSockets? Я им не пользуюсь так что может мне просто позвонить

ListenFromClient( TCPServerForClient.AcceptSocket( ) );


в нить, а?

Код Ниже:

class ClientInfo
        {
            public string strTimeConnected  =   string.Empty;
            public Socket clientSocket, technicianSocket;
        }

        //Used to count the number of connected clients
        List< ClientInfo >  clients                 =   new List< ClientInfo >( );

        //Used to store the number of connections
        List< Socket >      acceptedSockets         =   new List< Socket >( );
        
        //Holds an ID and collected info of client
        Dictionary< string, ClientInfo > clientMap1 =   new Dictionary< string, ClientInfo >( );
        //Holds Socket of technician and tech info collected
        Dictionary< Socket, ClientInfo > clientMap2 =   new Dictionary< Socket, ClientInfo >( );


Чем дальше вниз после запуска сервера я делаю это:

Socket newAcceptedClientSocket = TCPServerForClient.AcceptSocket( );

//When Connection From Client Is Made, Add To The Accepted Sockets
acceptedSockets.Add( newAcceptedClientSocket );

                //Launch A New Thread And Wait For A Client Command To Be Received
new Thread( ( ) =>
{
    //Spawn The Thread In The Background
    Thread.CurrentThread.IsBackground = true;

    //Listen To What The Client Is Saying
    ListenFromClient( newAcceptedClientSocket );
} ).Start( );

clientNew.strTimeConnected      =   DateTime.Now.ToString( "HH:mm:ss tt" );
clientNew.clientSocket          =   clientSocket;
clientNew.technicianSocket      =   null;
clients.Add( clientNew );

if( !clientMap2.TryGetValue( clientSocket, out tmp ) )
     clientMap1.Add( clientNew.strId, clientNew );


Заранее спасибо. Мне нужна информация, но также нужно, чтобы она исчезла, если кто-то отключится. Может быть, я храню его неправильно, и есть лучший способ?

Что я уже пробовал:

Итерационный массив, но в словаре нет ни порядка, ни индекса.

Подумайте о том, чтобы использовать вместо этого массив

2 Ответов

Рейтинг:
16

mehr.ah

Любой сокет-сервер, такой же, как signalr, дает вам уникальную информацию от каждого приходящего клиента . например, их ip-адреса .
если вы используете постоянное соединение в signalr, то onclose connection вы можете удалить этот ip-адрес из своего словаря, но, как вы уже сказали, arraylist-лучший выбор для хранения данных сокета.


Рейтинг:
1

sjsteve33171

Спасибо. Я иду по пути преобразования своего словаря в тип списка, как и предполагал.


CHill60

Если вы хотите ответить на сообщение, то используйте кнопку "есть вопрос или комментарий?" ссылка рядом с ним. Плакат уведомляется о вашем ответе.
Никогда не публикуйте комментарии или вопросы в качестве решений