当前位置: 代码迷 >> C# >> C# Socket 一个客户端对应多台设备接收数据有关问题
  详细解决方案

C# Socket 一个客户端对应多台设备接收数据有关问题

热度:64   发布时间:2016-05-05 03:21:33.0
C# Socket 一个客户端对应多台设备接收数据问题
由于一些特殊情况,现在我不能做成多台客户端去请求一台服务器的方法。

我编写了一个c# Socket 客户端程序 用来收取多台设备的数据,每一台设备大概5分钟发送一次数据包,我接收解析处理并且存储到数据库.

现在有一个问题,我把多台服务端设备的IP地址和端口存放在XML文件中,然后开始用一台测试可以正常,但是用了多台之后,一直就接收数据就处于第一台设备收,是不是我代码哪里错了 第一次做这个

/// <summary>
        /// 程序入口
        /// </summary>
        /// <param name="args"></param>
        static void Main(string[] args)
        {
            //创建一个Socket
            foreach (Address addressValue in GetAddress())
            {
                var socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                //连接到指定服务器的指定端口
                try
                {
                    socket.Connect(addressValue.IP, addressValue.Port);
                    Console.WriteLine("{0}:{1}:Conneted...." + "\r\n", addressValue.IP, addressValue.Port);
                    //实现接受消息的方法
                    socket.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveMessage), socket);
                    Console.Read();
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Message);
                }
            }
        }

        /// <summary>
        /// 异步接收数据
        /// </summary>
        /// <param name="ar"></param>
        public static void ReceiveMessage(IAsyncResult ar)
        {
            try
            {
                var socket = ar.AsyncState as Socket;
                var length = socket.EndReceive(ar);

                string Ip = (socket.RemoteEndPoint as IPEndPoint).Address.ToString();
                int port = (socket.RemoteEndPoint as IPEndPoint).Port;

                //分多次接收
                byte[] reallData = new byte[length];
                Array.Copy(buffer, reallData, reallData.Length);
                string data = BitConverter.ToString(reallData) + "\r\n";

                StatisticsData(data, Ip, port);

                //接收下一个消息(因为这是一个递归的调用,所以这样就可以一直接收消息了)
                socket.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveMessage), socket);
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
        }


我在这里用了一个循环来获取多台设备地址。
------解决思路----------------------
你的问题出在服务,没有循环或者递归监听
  相关解决方案