Периодически отправлять данные с сервера клиентам

Я создал асинхронный сервер, который может читать сообщения от любого количества клиентов. Код моего сервера тесно связан с этим примером: http://msdn.microsoft.com/en-us/library/fx6588te.aspx

После подключения клиента я хотел бы периодически отправлять данные этому клиенту, может быть, 2 или 3 раза в секунду. Я не могу придумать хороший способ добиться этого с помощью асинхронного send(). Я предполагаю, что к моему методу AcceptCallback() необходимо добавить какой-то механизм синхронизации, потому что именно здесь происходит соединение с клиентом.

В предыдущей версии моего сервера я использовал блокирующие сокеты и просто зацикливал свой метод send() в бесконечном цикле while() и вызывал sleep(), чтобы сократить время.

Вот что я думаю:

public void AcceptCallback(IAsyncResult ar)
    {
        allDone.Set(); // Signal the main thread to continue.

        // Get the socket that handles the client request.
        Socket listener = (Socket)ar.AsyncState;
        Socket handler = listener.EndAccept(ar);
        IPEndPoint remotePoint = (IPEndPoint)handler.RemoteEndPoint;
        IPAddress remoteAddress = remotePoint.Address;
        Console.WriteLine("Connected to {0}!", remoteAddress.ToString());

        // Create the state object.
        StateObject state = new StateObject();
        state.workSocket = handler;

        //Start periodically sending here??

        handler.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0,
            new AsyncCallback(ReadCallback), state);
    }

person trevor-e    schedule 13.07.2012    source источник
comment
Просто начните работу BackgroundWorker потока на Timer.   -  person Security Hound    schedule 13.07.2012


Ответы (1)


Я бы настроил объект Timer для отправки данных клиенту. Создайте экземпляр и запустите таймер в методе AcceptCallback в вашем комментарии. Вам нужно будет отслеживать информацию, чтобы позволить этому обратному вызову таймера отправлять данные клиенту (например, сокет и какой-то тест, чтобы позволить ему остановиться — хотя вы можете просто отключить таймер, но вы бы в этом случае нужно следить за таймером).

Кстати, никогда не вызывайте Sleep в подобных ситуациях, потому что это заставляет ваш поток сидеть без дела в течение некоторого периода времени, и вы не можете легко прервать его, чтобы вернуть поток (для выхода или использования для чего-то другого).

person Peter Ritchie    schedule 13.07.2012
comment
Я попробую. Да, у меня было ощущение, что sleep() это не то, что я хотел использовать. - person trevor-e; 13.07.2012