怎么为JAVA NIO或Netty程序设置网络通信代理?

怎么为JAVA NIO或Netty程序设置网络通信代理?,第1张

服务端

// 设置一个处理客户端消息和各种消息事件的类(Handler)bootstrap.setPipelineFactory(newChannelPipelineFactory() {@OverridepublicChannelPipeline getPipeline()throwsException {returnChannels.pipeline(newObjectDecoder(ClassResolvers.cacheDisabled(this.getClass().getClassLoader())),newObjectServerHandler()) }})

客户端

// 设置一个处理服务端消息和各种消息事件的类(Handler)

bootstrap.setPipelineFactory(newChannelPipelineFactory() {@OverridepublicChannelPipeline getPipeline()throwsException {returnChannels.pipeline(newObjectEncoder(),newObjectClientHandler()) }})

要传递对象,自然要有一个被传递模型,一个简单的Pojo,当然,实现序列化接口是必须的。

/** * @author lihzh * @alia OneCoder * @bloghttp://www.coderli.com */public class Command implementsSerializable { privatestaticfinallongserialVersionUID = 7590999461767050471LprivateString actionNamepublicString getActionName() {returnactionName } publicvoidsetActionName(String actionName) {this.actionName = actionName }}

服务端和客户端里,我们自定义的Handler实现如下:

ObjectServerHandler .java

/** * 对象传递服务端代码 * * @author lihzh * @alia OneCoder * @bloghttp://www.coderli.com */public class ObjectServerHandler extendsSimpleChannelHandler { /** * 当接受到消息的时候触发 */@OverridepublicvoidmessageReceived(ChannelHandlerContext ctx, MessageEvent e)throwsException {Command command = (Command) e.getMessage() // 打印看看是不是我们刚才传过来的那个System.out.println(command.getActionName()) }}

ObjectClientHandler .java

/** * 对象传递,客户端代码 * * @author lihzh * @alia OneCoder * @bloghttp://www.coderli.com */public class ObjectClientHandler extendsSimpleChannelHandler { /** * 当绑定到服务端的时候触发,给服务端发消息。 * * @author lihzh * @alia OneCoder */@OverridepublicvoidchannelConnected(ChannelHandlerContext ctx, ChannelStateEvent e) {// 向服务端发送Object信息sendObject(e.getChannel()) } /** * 发送Object * * @param channel * @author lihzh * @alia OneCoder */privatevoidsendObject(Channel channel) {Command command =newCommand() command.setActionName("Hello action.") channel.write(command) } }

启动后,服务端正常打印结果:Hello action.

简单梳理一下思路:

通过Netty传递,都需要基于流,以ChannelBuffer的形式传递。所以,Object ->ChannelBuffer.

Netty提供了转换工具,需要我们配置到Handler。

样例从客户端 ->服务端,单向发消息,所以在客户端配置了编码,服务端解码。如果双向收发,则需要全部配置Encoder和Decoder。

这里需要注意,注册到Server的Handler是有顺序的,如果你颠倒一下注册顺序:

bootstrap.setPipelineFactory(newChannelPipelineFactory() {

@OverridepublicChannelPipeline getPipeline()throwsException {returnChannels.pipeline(newObjectServerHandler(),newObjectDecoder(ClassResolvers.cacheDisabled(this.getClass().getClassLoader()))) }})

结果就是,会先进入我们自己的业务,再进行解码。这自然是不行的,会强转失败。至此,你应该会用Netty传递对象了吧。

while(true){

buff.clear()

int len = sc.read(buff)

if(len ==-1){ break}

buff.flip()

content += charset.decode(buff)

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/7903038.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-11
下一篇 2023-04-11

发表评论

登录后才能评论

评论列表(0条)

保存