定期从服务器向客户端发送数据

时间:2012-07-13 15:42:08

标签: c# asyncsocket

我创建了一个异步服务器,可以读取来自任意数量客户端的消息。我的服务器代码与此示例密切相关: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);
    }

1 个答案:

答案 0 :(得分:1)

我会设置一个Timer对象来向客户端发送数据。在注释中的AcceptCallback方法中实例化并启动计时器。您必须跟踪信息以允许该计时器回调将数据发送到客户端(如套接字,以及允许它停止的某种测试 - 尽管您可以简单地关闭计时器,但是您需要在这种情况下必须跟踪计时器。)

顺便说一下,在这样的情况下永远不要调用Sleep,因为它会让你的线程在一段时间内坐下来并且你不能轻易地中止它以获得线程(退出或用于其他东西)。