异步套接字缓冲数组的问题
同步套接字接受数据的时候常常是:
byte[] buffer = new byte[64];
string dataReceived = "";
try
{
while (true)
{
int bytesRead = sender.Receive(buffer);
dataReceived += Encoding.UTF8.GetString(buffer, 0, bytesRead);
if (dataReceived.IndexOf("\r\n") > -1)
break;
}
}
而如果异步套接字这样写,则会报错:
public void ReceiveMsg()
{
byte[] buffer = new byte[64]; //缓冲字节数组
serverSocket.BeginReceive(buffer,0,buffer.Length,SocketFlags.None,new AsyncCallback(receiveCallback),buffer);
}
private void receiveCallback(IAsyncResult ar)
{
try
{
byte[] buffer = (byte[])ar.AsyncState; //缓冲字节数组
StringBuilder sb = new StringBuilder();
while (true)
{
int receivedLength = serverSocket.EndReceive(ar);
sb.Append(Encoding.UTF8.GetString(buffer, 0, receivedLength));
if (sb.ToString().IndexOf("\r\n") > -1)
break;
}
string msgString = sb.ToString();
msgString = msgString.Substring(0,msgString.IndexOf("\r\n"));
Console.WriteLine("收到新消息:{0}",msgString);
}
catch (Exception e)
{
Console.WriteLine(" 接收数据失败:{0}", e.Message);
}
finally
{
ReceiveMsg(); //继续监听消息
}
}
报错:只能为每个异步操作调用一次EndReceive。这样的话要接受的信息如果大于64字节就收不了。
[解决办法]
public void ReceiveMsg() { Thread t = new Thread(new ThreadStart(receiveCallback)); t.Start(); } private void receiveCallback() {byte[] buffer = new byte[64]; string dataReceived = ""; try { while (true) { int bytesRead = sender.Receive(buffer); dataReceived += Encoding.UTF8.GetString(buffer, 0, bytesRead); if (dataReceived.IndexOf("\r\n") > -1) break; } } }
[解决办法]
StringBuilder sb = new StringBuilder(); byte[] buffer = new byte[64]; //缓冲字节数组 1