我正在编写一个应用程序服务器,它将维护超过2,000个长期持久客户端TCP连接。我想知道异步接受连接和从中读取数据的最有效方法是什么。
我基本上想要将所有套接字代码包含在具有如下公共足迹的类中:
public partial class ApplicationClient
{
private Socket socket;
public ApplicationClient(Socket socket)
{
this.socket = socket;
}
public event ApplicationMessageEventHander MessageReceived;
private void OnMessageReceived(string message)
{
ApplicationMessageEventHander messageReceived = this.MessageReceived;
if (messageReceived != null)
{
var eventArgs = new ApplicationMessageEventArgs(message);
messageReceived(this, eventArgs);
}
}
}
使用.NET套接字来适应这种架构的最佳方法是什么?
编辑:还值得一提的是,客户端传递的每条消息都将以换行符终止。我不想在收到整个邮件之前解雇该事件。
答案 0 :(得分:1)
您应该使用BeginReceive和EndReceive函数。他们将参数带到AsyncCallback委托。然后,您必须编写一些包装它的代码来处理您的新行,然后您应该调用另一个委托。
我相信这样的事情是处理它的合适方式:
const uint buf_len = 40;
byte[] bBuffer;
string strBuffer;
public ApplicationClient(Socket socket)
{
this.socket = socket;
bBuffer = new byte[buf_len];
strBuffer = "";
socket.BeginReceive(buffer, 0, buf_len, 0, my_callback, null);
}
protected void AsyncCallback(IAsyncResult iar)
{
int i;
int bytesRead;
string[] parts;
bytesRead = socket.EndReceive(iar);
if(read > 0)
{
strBuffer += Encoding.ASCII.GetString(buffer, 0, bytesRead);
parts = strBuffer.split("\n");
for(i = 0; i < parts.Length - 1; ++i)
{
theRealCallback(parts[i]);
}
strBuffer = parts[i];
}
socket.BeginReceive(buffer, 0, buf_len, 0, my_callback, null);
}