使用异步套接字从TCP / IP上的文件分发数据,数据丢失(如果有很多订阅者)

时间:2014-02-16 03:14:00

标签: c# xml sockets asynchronous tcp

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.检查有关已发送数据包的详细信息(数据包大小,数据包类型等) - 但我不知道如何实现它。请问我建议解决方案?如果需要,我可以提供更多代码。

0 个答案:

没有答案