@Override protected void initChannel(SocketChannel ch) throws Exception { //对workerGroup的SocketChannel设置处理器 ChannelPipeline pipeline = ch.pipeline(); pipeline.addLast("logging", new LoggingHandler(LogLevel.INFO)); //pipeline.addLast(new DelimiterBasedFrameDecoder(1024, Unpooled.copiedBuffer("_".getBytes()))); pipeline.addLast(new HttpServerCodec()); pipeline.addLast(new HttpObjectAggregator(1024 * 10)); // pipeline.addLast(new WebSocketServerProtocolHandler("/")); //自定义编解码器 pipeline.addLast("EncodeHandler",new EncodeHandler()); pipeline.addLast("DecodeHandler", new DecodeHandler()); //处理客户端发送的消息 pipeline.addLast(chatChannelHandler); //检测心跳,如果用户一段时间没有发送消息则断开连接 pipeline.addLast(new ReadTimeoutHandler(30, TimeUnit.MINUTES)); }
public class EncodeHandler extends MessageToByteEncoder<GameMessagePackage> { private static final int GAME_MESSAGE_HEADER_LEN = 29; @Setter private String aesSecret;// 对称加密密钥 @Override protected void encode(ChannelHandlerContext ctx, GameMessagePackage msg, ByteBuf out) throws Exception { System.out.println("进入自定义编码器"); int messageSize = GAME_MESSAGE_HEADER_LEN; final byte[] body = msg.getBody(); byte compress = 0; if (body != null) { // 达到压缩条件,进行压缩 // if (body.length >= serverConfig.getCompressMessageSize()) { // body = CompressUtil.compress(body); // compress = 1; // } // if (this.aesSecret != null && msg.getHeader().getMessageId() != 1) { // body = AESUtils.encode(aesSecret, body); // } messageSize += body.length; } final GameMessageHeader header = msg.getHeader(); out.writeInt(messageSize); out.writeInt(header.getClientSeqId()); out.writeInt(header.getMessageId()); out.writeInt(header.getServiceId()); out.writeLong(header.getServerSendTime()); out.writeInt(header.getVersion()); out.writeByte(compress); out.writeInt(header.getErrorCode()); if (body != null) { out.writeBytes(body); } } }
export function createWebSocket(param,$this){ // getData("/chat/allocation",{ userId: param.id }, "post").then((res) => { // let socket = new WebSocket(res); // return socket; // }) console.log('建立websocket连接:') let socket = new WebSocket("ws://localhost:9003/websocket/312"); socket.onopen = function (event) { $this.$notify({ title: '成功', message: '服务器连接成功', type: 'success' }); }; socket.onclose = function (event) { $this.$notify({ title: '警告', message: '服务器已断开连接', type: 'warning' }); }; socket.onmessage = function (event) { console.log(event); // $this.$notify({ // title: '收到消息', // message: JSON.parse(event.data), // type: 'info' // }); } return socket; }
来源:即时通讯网 - 即时通讯开发者社区!
轻量级开源移动端即时通讯框架。
快速入门 / 性能 / 指南 / 提问
轻量级Web端即时通讯框架。
详细介绍 / 精编源码 / 手册教程
移动端实时音视频框架。
详细介绍 / 性能测试 / 安装体验
基于MobileIMSDK的移动IM系统。
详细介绍 / 产品截图 / 安装体验
一套产品级Web端IM系统。
详细介绍 / 产品截图 / 演示视频
引用此评论
引用:JackJiang 发表于 2022-03-09 21:21 别炫技了,退一步,先把JSON数据格式跑通了再玩别的
引用:GuangYuanLee 发表于 2022-03-09 21:34 JSON没问题呀,消息用TextWebSocketFrame 走HttpServerCodec就通了。这不是想玩一下嘛感觉挺有意思的
引用:JackJiang 发表于 2022-03-11 11:37 你这就是没事折腾。我没这么玩过,所以没办法给到你具体的意见了
精华主题数超过100个。
连续任职达2年以上的合格正式版主
为论区做出突出贡献的开发者、版主等。
Copyright © 2014-2024 即时通讯网 - 即时通讯开发者社区 / 版本 V4.4
苏州网际时代信息科技有限公司 (苏ICP备16005070号-1)
Processed in 0.137687 second(s), 34 queries , Gzip On.