在上一节基础上,使用委托和事件调整代码模式。
1.将解码器,编码器,去除多余代码。
public class CommonEncoder<T> : MessageToByteEncoder<T>
{
protected override void Encode(IChannelHandlerContext context, T message, IByteBuffer output)
{
//序列化类
byte[] messageBytes = MessagePackHelper.SerializeToBinary(message);
IByteBuffer initialMessage = Unpooled.Buffer(messageBytes.Length);
initialMessage.WriteBytes(messageBytes);
output.WriteBytes(initialMessage);
}
}
public class CommonDecoder : ByteToMessageDecoder
{
protected override void Decode(IChannelHandlerContext context, IByteBuffer input, List<object> output)
{
byte[] array = new byte[input.ReadableBytes];
input.GetBytes(input.ReaderIndex, array, 0, input.ReadableBytes);
input.Clear();
var temp = MessagePackHelper.DeserializeWithBinary<Message>(array);
output.Add(temp);
}
}
2.在类库项目中新建委托类。
public delegate void CommandReceiveEvent(object sender, MessageEventArgs e);
public delegate void MessageSendEvent(object sender, MessageEventArgs e);
public delegate void MessageGroupSendEvent(object sender, MessageEventArgs e);
public class MessageEventArgs : EventArgs
{
public MessageEventArgs(IMessage cmd) => CMD = cmd;
public IMessage CMD { set; get; }
}
3.客户端主程序里修改:
pipeline.AddLast(new CommonEncoder<Message>());
pipeline.AddLast(new CommonDecoder());
pipeline.AddLast(new IdleStateHandler(0, 10, 0));
HelloClientHandler ClientHandler = new HelloClientHandler
{
_Socket = pipeline.FirstContext()
};
ClientHandler.MessageReceived += ClientHandler_MessageReceived;
ClientHandler.MessageSend += ClientHandler_MessageSen