void SplitePackage() { int header_len = 0; byte[] package; byte[] data_package = Recv_Long_Byte == null ? Recv_Byte : Recv_Long_Byte; while (recv_data_len > 0) { package = TcpPacker.UnPackage(data_package, out header_len); if (package == null)//接受数据不足,继续接收 { break; } Recv_Server_Data(package); if (recv_data_len > header_len)//多余一个包 { byte[] tempArray = new byte[Max_Data_Len]; Array.Copy(data_package, header_len, tempArray, 0, recv_data_len - header_len); data_package = tempArray; } recv_data_len -= header_len; if (recv_data_len == 0 && Recv_Long_Byte != null) { Recv_Long_Byte = null; Long_Data_Size = 0; } } }
private void RecvData(int len, byte[] buf) { if (TcpPacker.ReadHeader(buf, len, out pkgSize)) { if (pkgSize > len) { rawBuffer = new byte[pkgSize]; Array.Copy(buf, 0, rawBuffer, 0, len); clientSocket.Receive(rawBuffer, len, pkgSize - len, SocketFlags.None); OnRecvClientCmd(rawBuffer, pkgSize); pkgSize = 0; recvBuffer = null; rawBuffer = null; return; } OnRecvClientCmd(buf, pkgSize); len -= pkgSize; int recved = 0; while (len > 0) { recved += pkgSize; pkgSize = DataView.ReadUintLe(buf, pkgSize, 2); rawBuffer = new byte[pkgSize]; Array.Copy(buf, recved, rawBuffer, 0, pkgSize); OnRecvClientCmd(rawBuffer, pkgSize); len -= pkgSize; } } }
public void send_proto_msg_to_client(int stype, int ctype, ProtoBuf.IExtensible msg) { Protocol_type = Protocol_Type.protocol_protobuf; byte[] send_bytes = EncodeCmd.Encode_Protobuf(stype, ctype, msg); byte[] tcp_package = TcpPacker.Package(send_bytes); this.client_socket.BeginSend(tcp_package, 0, tcp_package.Length, SocketFlags.None, new AsyncCallback(this.on_send_data), this.client_socket); }
void Recv_Data() { int read_len = 0; while (true) { if (!client_socket.Connected) { break; } try { if (recv_data_len < Max_Data_Len)//收的数据小于范围 { read_len = client_socket.Receive(Recv_Byte, recv_data_len, Recv_Byte.Length - recv_data_len, SocketFlags.None); } else { if (Recv_Long_Byte == null) { int pkg_size; TcpPacker.UnPackage(Recv_Byte, out pkg_size); Long_Data_Size = pkg_size; Recv_Long_Byte = new byte[Long_Data_Size]; Array.Copy(Recv_Byte, Recv_Long_Byte, Recv_Byte.Length); } read_len = client_socket.Receive(Recv_Long_Byte, recv_data_len, Recv_Long_Byte.Length - recv_data_len, SocketFlags.None); } recv_data_len += read_len; SplitePackage(); } catch (Exception e)//服务器主动关闭连接 { Debug.Log(e.ToString()); client_socket.Disconnect(true); client_socket.Shutdown(SocketShutdown.Both); client_socket.Close(); //Recv_Thread.Abort(); break; } } }
void SendJsonCmd(int stype, int ctype, string jsonBody) { byte[] cmdData = ProtoMan.PackJsonCmd(stype, ctype, jsonBody); if (cmdData == null) { return; } byte[] tcpPkg = TcpPacker.Pack(cmdData); clientSocket.BeginSend(tcpPkg, 0, tcpPkg.Length, SocketFlags.None, new AsyncCallback((IAsyncResult ir) => { try { Socket client = (Socket)ir.AsyncState; } catch { } }), clientSocket); }
public void SendProtobufCmd(int stype, int ctype, ProtoBuf.IExtensible body) { byte[] cmdData = ProtoMan.PackProtobufCmd(stype, ctype, body); if (cmdData == null) { return; } byte[] tcpPkg = TcpPacker.Pack(cmdData); clientSocket.BeginSend(tcpPkg, 0, tcpPkg.Length, SocketFlags.None, new AsyncCallback((IAsyncResult ir) => { try { Socket client = (Socket)ir.AsyncState; } catch { ModuleManager.Instance.Invoke("Log", "Failed to Send Cmd"); } }), clientSocket); }
public void send_json_msg_to_client(int stype, int ctype, string body) { Protocol_type = Protocol_Type.protocol_json; byte[] send_bytes = EncodeCmd.Encode_Json(stype, ctype, body); byte[] tcp_package = TcpPacker.Package(send_bytes); }