2

我创建了一个异步服务器,可以从任意数量的客户端读取消息。我的服务器代码与此示例密切相关:http: //msdn.microsoft.com/en-us/library/fx6588te.aspx

客户端连接后,我想定期向该客户端发送数据,可能每秒 2 或 3 次。我想不出用异步发送()实现这一目标的好方法。我假设某种计时机制需要添加到我的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);
    }
4

1 回答 1

1

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

顺便说一句,永远不要在这种情况下调用 Sleep,因为这会使您的线程在一段时间内处于闲置状态,并且您不能轻易中止它以恢复线程(退出或用于其他用途)。

于 2012-07-13T15:54:50.460 回答