Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#和#x2B;异步连接并在循环中等待数据_C#_Sockets_Asynchronous - Fatal编程技术网

C#和#x2B;异步连接并在循环中等待数据

C#和#x2B;异步连接并在循环中等待数据,c#,sockets,asynchronous,C#,Sockets,Asynchronous,我想这类问题已经被问了很多次了,但我仍然不知道我应该做什么 我想要的是通过等待数据发送,在循环中异步连接到服务器(由其他人编写)。当一条消息被接收时,它必须关闭并对该数据进行处理,我认为使用后台工作程序可能是最好的 然而,我并不真正理解整个回调过程,来自msdn的示例似乎并不正确。它只读取一次,然后关闭。我需要连接保持打开状态,等待消息通过 我是通过连接和等待消息来正确地处理事情,还是应该作为服务器端,允许客户端连接,然后接收他们发送给我的消息 请往正确的方向推一下会有帮助的 问候, 尼尔 更新

我想这类问题已经被问了很多次了,但我仍然不知道我应该做什么

我想要的是通过等待数据发送,在循环中异步连接到服务器(由其他人编写)。当一条消息被接收时,它必须关闭并对该数据进行处理,我认为使用后台工作程序可能是最好的

然而,我并不真正理解整个回调过程,来自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();
        }
据我所知,它接收数据并将其存储在sb中。但是,如果有更多的数据,它是否应该再次调用自己?我收到的测试数据很小,所以所有内容都是第一次收到的,但是如果我在代码上设置一个断点并逐步执行,它不会再次调用回调,因此:

response = state.sb.ToString();
永远不会被击中

我不确定的另一件事是如何在循环中使用Receive(),这样我的连接就只能坐在那里不确定地等待数据,传递它接收到的数据

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

谢谢你的帮助


尼尔

我假设您已经用套接字标记了问题,您正在使用.Net套接字名称空间。这支持异步接受连接以及异步读取。下面的链接对此进行了适当的解释-

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

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),该函数将对其进行处理。这就行了

希望这有帮助

看看这里:被接受的答案应该会帮助你。