package hxy.server.socket.engine; import hxy.server.socket.engine.factory.TcpsocketHandlerBuilder; import hxy.server.socket.util.SpringApplicationContextHolder; import io.netty.buffer.Unpooled; import io.netty.channel.ChannelHandler; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.ChannelOutboundHandlerAdapter; import io.netty.channel.ChannelPromise; import io.netty.handler.codec.http.websocketx.BinaryWebSocketFrame; import io.netty.handler.codec.http.websocketx.TextWebSocketFrame; @ChannelHandler.Sharable public class MsgOutboundHandler extends ChannelOutboundHandlerAdapter { public final static MsgOutboundHandler INSTANCE = new MsgOutboundHandler(); private static final String SOCKET_HANDLER_BUILDER_NAME = "socketHandlerBuilder"; public final boolean isTcp = SpringApplicationContextHolder.getBean(SOCKET_HANDLER_BUILDER_NAME) instanceof TcpsocketHandlerBuilder; @Override public void write(ChannelHandlerContext ctx, Object msg, ChannelPromise promise) throws Exception { if (isTcp) { tcpWrite(ctx, msg, promise); } else { wsWrite(ctx, msg, promise); } } private void tcpWrite(ChannelHandlerContext ctx, Object msg, ChannelPromise promise) { byte[] contentBytes; if(msg instanceof String){ msg = ((String) msg).getBytes(); } if (msg instanceof byte[]) { contentBytes = (byte[]) msg; ctx.write(Unpooled.wrappedBuffer(contentBytes), promise); } throw new UnsupportedOperationException("Unsupported transport type, please convert to string and byte"); } private void wsWrite(ChannelHandlerContext ctx, Object msg, ChannelPromise promise) { if(msg instanceof String){ ctx.write(new TextWebSocketFrame((String) msg), promise); return; } if (msg instanceof byte[]) { ctx.write(new BinaryWebSocketFrame(Unpooled.wrappedBuffer((byte[]) msg)), promise); return; } ctx.write(msg, promise); } }