/// <summary> /// 对数据进行打包,然后再发送 /// </summary> /// <param name="token"></param> /// <param name="message"></param> /// <returns></returns> public bool Send(BaseNetObject baseNetObject) { byte[] message = NetBaseTool.ObjectToBytes(baseNetObject); bool isSuccess = false; if (Socket == null || !Socket.Connected) { return(isSuccess); } try { //对要发送的消息,制定简单协议,头4字节指定包的大小,方便客户端接收(协议可以自己定) byte[] buff = new byte[message.Length + 4]; byte[] len = BitConverter.GetBytes(message.Length); Array.Copy(len, buff, 4); Array.Copy(message, 0, buff, 4, message.Length); //token.Socket.Send(buff); // //新建异步发送对象, 发送消息 SocketAsyncEventArgs sendArg = new SocketAsyncEventArgs(); sendArg.UserToken = this; sendArg.SetBuffer(buff, 0, buff.Length); //将数据放置进去. isSuccess = Socket.SendAsync(sendArg); } catch (Exception e) { Logger.WriteLog("SendMessage - Error:" + e.Message); } return(isSuccess); }
/// <summary> /// 销毁网络连接控制器 /// </summary> public static void CreateConnnect(ServerDataType type, string ip, int port, ConnnectType connnectType = ConnnectType.SocketObject, bool hasHeader = true) { DestroyConnnect(); CurrConnnectType = connnectType; _NetObject = Activator.CreateInstance(Type.GetType(connnectType + ""), type, ip, port, hasHeader) as BaseNetObject; _NetObject.CreateConnect(); }
private void Receive(object o) { try { while (used) { BaseNetObject baseNetObject = NetBaseTool.ReceiveBaseNetObject(socket); if (baseNetObject is HeartBeat) { receiveHeartBeat = true; Logger.WriteLog("receive heartbeat confirm alive"); if (!useHeartBeat) { SendBaseNetObjects.Enqueue(new HeartBeat()); } } else { ReceiveBaseNetObjects.Enqueue(baseNetObject); } Thread.Sleep(DELAY); } } catch (SocketException e) { if (t != null) { t.Stop(); } Logger.WriteException(e, "心跳中断"); used = false; return; } }
private void Send(object o) { try { while (used) { if (SendBaseNetObjects.Count > 0) { BaseNetObject baseNetObject = SendBaseNetObjects.Dequeue(); NetBaseTool.SendBaseNetObject(socket, baseNetObject); } Thread.Sleep(DELAY); } } catch (SocketException e) { if (t != null) { t.Stop(); } Logger.WriteException(e, "心跳中断"); used = false; return; } }
/// <summary> /// 将一个object对象序列化,返回一个byte[] /// </summary> /// <param name="obj">能序列化的对象</param> /// <returns></returns> public static byte[] ObjectToBytes(BaseNetObject obj) { using (MemoryStream ms = new MemoryStream()) { IFormatter formatter = new BinaryFormatter(); formatter.Serialize(ms, obj); return(ms.GetBuffer()); } }
/// <summary> /// 销毁网络连接控制器 /// </summary> public static void DestroyConnnect() { if (_NetObject != null) { _NetObject.Disconnect(); } _NetObject = null; }
public void Datahandle(byte[] bytes) { BaseNetObject bno = NetBaseTool.BytesToObject(bytes) as BaseNetObject; if (bno is SystemNetObject) { SystemNetObject systemNetObject = bno as SystemNetObject; if (systemNetObject.GetType() == typeof(Msg)) { Console.WriteLine(systemNetObject); } else if (systemNetObject.GetType() == typeof(GetMyUserData)) { MyUserData = (systemNetObject as GetMyUserData).userData; } else if (systemNetObject.GetType() == typeof(CreateRoomS2C)) { transmit = (systemNetObject as CreateRoomS2C).PlayerId; wait.Set(); } else if (systemNetObject.GetType() == typeof(JoinRoomS2C)) { transmit = (systemNetObject as JoinRoomS2C); wait.Set(); } else if (systemNetObject.GetType() == typeof(GetRoomListS2C)) { transmit = (systemNetObject as GetRoomListS2C).rooms; wait.Set(); } else if (systemNetObject.GetType() == typeof(PlayerJoinS2C)) { PlayerJoin?.Invoke((systemNetObject as PlayerJoinS2C).playerId); } else if (systemNetObject.GetType() == typeof(PlayerLeaveS2C)) { PlayerLeave?.Invoke((systemNetObject as PlayerLeaveS2C).playerId); } else if (systemNetObject.GetType() == typeof(GameStart)) { StartAction?.Invoke(); } } else { GameNetObject gno = bno as GameNetObject; if (gno == null) { throw new ArgumentException(bno.GetType() + " Can't Used"); } ReceiveAction?.Invoke(gno); } //防止死锁 // wait.Set(); }
/// <summary> /// 对房间所有的玩家发送消息 /// </summary> /// <param name="room"></param> /// <param name="baseNetObject"></param> public void SendDataToRoomPlayer(BaseRoom room, BaseNetObject baseNetObject, List <Guid> notSends) { foreach (var playerId in room.Players) { if (!notSends.Contains(playerId) && playerId != Guid.Empty) { //发送玩家加入消息 SendData(id2players[playerId], baseNetObject); } } }
public static void SendBaseNetObject(Socket s, BaseNetObject baseNetObject) { SendVarData(s, ObjectToBytes(baseNetObject)); }
private void Send(BaseNetObject baseNetObject) { m_clientSocket.Send(NetBaseTool.ObjectToBytes(baseNetObject)); }
/// <summary> /// 对token发送baseNetObject /// </summary> /// <param name="token">用户</param> /// <param name="baseNetObject">消息</param> /// <returns></returns> public bool SendData(UserToken token, BaseNetObject baseNetObject) { return(token.Send(baseNetObject)); //return SendData(token, NetBaseTool.ObjectToBytes(baseNetObject)); }
/// <summary> /// 对房间所有的玩家发送消息 /// </summary> /// <param name="room"></param> /// <param name="baseNetObject"></param> public void SendDataToRoomAllPlayer(BaseRoom room, BaseNetObject baseNetObject) { SendDataToRoomPlayer(room, baseNetObject, new List <Guid>()); }