在netty简单实例 基础上,修改代码,使其能够传输对象。
首先:
sever和client的编码、解码handler需要修改。因为netty只支持字符流传输,所以需要我们将对象转换为字符流,修改如下:
server端:
bootstrap.setPipelineFactory(new ChannelPipelineFactory() {
public ChannelPipeline getPipeline() throws Exception {
/*典型的过滤式处理*/
ChannelPipeline pipeline = Channels.pipeline();
// pipeline.addLast("encode", new StringEncoder());
// pipeline.addLast("decode", new StringDecoder());
/*添加自定义的handler,对请求进行处理*/
pipeline.addLast("encode", new ObjectEncoder());
pipeline.addLast("decode", new ObjectDecoder(ClassResolvers.cacheDisabled(this
.getClass().getClassLoader())));
pipeline.addLast("handler", handler);
return pipeline;
}
});
client端:
bootstrap.setPipelineFactory(new ChannelPipelineFactory() {
public ChannelPipeline getPipeline() throws Exception {
ChannelPipeline pipeline = Channels.pipeline();
//channelPipeline.addLast("encode", new StringEncoder());
//channelPipeline.addLast("decode", new StringDecoder());
pipeline.addLast("encode", new ObjectEncoder());
pipeline.addLast("decode", new ObjectDecoder(ClassResolvers.cacheDisabled(this
.getClass().getClassLoader())));
pipeline.addLast("handler", handler);
return pipeline;
}
});
其次:
client and server handler need to rewrite,for exaple:
ServerObjectHandler:
public class ServerObjectHandler extends SimpleChannelHandler {
public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Exception {
People people = (People) e.getMessage();
System.out.println("" + new Date().toString());
System.out.println("get one info:"+"\n" + " name:" + people.getName() + "\n"
+ " age:" +people.getAge() + "\n"
+ "address:" + people.getAddress() + "\n");
Channel ch = e.getChannel();
//String string = "server has got the object";
Object object ="server has got the object";
ch.write(object);
}
}
clientObjectHandler:
public class ClientObjectHandler extends SimpleChannelHandler {
public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Exception {
Object object = e.getMessage();
System.out.println("Get message:" +"\n"+"\n");
System.out.println("" + new Date().toString() + "\n" +
"***************" +
object.toString() +
"***************");
}
}
last:
the object whitch will be sended, is :
public class People implements Serializable {
private static final long serialVersionUID = 1L;
private String name;
private String age;
private String address;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
}
And the config will be changed,for exaple:
spring-client.xml
<bean id="clientThread" class="com.netboy.netty.client.ClientThread" >
<property name="nettyClient" ref="nettyClient" />
</bean>
<bean id="objectThread" class="com.netboy.netty.client.ObjectThread" >
<property name="nettyClient" ref="nettyClient" />
</bean>
<bean id="nettyClient" class="com.netboy.netty.client.NettyClient" >
<property name="host" value="127.0.0.1" />
<property name="port" value="8080" />
<property name="handler" ref="clientObjectHandler" />
</bean>
<bean id="clientHandler" class="com.netboy.netty.handler.ClientHandler" />
<bean id="clientObjectHandler" class="com.netboy.netty.handler.ClientObjectHandler" />
spring-server.xml:
<bean id="nettyServer" class="com.netboy.netty.server.NettyServer" >
<property name="port" value="8080" />
<property name="handler" ref="objectHandler" />
</bean>
<bean id="serverHandler" class="com.netboy.netty.handler.ServerHandler" />
<bean id="objectHandler" class="com.netboy.netty.handler.ServerObjectHandler" />
last:
first run server,then run client
**********************************************************************************************************************************************************************************
**********************************************************************************************************************************************************************************
OK , clink there ,you can get the code resource:源码资源