我猜这个问题很多,但我仍然对我应该做的事情感到困惑。
我想要的是通过等待数据发送来循环连接到服务器(由其他人编写)。当收到一条消息时,它必须关闭并对该数据做一些事情,我认为使用背景工作者可能是最好的。
然而,我并不真正理解整个Callback的事情,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();
}
据我所知,它接收数据并将其存储在某人身上。但是,如果有更多数据,它是否应该再次调用自己?我收到的测试数据很小,所以一切都收到了,但如果我在该代码上设置了一个断点并单步执行,它就不会再次调用Callback,所以:
response = state.sb.ToString();
从未被击中。
另一件我不确定的是如何在循环中使用Receive(),以便我的连接只是无限地等待数据,传递它接收到的数据。
Callback是否在单独的线程上?或者我应该在收到数据时使用后台工作程序,以便它可以关闭并执行所需的操作,并且连接可以继续监听数据?
感谢您的帮助。
尼尔
答案 0 :(得分: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),它将执行某些操作。这只是有效!
希望这会有所帮助。