Netty服务端可以通过ChannelHandlerContext对象向客户端发送数据。在处理客户端连接时,服务端会创建一个ChannelHandlerContext对象,可以通过这个对象获取到当前连接的Channel,并向客户端发送数据。
以下是一个简单的示例代码,演示了如何向客户端发送数据:
import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;
public class ServerHandler extends ChannelInboundHandlerAdapter {
@Override
public void channelActive(ChannelHandlerContext ctx) {
// 连接建立时发送数据
String message = "Hello, client!";
ByteBuf buf = Unpooled.buffer(message.length());
buf.writeBytes(message.getBytes());
ctx.writeAndFlush(buf);
}
@Override
public void channelRead(ChannelHandlerContext ctx, Object msg) {
// 接收客户端发送的数据
ByteBuf in = (ByteBuf) msg;
byte[] data = new byte[in.readableBytes()];
in.readBytes(data);
String message = new String(data);
System.out.println("Received message from client: " + message);
// 回复客户端
String response = "Message received!";
ByteBuf responseBuf = Unpooled.buffer(response.length());
responseBuf.writeBytes(response.getBytes());
ctx.writeAndFlush(responseBuf);
}
@Override
public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {
// 发生异常时关闭连接
cause.printStackTrace();
ctx.close();
}
}
在上面的代码中,我们重写了ChannelInboundHandlerAdapter的channelActive方法,在连接建立时向客户端发送数据。在channelRead方法中接收客户端发送的数据,并回复客户端。当发生异常时,我们关闭连接。
需要注意的是,在Netty中,数据通常是以ByteBuf对象来表示的,需要将数据转换成字节数组进行读写操作。在向客户端发送数据时,需要使用ChannelHandlerContext的writeAndFlush方法。