转载请注明出处,原文地址:https://blog.csdn.net/lucherr/article/details/88428244
Netty多语言(Java、Android 、C#、WebSocket)通信实例Demo (一)概述 【附源码】
Netty多语言(Java、Android 、C#、WebSocket)通信实例Demo (二)Java端简介【附源码】
Netty多语言(Java、Android 、C#、WebSocket)通信实例Demo (三)Android端简介【附源码】
Netty多语言(Java、Android 、C#、WebSocket)通信实例Demo (四)C#端简介【附源码】
C#端对应的源码目录为NettyCSharp:
源码结构如下图:
由于0基础写的这个C# Demo,所以可能有些地方写的不专业,还望高手指出,好在C#和Java的语法差不多,代码和Java客户端也很类似,没有太难的地方,下面从本人角度说几个点
1.项目需要依赖DotNetty、MessagePack、EventBus,可以从NuGet获取:
Install-Package DotNetty.Codecs
Install-Package DotNetty.Handlers
Install-Package MessagePack
Install-Package EventBus
2.MessagePack的使用可以参考官方文档:https://msgpack.org/
编码:
public class MessagePackEncoder extends MessageToByteEncoder<Object> {
@Override
protected void encode(ChannelHandlerContext ctx, Object obj, ByteBuf buf) throws Exception {
MessagePack msgPack = new MessagePack();
//序列化操作
byte[] bytes = msgPack.write(obj);
//netty操作,将对象序列化数组传入ByteBuf
buf.writeBytes(bytes);
}
}
解码:
public class MessagePackDecoder extends MessageToMessageDecoder<ByteBuf> {
@Override
protected void decode(ChannelHandlerContext ctx, ByteBuf buf, List<Object> objs) throws Exception {
final byte[] bytes;
final int length = buf.readableBytes();
bytes = new byte[length];
// 从数据包buf中获取要操作的byte数组
buf.getBytes(buf.readerIndex(), bytes, 0, length);
// 将bytes反序列化成对象,并添加到解码列表中
MessagePack msgpack = new MessagePack();
objs.add(msgpack.read(bytes));
}
}
3.使用EventBus更新界面:https://github.com/songdongsheng/EventBus
4.MessagePack实体类的属性需要是public的否则该字段的属性会变成null,这是本人目前还没搞明白的地方,希望明白人能给留个言,如:
//事件类别
[Key(0)]
public EventType eventType;
// 消息来源,如server,android etc
[Key(1)]
public String from;
[Key(2)]
public String time;
运行效果如:
源码地址:
PS:如果发现代码中有写的不对、有更好的实现方法或者文章中有误的地方,还望各位指出,我及时修改