/// <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); }
/// <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(); } } }
/// <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); } }
/// <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()); }
/// <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; } }
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); }
/// <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; } } }