22yune / nettyDemo

netty rpc demo
1 stars 0 forks source link

netty sync机制中,需要更改客户端传输编码? #1

Open maxskywalker opened 5 years ago

maxskywalker commented 5 years ago

原生的socket输出时, 需要将流转码为GB18030, PrintWriter write = new PrintWriter(new OutputStreamWriter(socket.getOutputStream(), "GB18030")); 在SyncPoolClient 中将 channelConfig.addHandler(StringEncoder.class); channelConfig.addHandler(StringDecoder.class); 修改为channelConfig.addHandler(new StringEncode(Charset.forName("GB18030“))); channelConfig.addHandler(new StringDecode(Charset.forName("GB18030“))); 时,没有生效?想请教下这个问题?

22yune commented 5 years ago

"原生的socket输出时, 需要将流转码为GB18030"这个是作为服务端还是客服端的输出?SyncPoolClient是客户端,它的StringEncode是在将请求输出到服务端时将字符串编码成指定编码格式的二进制表示;它的StringDecode是在接收到服务端的回复时(输入),将输入按指定编码格式解码成字符串。字符串都是JAVA中的编码格式。JAVA的编码格式好像是unicode。你的问题是为什么没有生效,这个基于现在的情况我也不知道。你可以调试一下,在每个Handler的channelRead方法是都打上断点,这个是在接收到输入时触发的方法。如果没有触发,说明可能是之前发请求到服务端,服务端回复消息的过程有问题。 你是怎么看到我的这个DEMO项目的?为什么会在这里提问?(好奇像这种随便提交的项目怎么会被人看到~)

maxskywalker commented 5 years ago

那个编码问题已经解决后来仔细对比netty的demo代码。在TcpClientPool.java中84行,初始化channel时,加上ch.pipeline().addLast("encode", ""); ch.pipeline().addLast("decode", ""); 就可以了。至于demo是在github上面直接搜索的,感谢回答,感谢demo

maxskywalker commented 5 years ago

我现在打算着您开源的代码改为netty4的版本,但发现这个DefaultSyncTcpClient.java中的ChannelHandlerAdapter netty5版本的在netty4中没有userEventTriggered这个函数,那个SycClientCompleteHandler也没有channelRead()函数。请教下如何实现方便点,谢谢?

22yune commented 5 years ago

netty4中有个继承ChannelHandlerAdapter 的ChannelInboundHandlerAdapter接口,里面有userEventTriggered这个方法,也有channelRead()。 建议看下我的netty-client项目,这个是netty-demo的优化版本,主要是连接池和多线程的实现修改,netty-demo版本的连接池实现没有达到预期效果。

maxskywalker commented 5 years ago

好,主要是自己平时基本上用不到netty,所以底层基本不知到。我参考下netty-demo这个项目,谢谢。

maxskywalker commented 5 years ago

将代码抄到netty4中,使用这个ChannelInboundHandlerAdapter替换netty5使用的ChannelHandlerAdapter 代码可以编译通过,现在就剩gb18030编码问题了,netty5那个编码解决了,在试试netty4。

maxskywalker commented 5 years ago

在netty4,我发现将ChannelInboundHandlerAdapter替换netty5使用的ChannelHandlerAdapter 后,当调用DefaultSyncTcpClient 中的send方法时,在return promise.get()方法前面需要加入Thread.sleep()延时一段时间,才可以和 netty5版本代码得到同样的结果?这个地方就比较底层了

maxskywalker commented 5 years ago

这个代码用main函数启动存在延时问题,但是用jfinal plugin机制,就是先初始化poolClient,右面进行业务处理就可以了