示例#1
0
        /// <summary>
        /// 监听外网消息
        /// </summary>
        /// <param name="portForCustomer"></param>
        /// <returns></returns>
        private NetServer MakeCustomerListenPort(int portForCustomer)
        {
            NetServer ForCustomerSer = new NetServer
            {
                Port       = portForCustomer,
                Log        = XTrace.Log,
                SessionLog = XTrace.Log,
                LogSend    = true,
                LogReceive = true
            };

            ForCustomerSer.Received += (s, e) =>
            {
                var customerInService = s as INetSession; //最后数据还要回发到此外网连接中。


                //制作消息
                Qi_NETFLY_Message message = new Qi_NETFLY_Message();
                message.MessageType           = MessageType.SERVER_TO_CLIENT_FOR_CUSTOMER;
                message.CustomerSession_MsgID = Guid.NewGuid().ToString(); //customerInService;

                SingList.Add(new Sing()
                {
                    CustomerSession_MsgID = message.CustomerSession_MsgID, CustomerSession = customerInService
                });

                //从端口号判定,应该发送到哪个客户端。
                INetSession clientSession = null;
                int         index         = GetClientSession_Index_From_PortsForListing(customerInService.Host.Local.Port, ref message);



                if (index == -1)
                {
                    clientSession = null;
                }
                else
                {
                    clientSession = PortsForListing[index].ServerForClient;
                }

                if (clientSession != null)
                {
                    //补充消息
                    message.CustomerData = e.Packet.Data;
                    string json = Newtonsoft.Json.JsonConvert.SerializeObject(message);

                    byte[] replyMessage = json.GetBytes();
                    clientSession.Send(replyMessage); // 转发过去给客户端
                }
            };
            ForCustomerSer.Start();

            return(ForCustomerSer);
        }
示例#2
0
        /// <summary>
        /// 开启监听程序
        /// </summary>
        private void MakeListener()
        {
            if (svr == null)
            {
                svr = new NetServer
                {
                    Port       = This_service_Config.ServicePort,
                    Log        = XTrace.Log,
                    SessionLog = XTrace.Log,
                    LogSend    = true,
                    LogReceive = true
                };


                svr.Received += (s, e) =>                   //这里有一点问题。报文长度。的事情。2020年10月30日16:57:30
                {
                    var clientInService = s as INetSession; //我把这个叫做客户端连接进来的身份

                    //这样就能给客户端发送数据 屏蔽掉,先不用。
                    //clientInService.Send(new byte[] { 1, 2, 3 });


                    //接收数据
                    string RecvData = Encoding.UTF8.GetString(e.Packet.Data, 0, e.Packet.Count);
                    try
                    {
                        Qi_NETFLY_Message temp = Newtonsoft.Json.JsonConvert.DeserializeObject <Qi_NETFLY_Message>(RecvData);

                        DealMessages(clientInService, ref temp);//处理消息
                    }
                    catch (Exception ex)
                    {
                        //接收数据异常
                        //制作消息
                        Qi_NETFLY_Message message = new Qi_NETFLY_Message();
                        message.MessageType = MessageType.SERVER_ANSWER;
                        message.AnswerMsg   = ex.Message;
                        string json = Newtonsoft.Json.JsonConvert.SerializeObject(message);

                        byte[] replyMessage = json.GetBytes();

                        clientInService.Send(replyMessage);//回复消息
                    }
                };
            }

            if (This_service_Config.ServiceAutoRun) //配置是否自启动
            {
                if (!svr.Active)                    //当前没启动,就启动。 理应是这样的。
                {
                    svr.Start();
                }
            }
        }
示例#3
0
        /// <summary>
        /// 分配端口,更新客户端发送过来的信息
        /// </summary>
        /// <param name="message"></param>
        private void MakeCustomerPort(INetSession clientInService, Qi_NETFLY_Message message)
        {
            //1.查看Key在不在?不在就新增,在就更新。
            int keyIndex = -1;

            for (int i = 0; i < PortsForListing.Count; i++)
            {
                if (PortsForListing[i].SecretKey == message.Key)
                {
                    //发现
                    keyIndex = i;
                    break;
                }
            }
            //2.
            if (keyIndex == -1)
            {
                //新增流程
                PortManager_For_Customer row = new PortManager_For_Customer();
                row.SecretKey       = message.Key;
                row.ServerForClient = clientInService;

                for (int i = 0; i < message.LAN_list_ClientSettings.Length; i++)
                {
                    ServicePort_Setting portItem = new ServicePort_Setting();
                    portItem.IP   = message.LAN_list_ClientSettings[i].IP;
                    portItem.Port = message.LAN_list_ClientSettings[i].Port;
                    portItem.Type = message.LAN_list_ClientSettings[i].Type;
                    portItem.Note = message.LAN_list_ClientSettings[i].Note;

                    int portForCustomer = FenPeiPortForCustomer();
                    portItem.OpenPort_In_Service_For_Customer = portForCustomer;

                    //端口已经分配好了,除了 -1 的情况,都应该可以分配,并制作成监听。
                    portItem.ServerForCustomer = MakeCustomerListenPort(portForCustomer);

                    row.ServicePort_Setting_List.Add(portItem);
                }
                PortsForListing.Add(row);
            }
            else
            {
                //更新流程:2020年10月30日 23点12分 这个还没做,别忘了。
                PortsForListing[keyIndex].SecretKey       = message.Key;
                PortsForListing[keyIndex].ServerForClient = clientInService;

                ChaYiGengXin_ClientLanSettings(ref PortsForListing[keyIndex].ServicePort_Setting_List, message.LAN_list_ClientSettings);
            }
        }
示例#4
0
        /// <summary>
        /// 客户端局域网配置信息制作数据包
        /// </summary>
        /// <returns></returns>
        private byte[] MakeSettingMessage()
        {
            //制作消息
            Qi_NETFLY_Message message = new Qi_NETFLY_Message();

            message.Key         = This_client_Config.SecretKey;
            message.MessageType = MessageType.UPLOAD_CLIENT_SETTINGS_TO_SERVER;

            //复制配置信息
            message.LAN_list_ClientSettings = new Qi_LAN_Setting[This_client_Config.LAN_list.Count];
            This_client_Config.LAN_list.CopyTo(message.LAN_list_ClientSettings);


            string json = Newtonsoft.Json.JsonConvert.SerializeObject(message);

            return(json.GetBytes());
        }
示例#5
0
        /// <summary>
        /// 处理消息
        /// </summary>
        /// <param name="clientInService"></param>
        /// <param name="message"></param>
        private void DealMessages(INetSession clientInService, ref Qi_NETFLY_Message message)
        {
            switch (message.MessageType)
            {
            case MessageType.UPLOAD_CLIENT_SETTINGS_TO_SERVER:
            {
                MakeCustomerPort(clientInService, message);         //分配端口,更新客户端发送过来的信息


                //加工消息
                message.MessageType             = MessageType.SERVER_ANSWER;
                message.AnswerMsg               = "配置信息已收到";
                message.LAN_list_ClientSettings = null;        //回发消息不需要带着这些
                string json         = Newtonsoft.Json.JsonConvert.SerializeObject(message);
                byte[] replyMessage = json.GetBytes();
                clientInService.Send(replyMessage);        //回复消息
            }
            break;

            case MessageType.SERVER_ANSWER:
                break;

            case MessageType.SERVER_TO_CLIENT_FOR_CUSTOMER:
                break;

            case MessageType.CLIENT_TO_SERVER_FOR_CUSTOMER:
            {
                string CustomerData = Encoding.UTF8.GetString(message.CustomerData, 0, message.CustomerData.Length);
                //现在,我就差把message.CustomerData 这个数据发到刚刚的那个外网链接上就可以了。
                for (int i = 0; i < SingList.Count; i++)
                {
                    if (SingList[i].CustomerSession_MsgID == message.CustomerSession_MsgID)
                    {
                        SingList[i].CustomerSession.Send(message.CustomerData);
                        SingList.RemoveAt(i);
                        break;
                    }
                }
            }
            break;

            default:
                break;
            }
        }
示例#6
0
        private int GetClientSession_Index_From_PortsForListing(int port, ref Qi_NETFLY_Message message)
        {
            int index = -1;

            for (int i = 0; i < PortsForListing.Count; i++)
            {
                for (int iPorts = 0; iPorts < PortsForListing[i].ServicePort_Setting_List.Count; iPorts++)
                {
                    if (PortsForListing[i].ServicePort_Setting_List[iPorts].OpenPort_In_Service_For_Customer == port)
                    {
                        index = i;
                        message.CustomerIP   = PortsForListing[i].ServicePort_Setting_List[iPorts].IP;
                        message.CustomerPort = PortsForListing[i].ServicePort_Setting_List[iPorts].Port;
                        break;
                    }
                }
            }

            return(index);
        }
示例#7
0
        /// <summary>
        /// 接收数据
        /// </summary>
        /// <param name="obj"></param>
        private void Recive(object obj)
        {
            while (true)
            {
                byte[] buffer = new byte[1024 * 1024 * 3];
                int    r      = socketClient.Receive(buffer);

                string            RecvData = Encoding.UTF8.GetString(buffer, 0, buffer.Length);
                Qi_NETFLY_Message temp     = Newtonsoft.Json.JsonConvert.DeserializeObject <Qi_NETFLY_Message>(RecvData);

                switch (temp.MessageType)
                {
                case MessageType.UPLOAD_CLIENT_SETTINGS_TO_SERVER:
                { }
                break;

                case MessageType.SERVER_ANSWER:
                { }
                break;

                case MessageType.SERVER_TO_CLIENT_FOR_CUSTOMER:
                {
                    // 把 temp.CustomerData 解析出来
                    string CustomerData = Encoding.UTF8.GetString(temp.CustomerData, 0, temp.CustomerData.Length);

                    //在本客户端中再创建一个客户端,去连接内网设备
                    {
                        var uri    = new NetUri(NetType.Tcp, temp.CustomerIP, temp.CustomerPort);
                        var client = new TcpClient();
                        client.Connect(uri.EndPoint);

                        var ns = client.GetStream();
                        ns.Write(temp.CustomerData, 0, temp.CustomerData.Length); //发送
                        var    buf      = new Byte[1024 * 64];
                        var    rs       = ns.Read(buf, 0, buf.Length);            //回收
                        string Lan_Data = Encoding.UTF8.GetString(buf, 0, rs);    //内网回发的数据报文内容


                        //修改消息

                        temp.MessageType = MessageType.CLIENT_TO_SERVER_FOR_CUSTOMER;
                        //temp.LAN_list_ClientSettings = new Qi_LAN_Setting[temp.CustomerData.Length];
                        temp.CustomerData = Encoding.UTF8.GetBytes(Lan_Data);        //Lan_Data.GetBytes(Encoding.UTF8);
                        string json = Newtonsoft.Json.JsonConvert.SerializeObject(temp);
                        byte[] vv   = json.GetBytes();
                        //new byte[] { 1, 3, 4, 5, 6, 7 }; //

                        socketClient.Send(json.GetBytes());        //发送
                    }
                }
                break;

                case MessageType.CLIENT_TO_SERVER_FOR_CUSTOMER:
                { }
                break;

                default:
                    break;
                }
            }
        }