public void SendDataTo(int playerID, NetworkMsg msg) { if (PlayerIDToConnID.ContainsKey(playerID)) { int connID = PlayerIDToConnID[playerID]; networkManager.SendDataTo(connID, msg); } }
/// <summary> /// 将服务器发的的bytes进行解析 /// </summary> private void AnalyticalNetworkMsg() { while (ringBuf.Size >= sizeof(uint)) { byte[] lengthByte = new byte[sizeof(uint)]; ringBuf.CopyTo(0, lengthByte, 0, lengthByte.Length); uint msgLength = BitConverter.ToUInt32(lengthByte, 0); msgLength = NetworkMsg.NetworkToHostOrder(msgLength); if (ringBuf.Size >= msgLength) { byte[] msgdata = new byte[msgLength]; ringBuf.Get(msgdata); if (msgLength == 0) { ringBuf.Clear(); return; } using (MemoryStream stream = new MemoryStream(msgdata)) { BinaryReader br = new BinaryReader(stream); NetworkMsg Nmsg = new NetworkMsg(); try { Nmsg.length = NetworkMsg.NetworkToHostOrder(br.ReadInt32()); Nmsg.msgId = NetworkMsg.NetworkToHostOrder(br.ReadInt32()); Nmsg.sequence = (short)NetworkMsg.NetworkToHostOrder(br.ReadInt16()); } catch (Exception) { throw; } // 10 is header length length:4 msgId:4 sequence:2 byte[] data = br.ReadBytes((int)msgLength - 10); Nmsg.data = data; lock (objThread) { mMsgEvents.Enqueue(Nmsg); } } } else { break; } } }
//一个robot发送游戏开始消息 public void send_start_game(Robot robot) { Log.INFO("sending start msg.."); NetworkMsg msg = new NetworkMsg(); msg.MsgType = Type.StartGame; robot.m_clientSocket.dump_send_queue(msg); robot.m_clientSocket.send_queue_data(); }
//接收到客户端的数据事件 private void process_receive(SocketAsyncEventArgs e) { // check if the remote host closed the connection if (e.SocketError == SocketError.Success && e.BytesTransferred > 0) { AsyncUserToken token = e.UserToken as AsyncUserToken; System.Net.Sockets.Socket socket = token.Socket; //放入对应的robot的queue中 int socketId = m_robotSystem.get_socketToRobotMap()[socket]; Robot robot = m_robotSystem.get_robots()[socketId]; byte[] data = new byte[e.BytesTransferred]; Array.Copy(e.Buffer, e.Offset, data, 0, data.Length); lock (token.Buffer) { token.Buffer.AddRange(data); } do// (packedDataOffset < e.BytesTransferred) { byte[] lengthByte = token.Buffer.GetRange(0, 4).ToArray(); int length = BitConverter.ToInt32(lengthByte, 0); if (length > token.Buffer.Count - 4) { break; } byte[] msgData = token.Buffer.GetRange(4, length).ToArray(); lock (token.Buffer) { token.Buffer.RemoveRange(0, length + 4); } //放入对应的robot的queue中 NetworkMsg netMsg = PBSerializer.deserialize <NetworkMsg>(msgData); robot.m_clientSocket.dump_receive_queue(netMsg); } while (token.Buffer.Count > 4); Interlocked.Add(ref m_totalBytesRead, e.BytesTransferred); if (!socket.ReceiveAsync(e)) { process_receive(e); } } else { close_clientSocket(e); } }
public void AddSendCache(NetworkMsg msg) { byte[] bytes = Serialization.SerializeData(msg, msg); if (bytes != null) { bytes = NetCommon.Encode(bytes); SendCache.Enqueue(bytes); } }
private void load_nearby_area_msg(Robot robot, List <Robot> robots) { int areaId = robot.m_mapComponent.m_areaId; int[,] offset = new int[, ] { { -1, -1 }, { 0, -1 }, { 1, -1 }, { -1, 0 }, { 1, 0 }, { -1, 1 }, { 0, 1 }, { 1, 1 } }; int y = areaId / (int)m_areaAcount; int x = areaId % (int)m_areaAcount; //发送robot周围区域的所有robots的位置信息 NetworkMsg robotDataMsg = new NetworkMsg(); robotDataMsg.MsgType = Type.RobotsData; for (int i = 0; i < 8; i++) { int nearbyX = x + offset[i, 0]; int nearbyY = y + offset[i, 1]; if (nearbyX < 0 || nearbyX >= m_areaAcount || nearbyY < 0 || nearbyY >= m_areaAcount) { continue; } int nearbyAreaId = nearbyX + (int)m_areaAcount * nearbyY; Area nearbyArea = m_areasMap[nearbyAreaId]; List <int> nearbyRobotsList = nearbyArea.get_robotsIdList(); for (int k = 0; k < nearbyRobotsList.Count; k++) { int nearbyRobotId = nearbyRobotsList[k]; RobotData nearbyRobotData = new RobotData(); nearbyRobotData.ClientInfo = new ClientInfo(); nearbyRobotData.Position = new Position(); nearbyRobotData.ClientInfo.RobotSocketId = nearbyRobotId; nearbyRobotData.Position = robots[nearbyRobotId].m_mapComponent.m_pos; robotDataMsg.RobotData.Add(nearbyRobotData); } } //发送robot自己的位置信息 RobotData robotData = new RobotData(); robotData.ClientInfo = new ClientInfo(); robotData.Position = new Position(); robotData.ClientInfo.RobotSocketId = robot.m_socketId; robotData.Position = robot.m_mapComponent.m_pos; robotDataMsg.RobotData.Add(robotData); robot.m_clientSocket.dump_send_queue(robotDataMsg); }
public byte[] WriteArray(NetworkMsg type, byte[] tokenBytes) { BasePacket p = new BasePacket(8 + 32 + tokenBytes.Length); p.WriteByte((byte)type); p.WriteInt(tokenBytes.Length); p.WriteByteArray(tokenBytes); return(p.ByteBuffer); }
public static void CMD_ENTERROOM(NetworkMsg msg) { Res_enter xmsg = new Res_enter(); using (MemoryStream stream = new MemoryStream(msg.data)) { xmsg = ProtoBuf.Serializer.Deserialize <Res_enter>(stream); } Network.Myplayer.m_iRoomID = xmsg.m_iRoomID; CMD_ENTERROOM_result = xmsg.m_nResultID; }
/// <summary> /// Sends a MsgReceived event /// </summary> /// <param name="msg"></param> protected void OnMsgReceived(NetworkMsg msg) { if (msg is ClientDisconnectMsg) { OnDisconnected(false); } else { MsgReceived?.Invoke(this, new MsgEventArgs(msg)); } }
public static void MSG_FRIEND_OPT_ADD(NetworkMsg msg) { Friend_resAddNotify res = new Friend_resAddNotify(); using (MemoryStream stream = new MemoryStream(msg.data)) { res = ProtoBuf.Serializer.Deserialize <Friend_resAddNotify>(stream); } if (res.resultID == (int)ResultID.result_id_success && res.accept == true) { if (Network.name == res.Name2) { Network.Friend_list[Network.Friend_cnt].name = Network.Find_Friend.name; Network.Friend_list[Network.Friend_cnt].sex = Network.Find_Friend.sex; Network.Friend_list[Network.Friend_cnt].exp = Network.Find_Friend.exp; Network.Friend_list[Network.Friend_cnt].status = Network.Find_Friend.status; Network.Friend_list[Network.Friend_cnt].wxLogin = Network.Find_Friend.wxLogin; if (Network.Find_Friend.wxLogin == true) { Network.Friend_list[Network.Friend_cnt].wxHead = Network.Find_Friend.wxHead; } Network.Friend_cnt++; } else { //Network.Find_Friend.name = res.Name2; //Network.Find_Friend.sex = 1; //Network.Find_Friend.exp = 0; //Network.Find_Friend.status = 0; Network.Friend_list[Network.Friend_cnt].name = Network.Added_Friend.name; Network.Friend_list[Network.Friend_cnt].sex = Network.Added_Friend.sex; Network.Friend_list[Network.Friend_cnt].exp = Network.Added_Friend.exp; Network.Friend_list[Network.Friend_cnt].status = Network.Added_Friend.status; Network.Friend_list[Network.Friend_cnt].wxLogin = Network.Added_Friend.wxLogin; if (Network.Added_Friend.wxLogin == true) { Network.Friend_list[Network.Friend_cnt].wxHead = Network.Added_Friend.wxHead; } Network.Friend_cnt++; } Network.mySort(); EventDispatcher.DispatchEvent("EventUpdateFriendList", null, null); } else if (res.resultID == (int)ResultID.result_id_success && res.accept == false) //拒绝 { if (Network.name == res.Name2) { EventDispatcher.DispatchEvent("EventShowMessageUIwithRefuse", null, null); } } }
public void SendDataTo(int clientID, NetworkMsg msg) { if (msg != null) { lock (Serialization.SerializationLock) { //NetCommon.WriteMessage("roomId: " +msg.uid + "sends msg to client: " + clientID); // UnityEngine.Debug.Log("send Date Size " ); Client client = server.clients[clientID]; client.BeginSend(msg); } } }
public static void MSG_FRIEND_GETINFO(NetworkMsg msg) { Friend_resGetInfo res = new Friend_resGetInfo(); using (MemoryStream stream = new MemoryStream(msg.data)) { res = ProtoBuf.Serializer.Deserialize <Friend_resGetInfo>(stream); } if (res.resultID == (int)ResultID.result_id_success) { Find_Friend.name = res.m_NameOther; Find_Friend.sex = res.sex; Find_Friend.exp = res.exp; Find_Friend.game_cnt = res.battleCnt; Find_Friend.game_win = res.winCnt; Find_Friend.status = res.isOnline ? 1 : 0; if (Find_Friend.name == Network.name) { Find_Friend.relation = 0; } else { Find_Friend.relation = 2; for (int i = 0; i < Friend_cnt; i++) { if (Find_Friend.name == Friend_list[i].name) { Find_Friend.relation = 1; break; } } } Find_Friend.wxLogin = res.wxLogin; if (res.wxLogin == true) { Find_Friend.wxHead = res.wxHead; } //弹窗显示信息 EventDispatcher.DispatchEvent("EventShowInfomationUI", null, null); } else { //用户不存在或者输入不合法 EventDispatcher.DispatchEvent("EventShowMessageUIwithString", null, null); } }
public void SetToken(int dataSize, byte[] data) { //Initialization NetworkMsg msgType = NetworkMsg.Unknown; byte type; int size; //Read the packet and convert it to a byte array IMessageRider token = SockInterface.ReadToken(dataSize, data, out type, out size); //Convert the type into a enum readable type msgType = (NetworkMsg)type; //Handle the token HandleToken(msgType, token); SocketLog.Info("Set token type {0} for connection {1}", msgType, ConnectionInfo.Peer.ConnectId); }
public static void CMD_MAP_MATCH(NetworkMsg msg) { Res_merge xmsg = new Res_merge(); using (MemoryStream stream = new MemoryStream(msg.data)) { xmsg = ProtoBuf.Serializer.Deserialize <Res_merge>(stream); } CMD_MAP_MATCH_result = xmsg.m_nresultid; if (CMD_MAP_MATCH_result == (int)ResultID.result_id_success) { gameInfo = xmsg; } }
public void SendData(NetworkMsg msg) { int currentindx = 4; var tbuffer = NetCommon.Encode(Serialization.Serialize(msg)); Array.Copy(tbuffer, 0, BigRecivebuffer, currentindx, tbuffer.Length); currentindx += tbuffer.Length; if (currentindx > 4) { System.Buffer.BlockCopy(BitConverter.GetBytes(currentindx - 4), 0, BigRecivebuffer, 0, 4); clientSocket.SendData(BigRecivebuffer, currentindx); } }
public static T DeserializeMsg <T>(NetworkMsg msg, bool showLog) { T rsp; using (MemoryStream stream = new MemoryStream(msg.data)) { rsp = ProtoBuf.Serializer.Deserialize <T>(stream); } if (showLog) { PrintRecivedMsgProperties(rsp); } return(rsp); }
/// <summary> /// 邀请相关 /// </summary> public static void MSG_FRIEND_INVITATION(NetworkMsg msg) { Friend_invitation res = new Friend_invitation(); using (MemoryStream stream = new MemoryStream(msg.data)) { res = ProtoBuf.Serializer.Deserialize <Friend_invitation>(stream); } if (res.ResultID == (int)ResultID.result_id_success) { //消息发送成功 } else { //弹窗用户不存在或者非法 } }
//发送处理完的所有的robot的信息 public void send_robots_data() { List <Robot> robots = RobotSystem.get_singleton().get_robots(); lock (robots) { foreach (Robot robot in robots) { Queue <NetworkMsg> sendQue = robot.m_clientSocket.load_send_queue(); while (sendQue.Count > 0) { NetworkMsg msg = sendQue.Dequeue(); m_tcpServer.send_networkMessage(msg, robot.m_clientSocket.m_socket); } } } }
public void generate_robot(Socket clientSocket) { lock (addRobotLocker) { Position initPos = generate_init_position(); Robot robot = new Robot(m_socketId, clientSocket, initPos); m_robots.Add(robot); m_socketToRobotMap.Add(clientSocket, m_socketId); m_socketId++; m_numrobots++; //返回给client sockectId NetworkMsg connectedMsg = new NetworkMsg(); connectedMsg.MsgType = Type.ConnectedId; connectedMsg.SocketId = robot.m_socketId; robot.m_clientSocket.dump_send_queue(connectedMsg); } }
public static void MSG_FRIEND_DEL(NetworkMsg msg) { Friend_add_del res = new Friend_add_del(); using (MemoryStream stream = new MemoryStream(msg.data)) { res = ProtoBuf.Serializer.Deserialize <Friend_add_del>(stream); } if (res.ResultID == (int)ResultID.result_id_success) { //消息发送成功 } else { //消息发送失败 } }
/// <summary> /// Deserializes a string version of an arbitrary NetworkMessage and send a MsgReceived event /// </summary> /// <param name="message"></param> private void ProcessMessage(string message) { NetworkMsg msg = null; try { msg = NetworkMsg.Deserialize(message); } catch (Exception ex) { System.Diagnostics.Debug.WriteLine($"Failed to deserialize message: {ex.Message}"); } if (msg != null) { OnMsgReceived(msg); } }
public void ClientReceiveMessageTest() { var stream = new MemoryStreamThreadSafeSeek(); var writer = new StreamWriter(stream); var client = new MuClient(stream); NetworkMsg rcvdMsg = null; client.MsgReceived += (s, e) => rcvdMsg = e.Msg; var msg = new FakeNetworkMsg() { Content = "ReceiveTest" }; writer.WriteAndRewind(msg.Serialize()); Thread.Sleep(110); Assert.AreEqual(msg, rcvdMsg); }
public byte[] WriteToken(IMessageRider token, NetworkMsg type) { byte[] tokenArray = token.ToByteArray(); //Handle null tokens int tokenSize = 0; if (tokenArray != null) { tokenSize = tokenArray.Length; } //The size is a byte in bits (8) + the size of the token to transmit Packet p = new Packet(8 + tokenSize); p.WriteByte((byte)type); p.WriteToken(token); p.FinishWriting(); // Not necessary as our defination of this packet was precise, but still good form return(p.ByteBuffer); }
public static byte[] Serialize(NetworkMsg networkMsg)//在这可以继续添加要发送的Msg { var p_TheAllMsg = new DS_protocol.p_AllMsg(); p_TheAllMsg.player_id = networkMsg.player_id; p_TheAllMsg.type = networkMsg.type; if (networkMsg.type == (int)CmdType.ASKFRAME) { var askFrame = networkMsg as AskFrame; p_TheAllMsg.AskFrame = new DS_protocol.p_AskFrame(); askFrame.areas.ForEach(i => p_TheAllMsg.AskFrame.areas.Add(i)); askFrame.frames.ForEach(i => p_TheAllMsg.AskFrame.frames.Add(i)); } else if (networkMsg.type == (int)CmdType.START) { var startGame = networkMsg as StartGame; p_TheAllMsg.StartGame = new DS_protocol.p_StartGame(); p_TheAllMsg.StartGame.test = 0; } else if (networkMsg.type == (int)CmdType.FRAME) { var frame = networkMsg as Frame; p_TheAllMsg.Frame = new DS_protocol.p_Frame(); p_TheAllMsg.Frame.buffers = SerializeFrame(frame); // p_TheAllMsg.Frame.syncFrame = new DS_protocol.p_SyncFrame(); // p_TheAllMsg.Frame.area_id = frame.syncFrame.get_area_id(); // p_TheAllMsg.Frame.syncFrame.frame_count = frame.syncFrame.get_frame_count(); // Buffer_SyncFrame_msg_list(frame.syncFrame.get_msg(), p_TheAllMsg.Frame.syncFrame.msg_list); } else if (networkMsg.type == (int)CmdType.JOIN) { var join = networkMsg as Join; p_TheAllMsg.Join = new DS_protocol.p_Join(); p_TheAllMsg.Join.room_id = join.room_id; } return(Serialize <DS_protocol.p_AllMsg>(p_TheAllMsg)); }
public void BeginSend(NetworkMsg msg) { if (ms == null || br == null) { ms = new MemoryStream(); br = new BinaryWriter(ms); br.Write((int)(0)); } if (ms != null && br != null) { byte[] data = Serialization.SerializeData(msg); if (data != null) { br.Write(data.Length); br.Write(data); } } }
public void SendGameData() { Queue <NetworkMsg> sendBuffer = robotGame.GetSendBuffer(); int currentindx = 4; while (sendBuffer.Count > 0) { NetworkMsg msg = sendBuffer.Dequeue(); var tbuffer = NetCommon.Encode(Serialization.Serialize(msg)); Array.Copy(tbuffer, 0, BigRecivebuffer, currentindx, tbuffer.Length); currentindx += tbuffer.Length; } if (currentindx > 4) { System.Buffer.BlockCopy(BitConverter.GetBytes(currentindx - 4), 0, BigRecivebuffer, 0, 4); clientSocket.SendData(BigRecivebuffer, currentindx); } }
public static void MSG_FRIEND_STATUS(NetworkMsg msg) { Friend_notifyStatus res = new Friend_notifyStatus(); using (MemoryStream stream = new MemoryStream(msg.data)) { res = ProtoBuf.Serializer.Deserialize <Friend_notifyStatus>(stream); } for (int i = 0; i < Friend_cnt; i++) { if (Friend_list[i].name == res.m_Name) { Friend_list[i].status = res.online ? 1 : 0; break; } } Network.mySort(); EventDispatcher.DispatchEvent("EventUpdateFriendList", null, null); }
public static void CMD_LOGIN(NetworkMsg msg) { Res_login xmsg = new Res_login(); using (MemoryStream stream = new MemoryStream(msg.data)) { xmsg = ProtoBuf.Serializer.Deserialize <Res_login>(stream); } Network.Myplayer.m_iPlayerUID = xmsg.m_nPlayerID; Network.playerid = xmsg.m_nPlayerID; if (xmsg.m_iHaveRole == false) { Network.gameState = Network.SGameState.CreateCharacter; } else { //Network.Instance.Send_EnterRoom(); //Network.NetworkMode = true; } }
public static byte[] SerializeData(BaseProtocol baseProtocol, NetworkMsg networkMsg, ReplyGetRooms replyGetRooms = null, ReplyJoin replyJoin = null, ReplyAskFrame replyAskFrame = null, ReplyID replyID = null, ReplyStart replyStart = null) { p_AllMsg = new p_AllMsg(); if (baseProtocol != null) { Buffer_BaseProtocol(baseProtocol); } if (networkMsg != null) { Buffer_NetworkMsg(networkMsg); } if (networkMsg.type == (int)CmdType.REPLYGETROOMS) { replyGetRooms = networkMsg as ReplyGetRooms; Buffer_ReplyGetRooms(replyGetRooms); } else if (networkMsg.type == (int)CmdType.REPLYJOIN) { replyJoin = networkMsg as ReplyJoin; Buffer_ReplyJoin(replyJoin); } else if (networkMsg.type == (int)CmdType.REPLYASKFRAME) { replyAskFrame = networkMsg as ReplyAskFrame; Buffer_ReplyAskFrame(replyAskFrame); } else if (networkMsg.type == (int)CmdType.REPLYSTART) { replyStart = networkMsg as ReplyStart; BufferReplyStart(replyStart); } else if (networkMsg.type == (int)CmdType.REPLYID) { replyID = networkMsg as ReplyID; Buffer_ReplyID(replyID); } return(Serialize <p_AllMsg>(p_AllMsg)); }
//更新robot数组信息 public void receive_robots_data() { List <Robot> robots = RobotSystem.get_singleton().get_robots(); bool start_flag = false; foreach (Robot robot in robots) { if (robot == null) { continue; //断开连接时会使得robot = null } Queue <NetworkMsg> receiveQue = robot.m_clientSocket.load_receive_queue(); while (receiveQue.Count > 0) { NetworkMsg msg = receiveQue.Dequeue(); if (msg.MsgType == Type.StartGame) { Log.INFO("receivesd START msg from client {0}", robot.m_socketId); start_flag = true; } else if (msg.MsgType == Type.RobotsData) { Log.INFO("receivesd ROBOT_DATA msg from client {0}", robot.m_socketId); if (msg.RobotData.Count > 0) { robot.m_mapComponent.m_pos.X = msg.RobotData[0].Position.X; robot.m_mapComponent.m_pos.Y = msg.RobotData[0].Position.Y; } } } } if (start_flag) { send_robots_data();//返回socketId到clients GameServer.s_isGameStart = true; } }
public static void Send(NetworkMsg msg) { ws.Send(JsonConvert.SerializeObject(msg)); }