我正在尝试使用Netty构建一个简单的TCP客户端 - 服务器应用程序。 一开始,我通过SocketChannel以这种方式从客户端发送消息:
SocketChannel client = SocketChannel.open(hostAddress);
client.write(buffer);
所有消息都是由服务器接收的,但是当我想将响应写回客户端时,我看到为了得到客户端的响应,它需要通过bootstrap发送消息并定义Inboundhandler会读取回复(也许有人知道另一种方式吗?) 当我尝试通过bootstrap发送消息时,我使用以下代码:
EventLoopGroup group = new NioEventLoopGroup();
Bootstrap b = new Bootstrap();
b.group(group).channel(NioSocketChannel.class);
b.handler(new ChannelInitializer<SocketChannel>() {
@Override
protected void initChannel(SocketChannel ch) throws Exception {
// TODO Auto-generated method stub
ch.pipeline().addLast(new TestClientHandler());
}
});
ChannelFuture future = bootstrap.connect(hostAddress);
future.channel().writeAndFlush(buffer);
但是这样服务器根本没有收到消息! 这是我用于服务器的代码(当我不通过客户端的引导程序发送消息时工作正常):
bootstrap = new ServerBootstrap();
bootstrap.group(boosGroup, workerGroup);
bootstrap.channel(NioServerSocketChannel.class);
bootstrap.childHandler(new ChannelInitializer<SocketChannel>() {
@Override
protected void initChannel(SocketChannel ch) throws Exception {
ChannelPipeline pipeline = ch.pipeline();
pipeline.addLast(dnsMessageDecodingHandler);
pipeline.addLast(group,"DnsTcpHandler",dnsTcpHandler);
}
});
future = bootstrap.bind(hostAddress).await();
在Netty中编写简单客户端服务器的正确方法是什么?我没有找到任何可行的例子......
谢谢, Osnat。
答案 0 :(得分:0)
您应该了解TCP连接的工作原理
本文介绍了典型的TCP流程。 https://www.ibm.com/support/knowledgecenter/en/SSB23S_1.1.0.14/gtps7/s5tcpcf.html
查看文章后,您需要正确编写服务器代码
// create your server bootstrap
ServerBootstrap b = new ServerBootstrap();
// add your ChannelInitializer which handles when client has been connected to your server
// in ChannelInitializer you need to register your ChannelHandler, such as ChannelDuplexHandler to client channel pipeline
b.childHandler(YOUR_CHANNEL_INITIALIZER);
b.bind(bindAddress); // your server will now listen() for client connect()
运行bootstrap代码后,客户端可以连接到服务器
答案 1 :(得分:0)
netty存储库中有多个示例,我不确定为什么你说没有。
https://github.com/netty/netty/tree/4.1/example
那说我怀疑问题是你不是等待&#34;直到connect(...)
操作完成。如果您要检查writeAndFlush(...)
返回的ChannelFuture结果,它会告诉您这个。
SSo快速修复将是:
ChannelFuture future = bootstrap.connect(hostAddress).await();
future.channel().writeAndFlush(buffer);
答案 2 :(得分:0)
在我检查了从writeAndFlush返回的ChannelFuture的原因之后(就像Norman Maurer建议的那样),我看到原因是:不支持的消息类型:HeapByteBuffer(预期:ByteBuf,FileRegion) 这是因为我没有将ObjectEncoder添加到客户端管道! 这个补充解决了这个问题: b.handler(新的ChannelInitializer(){
@Override
protected void initChannel(SocketChannel ch) throws Exception {
// TODO Auto-generated method stub
ch.pipeline().addLast(new ObjectEncoder());
ch.pipeline().addLast(new TestClientHandler());
}
});
感谢所有帮助过我的人! Osnat。