//向服务端发送数据包,也就是一个结构体对象 public void SendMessage(uint mainId, uint assId, object obj = null) { //todo 这里要防止按钮的多次点击造成重新发送 Sendpackage pkg = new Sendpackage(); pkg.msgId = mainId; pkg.assId = assId; pkg.msgPackge = obj; lock (syncSendObj) { //登录协议去重 if (mainId == 100 && assId == 1) { Sendpackage[] packegeArr = sendPackages.ToArray(); for (int i = 0; i < packegeArr.Length; i++) { if (packegeArr[i].msgId == pkg.msgId && packegeArr[i].assId == pkg.assId) { sendPackages.Clear(); } } } else //由于登录会在重连线程里所以登录协议的loading 另行处理 { if (Application.internetReachability == NetworkReachability.NotReachable) { msgSigal.Dispatch(new MsgPara("无法连接,请检查您的网络", 2)); return; } } sendPackages.Enqueue(pkg); } }
//向服务端发送数据包,也就是一个结构体对象 public void SendMessage(uint mainId, uint assId, object obj = null) { //todo 这里要防止按钮的多次点击造成重新发送 Sendpackage pkg = new Sendpackage(); pkg.msgId = mainId; pkg.assId = assId; pkg.msgPackge = obj; lock (_syncSendObj) { //登录协议去重 if (mainId == 100 && assId == 5) { Sendpackage[] packegeArr = sendPackages.ToArray(); for (int i = 0; i < packegeArr.Length; i++) { if (packegeArr[i].msgId == pkg.msgId && packegeArr[i].assId == pkg.assId) { sendPackages.Clear(); } } } else //由于登录会在重连线程里所以登录协议的loading 另行处理 { if (Application.internetReachability == NetworkReachability.NotReachable) { EventMgr.ins.DispEvent("1000_02", null); //因为是主线程调用,所以可以正常使用 return; } } sendPackages.Enqueue(pkg); } }
//生成包头结构体 private object GenerateHead(Sendpackage pkg) { NetMessageHead head = new NetMessageHead(); head.uMessageSize = (uint)(Marshal.SizeOf(pkg.msgPackge) + HEADSIZE); head.bMainID = pkg.msgId; head.bAssistantID = pkg.assId; //bReserve=7891 表示IOS发送,bReserve=7892表示安卓发送 #if UNITY_ANDROID head.bReserve = 7892; #elif UNITY_IPHONE head.bReserve = 7891; #endif return(head); }
//按顺序发送数据包 private void SendPkgQueue() { while (runSend) { if (clientSocket == null || !clientSocket.Connected) { Debug.Log("SendPkgQueue " + clientSocket.Connected); OnSocketProblem(); break; } Thread.Sleep(200); if (sendPackages.Count > 0) { lock (syncSendObj) { Sendpackage sendpkg = sendPackages.Peek(); if (sendpkg != null) { try { //Debug.Log("start send packege :" + sendpkg.msgId); byte[] newByte = null; if (sendpkg.msgPackge != null) //有包体 包头 { byte[] head = StructToBytes(GenerateHead(sendpkg)); //把结构体对象转换成数据包,也就是字节数组 object sendobj = sendpkg.msgPackge; byte[] data = StructToBytes(sendobj); newByte = new byte[head.Length + data.Length]; Array.Copy(head, 0, newByte, 0, head.Length); Array.Copy(data, 0, newByte, head.Length, data.Length); } else //只有包头 { NetMessageHead headObj = new NetMessageHead(); headObj.bMainID = sendpkg.msgId; headObj.uMessageSize = 20; headObj.bAssistantID = sendpkg.assId; headObj.bHandleCode = 0; //bReserve=7891 表示IOS发送,bReserve=7892表示安卓发送 #if UNITY_ANDROID headObj.bReserve = 7892; #elif UNITY_IPHONE headObj.bReserve = 7891; #endif newByte = StructToBytes(headObj); } //计算出新的字节数组的长度 int length = newByte.Length; //向服务端异步发送这个字节数组 clientSocket.SendTimeout = 5000; int sendLength = clientSocket.Send(newByte, 0, length, SocketFlags.None); if (sendLength < length) { clientSocket.Close(); Debug.LogError("sendLength<length !"); break; } sendPackages.Dequeue(); } catch (Exception e) { OnSocketProblem(); Debug.Log("send message error: " + e); break; } } else { sendPackages.Dequeue(); } } } } }
//按顺序发送数据包 public void SendPkgQueue() { if (!runSend) { return; } if (gameSocket == null || !gameSocket.Connected) { Debug.Log("Game SendPkgQueue " + gameSocket.Connected + " " + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss:fff")); OnSocketProblem(); return; } if (sendPackages.Count > 0) { lock (_syncSendObj) { Sendpackage sendpkg = sendPackages.Peek(); if (sendpkg != null) { try { Debug.Log("Game start send packege mainId:" + sendpkg.msgId + " assId:" + sendpkg.assId); byte[] newByte = null; if (sendpkg.msgPackge != null) //有包体 包头 { byte[] head = LoSocket.StructToBytes(GenerateHead(sendpkg)); //把结构体对象转换成数据包,也就是字节数组 object sendobj = sendpkg.msgPackge; byte[] data = LoSocket.StructToBytes(sendobj); newByte = new byte[head.Length + data.Length]; Array.Copy(head, 0, newByte, 0, head.Length); Array.Copy(data, 0, newByte, head.Length, data.Length); } else //只有包头 { NetMessageHead headObj = new NetMessageHead(); headObj.bMainID = sendpkg.msgId; headObj.uMessageSize = 20; headObj.bAssistantID = sendpkg.assId; headObj.bHandleCode = 0; //bReserve=7891 表示IOS发送,bReserve=7892表示安卓发送 #if UNITY_ANDROID headObj.bReserve = 7892; #elif UNITY_IPHONE headObj.bReserve = 7891; #endif newByte = LoSocket.StructToBytes(headObj); } //计算出新的字节数组的长度 int length = newByte.Length; //向服务端异步发送这个字节数组 gameSocket.SendTimeout = 5000; int sendLength = gameSocket.Send(newByte, 0, length, SocketFlags.None); if (sendLength < length) { gameSocket.Close(); Debug.LogError("Game sendLength<length !"); return; } sendPackages.Dequeue(); } catch (Exception e) { OnSocketProblem(); Debug.Log("Game send message error: " + e); return; } } else { sendPackages.Dequeue(); } } } }