CWTakiku / NettyIM

A high-performance, high-configuration IM SDK based on Netty development, supports TCP protocol、 websocket protocol,、UDP protocol
MIT License
120 stars 27 forks source link

发送消息格式可以自定义吗? #10

Closed lichao3140 closed 1 year ago

lichao3140 commented 1 year ago

大佬请问如何直接发送一串字符串内容,就是单独body里面的内容。例如就直接发送内容:AA F5 6D 00 03 01 6A 00 00 00 00 00 39 35

CWTakiku commented 1 year ago

如果使用的是TCP协议,你和接收端协定好装包拆包方式,设置编码方式为string,然后直接发送此 Request request=new Request.Builder(). //创建一个消息发送request
setNeedACK(false).//需要ACK,true就会触发消息确认机制 setSendRetry(true). //此消息能否发送重试 setBody(“AA F5 6D 00 03 01 6A 00 00 00 00 00 39 35”). //body为解码所支持的对象 build();

lichao3140 commented 1 year ago

是的,谢谢大佬的解答,您这框架做IM封装的很好使用。我这边使用的是TCP协议。 1、设备编码根据您写的builder.setCodec(new DefaultTcpStringCodec())我这样设置。 2、我发送的内容您框架做了十六进制转换吗?我发送“AA F5 6D 00”收到是“00 0B 41 41 20 46 35 20 36 44 20 30 30 ” 3、现在接收消息使用imClient.newCall(request),对回复的内容也是做了格式校验?我服务器随便回复内容显示接收超时。

CWTakiku commented 1 year ago

setFrameCodec(new DefaultLengthFieldBasedFrameCodec(2,65535));//设置TCP装包拆包编解码器,也可以使用自定义的装包拆包编解码器。默认的装包拆包是这个这个,采用字段长度来拆解包的,意思前两个字节表示为内容的长度,后面指定长度的才是真正内容,确保和服务端的装包拆包机制一样

lichao3140 commented 1 year ago

请问在MessageHandler没有收到服务器的回复是什么原因? builder.setCodec(new DefaultTcpStringCodec())//默认的编解码,开发者可以使用自己的protobuf或者其他格式的编解码 .setAckConsumer(new DefaultStringAckConsumer()) //设置消息确认机制 .registerMessageHandler(new DefaultStringMessageReceiveHandler(onMessageArriveListener)) //消息接收处理器 .registerMessageHandler(new DefaultStringMessageReplyHandler(onReplyListener)) //消息状态接收处理器 .registerMessageHandler(new HJLRespHandler()) //消息接收处理器 .setFrameCodec(new DefaultLengthFieldBasedFrameCodec(2,65535))//设置TCP装包拆包编解码器 .addAddress(new Address(ip, port, Address.Type.TCP));

CWTakiku commented 1 year ago

服务器回的内容是否有按照你设定的装包拆包的格式去装包,按上述代码,服务器应该回的内容是(2字节内容长度+内容),具体服务器样例代码可以参考APP模块test下服务器代码

CWTakiku commented 1 year ago

上述的.setAckConsumer(new DefaultStringAckConsumer()) //设置消息确认机制,如果你需要单条消息的回执需要设置你自己的而不是默认的,否则要去掉这个设置

lichao3140 commented 1 year ago

谢谢大佬,我这边能收到发的消息了"00 0B 41 41 20 46 35 20 36 44 20 30 30",是这里长度要对应上DefaultLengthFieldBasedFrameCodec(2,11),但是我项目不同的协议命令有些协议长度不一样,这里该怎么设置呢

CWTakiku commented 1 year ago

DefaultLengthFieldBasedFrameCodec()第一个参数是内容长度字段占多少个字节,第二个是一帧最大字节数,建议不更改65535

lichao3140 commented 1 year ago

好的,谢谢大佬,我这边和服务器通讯协议要改才好。