Net Developers,我需要一些帮助。我正在使用TCP / IP套接字技术和C#开发网络客户端 - 服务器应用程序。我需要将位于XML文件中的数据从服务器应用程序分发到多个订阅者应用程序:控制台窗口应用程序和Web应用程序。我用异步调用技术编写服务器应用程序。一切都运行良好,但我有问题:如果我运行了很多客户端应用程序,在分发过程中会丢失一些数据。我填写就好像它是TCP / IP缓冲区重载,因为如果我运行更多的应用程序然后更多的数据丢失,但我正在使用CallBack方法,我正在检查以前的发送结果(我将结果保存在 currentAsynchResult 检查交付,但它不适用于我。以下是一些代码:
发送方法:
static void SendToAll(string _msg)
{
foreach (ClientInfo _client in clientList)
{
Data msgToSend = new Data();
msgToSend.cmdCommand = Command.Message;
if (_client.strName == "Bill")
{
try
{
//Fill the info for the message to be send
msgToSend.strName = "Bill";
msgToSend.strMessage = _msg;
byte[] byteData = msgToSend.ToByte();
currentClient = _client;
//Send it to the client
_client.socket.BeginSend(byteData, 0, byteData.Length, SocketFlags.None, new AsyncCallback(OnBroadcast), currentAsynchResult);
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
CallBack方法:
static void OnBroadcast(IAsyncResult ar)
{
if (ar == currentAsynchResult)
{
try
{
currentClient.socket.EndSend(ar);
}
catch (ObjectDisposedException)
{ }
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
}
使用foreach发送数据:
static void StartDistributeXML()
{
XmlDocument doc = new XmlDocument();
doc.Load("test.xml");
foreach (XmlNode node in doc.DocumentElement.ChildNodes)
{
SendtToAll(node.Attributes["text"].InnerText);
}
}
我的想法是:1。检查CallBack方法(可能是我的例子不正确)2。写一些缓冲区用于发送。 3.检查有关已发送数据包的详细信息(数据包大小,数据包类型等) - 但我不知道如何实现它。请问我建议解决方案?如果需要,我可以提供更多代码。