Netty服務(wù)端可以通過ChannelHandlerContext對象向客戶端發(fā)送數(shù)據(jù)。在處理客戶端連接時,服務(wù)端會創(chuàng)建一個ChannelHandlerContext對象,可以通過這個對象獲取到當(dāng)前連接的Channel,并向客戶端發(fā)送數(shù)據(jù)。
以下是一個簡單的示例代碼,演示了如何向客戶端發(fā)送數(shù)據(jù):
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) {
// 連接建立時發(fā)送數(shù)據(jù)
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) {
// 接收客戶端發(fā)送的數(shù)據(jù)
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);
// 回復(fù)客戶端
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) {
// 發(fā)生異常時關(guān)閉連接
cause.printStackTrace();
ctx.close();
}
}
在上面的代碼中,我們重寫了ChannelInboundHandlerAdapter的channelActive方法,在連接建立時向客戶端發(fā)送數(shù)據(jù)。在channelRead方法中接收客戶端發(fā)送的數(shù)據(jù),并回復(fù)客戶端。當(dāng)發(fā)生異常時,我們關(guān)閉連接。
需要注意的是,在Netty中,數(shù)據(jù)通常是以ByteBuf對象來表示的,需要將數(shù)據(jù)轉(zhuǎn)換成字節(jié)數(shù)組進行讀寫操作。在向客戶端發(fā)送數(shù)據(jù)時,需要使用ChannelHandlerContext的writeAndFlush方法。