1

我猜这种问题已经被问了很多,但我仍然对我应该做什么感到困惑。

我想要的是通过等待数据发送来异步连接到服务器(由其他人编写)。当收到一条消息时,它必须关闭并使用该数据做一些事情,我认为使用后台工作器可能是最好的。

但是,我并不真正理解整个回调的事情,而且 msdn 的示例似乎无法正常工作。它只读取一次然后关闭。我需要连接保持打开状态,等待消息通过。

我是通过连接和等待消息以正确的方式做事,还是应该充当服务器端,允许来自客户端的连接,然后接收他们发送给我的消息?

请朝正确的方向推动会有所帮助。

问候,

尼尔

更新1:

谢谢大家的回复。我了解回调函数的必要性,但我对以下代码感到困惑:

// Read data from the remote device.
        int bytesRead = client.EndReceive(ar);

        if (bytesRead > 0) {
            // There might be more data, so store the data received so far.
        state.sb.Append(Encoding.ASCII.GetString(state.buffer,0,bytesRead));

            // Get the rest of the data.
            client.BeginReceive(state.buffer,0,StateObject.BufferSize,0,
                new AsyncCallback(ReceiveCallback), state);
        } else {
            // All the data has arrived; put it in response.
            if (state.sb.Length > 1) {
                response = state.sb.ToString();
            }
            // Signal that all bytes have been received.
            receiveDone.Set();
        }

据我了解,它接收数据并将其存储在某人中。但是如果有更多数据,它是否应该再次调用自己?我收到的测试数据很小,所以第一次收到所有内容,但是如果我在该代码上放置一个断点并单步执行,它不会再次调用回调,所以:

response = state.sb.ToString();

永远不会被击中。

我不确定的另一件事是如何在循环中使用 Receive() 以便我的连接将无限期地等待数据,传递它接收到的数据。

回调是否在单独的线程上?或者我应该在收到数据时使用后台工作人员,以便它可以关闭并执行所需的操作,并且连接可以继续侦听数据?

感谢所有的帮助。

尼尔

4

1 回答 1

0

我假设你已经用你正在使用 .Net 套接字命名空间的套接字标记了这个问题。这支持异步接受连接以及异步读取。以下链接正确解释了它 -

http://msdn.microsoft.com/en-us/library/bew39x2a.aspx

为了解释,我将复制并粘贴代码 -

private static void Receive(Socket client) {
    try {
        // Create the state object.
        StateObject state = new StateObject();
        state.workSocket = client;

        // Begin receiving the data from the remote device.
        client.BeginReceive( state.buffer, 0, StateObject.BufferSize, 0,
            new AsyncCallback(ReceiveCallback), state);
    } catch (Exception e) {
        Console.WriteLine(e.ToString());
    }
}

与服务器建立成功连接时调用上面的接收函数。请注意对 BeginReceive 的调用,它需要一个新的 AsyncCallback 函数作为参数。每当服务器发送数据时,将调用此函数(ReceiveCallBack),该函数将对其进行处理。这行得通!

希望这可以帮助。

于 2012-09-25T15:21:24.257 回答