use*_*569 1 java networking nio netty
服务器代码:
public static void main(String[] args) {
try {
ServerBootstrap bootstrap = new ServerBootstrap(new NioServerSocketChannelFactory(Executors.newCachedThreadPool(), Executors.newCachedThreadPool()));
bootstrap.setPipelineFactory(new PipelineFactory());
bootstrap.bind(new InetSocketAddress("localhost", port));
System.out.println("Listening on " + port);
} catch(Exception exception) {
exception.printStackTrace();
}
}
Run Code Online (Sandbox Code Playgroud)
管道:
import org.jboss.netty.channel.ChannelPipeline;
import org.jboss.netty.channel.ChannelPipelineFactory;
import org.jboss.netty.channel.DefaultChannelPipeline;
import org.jboss.netty.handler.codec.serialization.ClassResolvers;
import org.jboss.netty.handler.codec.serialization.ObjectDecoder;
public class PipelineFactory implements ChannelPipelineFactory {
@Override
public ChannelPipeline getPipeline() throws Exception {
ChannelPipeline pipeline = new DefaultChannelPipeline();
try {
pipeline.addLast("decoder", new ObjectDecoder(ClassResolvers.cacheDisabled(getClass().getClassLoader())));
pipeline.addLast("messagehandler", new MessageHandler());
} catch(Exception exception) {
exception.printStackTrace();
}
return pipeline;
}
}
Run Code Online (Sandbox Code Playgroud)
我在MessageHandler类中覆盖了messageReceiveed方法:
@Override
public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) {
try {
if (!e.getChannel().isConnected()) {
System.out.println("Not connected to server...");
return;
}
Message message = (Message) e.getMessage();
queueMessage(message);
super.messageReceived(ctx, e);
} catch(Exception exception) {
exception.printStackTrace();
}
}
Run Code Online (Sandbox Code Playgroud)
我正在尝试发送的对象(消息):
public class Message {
private String text;
private byte rights;
public Message(String text, int rights) {
this.text = text;
this.rights = (byte) rights;
}
public String getText() {
return this.text;
}
public byte getRights() {
return this.rights;
}
}
Run Code Online (Sandbox Code Playgroud)
最后我的客户代码:
public static void main(String[] args) {
try {
ClientBootstrap bootstrap = new ClientBootstrap(new NioClientSocketChannelFactory(Executors.newCachedThreadPool(), Executors.newCachedThreadPool()));
bootstrap.setPipelineFactory(new ChannelPipelineFactory() {
public ChannelPipeline getPipeline() throws Exception {
return Channels.pipeline(new ObjectEncoder(), new ObjectDecoder(ClassResolvers.cacheDisabled(getClass().getClassLoader())));
}
});
ChannelFuture cf = bootstrap.connect(new InetSocketAddress("localhost", 5656));
cf.awaitUninterruptibly();
Channel channel = cf.getChannel();
channel.write(new Message("Hello", 0));
if (channel.isConnected() && cf.isDone()) {
System.out.println("Message sent!");
} else {
System.out.println("Message has not been sent, killing client.");
}
} catch(Exception exception) {
exception.printStackTrace();
}
}
Run Code Online (Sandbox Code Playgroud)
如果我将消息对象更改为日期,那么我写一个日期对象,它工作正常.实际上没有调用messageReceived方法,因为我尝试在messageReceived方法的开头只打印一个随机语句,但它没有打印.我是netty和网络的新手,所以我现在很无能为力,我已经尝试了几件事情,这对我目前的情况没有任何影响.我不确定为什么,但它只是不想写消息对象,也许它是它的编码部分?即便如此,一个日期将发送完美,所以我很难过,任何帮助表示赞赏,谢谢.
| 归档时间: |
|
| 查看次数: |
1229 次 |
| 最近记录: |