netty 发送websocket数据失败

在handler 类里面

Java code?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

    /**

     * 有数据时触发

     */

    @Override

    protected void channelRead0(ChannelHandlerContext ctx, TextWebSocketFrame msg) throws Exception {

 

    }

 

    /**

     * 建立连接后第一个执行

     */

    @Override

    public void handlerAdded(ChannelHandlerContext ctx) throws Exception {

        ctx.channel().writeAndFlush(new TextWebSocketFrame("hello world"));

    }



前端接收不到数据 ,在函数channelRead0里面发送就可以收到 这是怎么回事呢

全网传媒

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Netty是一个基于NIO的网络框架,可以轻松实现WebSocket协议,同时支持发送文本和二进制数据。 以下是一个简单的Netty实现WebSocket发送文本和二进制数据的示例代码: ```java public class WebSocketServerHandler extends SimpleChannelInboundHandler<Object> { private WebSocketServerHandshaker handshaker; @Override public void channelRead0(ChannelHandlerContext ctx, Object msg) throws Exception { if (msg instanceof FullHttpRequest) { // 处理HTTP请求,WebSocket握手请求 handleHttpRequest(ctx, (FullHttpRequest) msg); } else if (msg instanceof WebSocketFrame) { // 处理WebSocket请求,包括文本和二进制数据 handleWebSocketFrame(ctx, (WebSocketFrame) msg); } } private void handleHttpRequest(ChannelHandlerContext ctx, FullHttpRequest req) throws Exception { // 如果HTTP解码失败,返回HTTP异常 if (!req.decoderResult().isSuccess() || !"websocket".equals(req.headers().get("Upgrade"))) { sendHttpResponse(ctx, req, new DefaultFullHttpResponse(HttpVersion.HTTP_1_1, HttpResponseStatus.BAD_REQUEST)); return; } // 握手请求 WebSocketServerHandshakerFactory wsFactory = new WebSocketServerHandshakerFactory("ws://localhost:8080/ws", null, false); handshaker = wsFactory.newHandshaker(req); if (handshaker == null) { WebSocketServerHandshakerFactory.sendUnsupportedVersionResponse(ctx.channel()); } else { handshaker.handshake(ctx.channel(), req); } } private void handleWebSocketFrame(ChannelHandlerContext ctx, WebSocketFrame frame) throws Exception { // 判断是否是关闭链路的指令 if (frame instanceof CloseWebSocketFrame) { handshaker.close(ctx.channel(), (CloseWebSocketFrame) frame.retain()); return; } // 判断是否是Ping消息 if (frame instanceof PingWebSocketFrame) { ctx.channel().write(new PongWebSocketFrame(frame.content().retain())); return; } // 判断是否是二进制消息 if (frame instanceof BinaryWebSocketFrame) { // 处理二进制消息 ByteBuf binaryData = frame.content(); // TODO: 处理二进制数据 return; } // 处理文本消息 if (frame instanceof TextWebSocketFrame) { String text = ((TextWebSocketFrame) frame).text(); // TODO: 处理文本数据 return; } } private static void sendHttpResponse(ChannelHandlerContext ctx, FullHttpRequest req, FullHttpResponse res) { // 返回HTTP响应 if (res.status().code() != 200) { ByteBuf buf = Unpooled.copiedBuffer(res.status().toString(), CharsetUtil.UTF_8); res.content().writeBytes(buf); buf.release(); HttpHeaderUtil.setContentLength(res, res.content().readableBytes()); } // 如果不是Keep-Alive,关闭连接 boolean keepAlive = HttpHeaderUtil.isKeepAlive(req); if (!keepAlive) { ctx.writeAndFlush(res).addListener(ChannelFutureListener.CLOSE); } else { res.headers().set(HttpHeaderNames.CONNECTION, HttpHeaderValues.KEEP_ALIVE); ctx.writeAndFlush(res); } } } ``` 在以上示例代码中,`handleHttpRequest()` 方法负责处理HTTP请求,进行WebSocket握手,并将 WebSocketServerHandshaker 对象保存起来。`handleWebSocketFrame()` 方法则负责处理WebSocket请求,包括文本和二进制数据。根据不同的 WebSocketFrame 类型,分别进行处理即可。在处理二进制数据时,可以通过 ByteBuf 对象来获取数据
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值