我实现了一个与this example极其相似的异步客户端套接字。我有什么理由不能显着增加这个缓冲区大小?在这个例子中,缓冲区大小是256字节。在许多的情况下,我的应用程序最终收到的数据是5,000 ++字节的数据。我应该增加缓冲区大小吗?有没有什么原因让我不应该增加缓冲区大小?异步客户端套接字,增加缓冲区大小
每过一段时间,我都会遇到一些问题,即数据发生错误或缺少块(尚未确切确认它是哪个)。例如,有一次我收到看起来像这样
Slice Id="0" layotartX='100'
一些腐败的数据称为layotartX并不在我的数据中存在的属性,它应该说布局= ...而是布局得到切断,其他数据会在后面追加。我对字节进行了计数,并注意到它在正好是我的缓冲区大小的256字节处被截断。很有可能增加我的缓冲区大小可以防止发生这种问题(数据乱序发生?)。无论如何,正如第1段所述,我只是问是否有任何理由,我不应该增加缓冲区大小,如5,000字节甚至10,000字节。
添加一些代码。下面是我修改的ReceiveCallback函数(请参阅上面关于其余类的链接示例代码。当ReceiveCallback接收数据时,它会调用我在下面发布的“ReceiveSomeData”函数。由于某种原因,每隔一段时间“ReceiveSomeData”函数在一个名为“MyChitterChatter”的类中,“ReceiveCallback”函数在一个名为“AsyncClient”的类中,所以当你看到ReceiveSomeData函数锁定“this”时,它锁定MyChitterChatter类。是有我的问题可以通过说谎?
private static void ReceiveCallback(IAsyncResult ar)
{
AppDelegate appDel = (AppDelegate)UIApplication.SharedApplication.Delegate;
try {
// Retrieve the state object and the client socket
// from the asynchronous state object.
StateObject state = (StateObject) ar.AsyncState;
Socket client = state.workSocket;
// 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.
string stuffWeReceived = Encoding.ASCII.GetString(state.buffer,0,bytesRead);
string debugString = "~~~~~ReceiveCallback~~~~~~ " + stuffWeReceived + " len = " + stuffWeReceived.Length + " bytesRead = " + bytesRead;
Console.WriteLine(debugString);
// Send this data to be received
appDel.wallInteractionScreen.ChitterChatter.ReceiveSomeData(stuffWeReceived);
// Get the rest of the data.
client.BeginReceive(state.buffer,0,StateObject.BufferSize,0,
new AsyncCallback(ReceiveCallback), state);
} else {
// Signal that all bytes have been received.
receiveDone.Set();
}
}
catch (Exception e) {
Console.WriteLine("Error in AsyncClient ReceiveCallback: ");
Console.WriteLine(e.Message);
Console.WriteLine(e.StackTrace);
}
}
public void ReceiveSomeData (string data)
{
lock(this)
{
DataList_New.Add(data);
// Update the keepalive when we receive ANY data at all
IsConnected = true;
LastDateTime_KeepAliveReceived = DateTime.Now;
}
}
添加了一些示例代码。谢谢。 – LampShade
嗨EricLaw,如果你有时间,请你看看我的另一篇文章,关于数据乱序。我能够更好地重现我的问题。它位于这里http://stackoverflow.com/questions/23137246/asynchronous-client-socket-receive-buffer-data-out-of-order – LampShade