Netty 高级应用
1. 编解码器
概念:在网络应用中,需要实现某种编解码器。将原始字节数据与自定义消息数据进行相互转换。网络中都是以字节码的形式传输的。
对Netty而言,编解码器由两部分组成:编码器、解码器
编码器:将消息对象转为字节或其他序列形式在网络上传输
解码器:负责将字节或其他序列形式转为指定的消息对象
Netty的编解码器实现了ChannelHandlerAdapter,也是一种特殊的ChannelHandler,所以依赖与ChannelPipeline,可以将多个编解码器链接在一起,以实现复杂的转换逻辑。
解码器
ByteToMessageDecoder:用于将字节转为消息,需要检查缓冲区是否有足够的字节
ReplayingDecoder:继承ByteToMessageDecoder,不需要检查缓冲区是否有足够的字节,但是ReplayingDecoder速度略慢于ByteToMessageDecoder,同时不是所有的ByteBuf都支持。项目复杂性高则使用ReplayingDecoder,否则使用ByteToMessageDecode
MessageToMessageDecoder:用于从一种消息解码为另一种消息(如POJO到POJO)
解码器示例:
public class DemoDecoder extends MessageToMessageDecoder<ByteBuf> { @Override protected void decode(ChannelHandlerContext channelHandlerContext, ByteBuf byteBuf, List<Object> list) throws Exception { String msg = byteBuf.toString(CharsetUtil.UTF_8); list.add(msg); }}
通道里加入解码器:
protected void initChannel(SocketChannel socketChannel) throws Exception { socketChannel.pipeline().addLast(new DemoDecoder()); socketChannel.pipeline().addLast(new DemoNettyServerHandle()); }
编码器
MessageToByteEncoder:将消息转为字节
MessageToMessageEncoder:用于从一种消息编码为另外一种消息(例如POJO到POJO)
编码器示例:
public class DemoEncoder extends MessageToMessageEncoder<String> { @Override protected void encode(ChannelHandlerContext channelHandlerContext, String s, List<Object> list) throws Exception { list.add(Unpooled.copiedBuffer(s,CharsetUtil.UTF_8)); }}
编码解码器Codec
同时具备编码与解码功能
ByteToMessageCodec
MessageToMessageCodec
2. 基于Netty的HTTP服务器开发
效果如图:
代码如下:
public class NettyHttpServer { private int port; public NettyHttpServer(int port) { this.port = port; } public static void main(String[] args) { new NettyHttpServer(8090).run(); } public void run(){ EventLoopGroup bossGroup=null; EventLoopGroup workerGroup=null; try{ bossGroup=new NioEventLoopGroup(1); workerGroup=new NioEventLoopGroup(); ServerBootstrap serverBootstrap=new ServerBootstrap(); serverBootstrap.group(bossGroup,workerGroup) .channel(NioServerSocketChannel.class) .option(ChannelOption.SO_BACKLOG,128) .childOption(ChannelOption.SO_KEEPALIVE,Boolean.TRUE) .childHandler(new ChannelInitializer<SocketChannel>() { @Override protected void initChannel(SocketChannel socketChannel) throws Exception { //添加编解码器 socketChannel.pipeline().addLast(new HttpServerCodec()); socketChannel.pipeline().addLast(new NettyHttpServerHandler()); } }); ChannelFuture channelFuture = serverBootstrap.bind(port).sync(); channelFuture.channel().closeFuture().sync(); } catch (InterruptedException e) { e.printStackTrace(); } finally { bossGroup.shutdownGracefully(); workerGroup.shutdownGracefully(); } }}
public class NettyHttpServerHandler extends SimpleChannelInboundHandler<HttpObject> { @Override protected void channelRead0(ChannelHandlerContext channelHandlerContext, HttpObject httpObject) throws Exception { if(httpObject instanceof HttpRequest){ DefaultHttpRequest request=(DefaultHttpRequest)httpObject; if(request.uri().equals("/favicon.ico")){ //图标不响应 return; } System.out.println("接收到请求:"+request.uri()); ByteBuf byteBuf = Unpooled.copiedBuffer("你好,我是服务端", CharsetUtil.UTF_8); DefaultFullHttpResponse response=new DefaultFullHttpResponse(HttpVersion.HTTP_1_1,HttpResponseStatus.OK,byteBuf); //设置响应头 response.headers().set(HttpHeaderNames.CONTENT_TYPE,"text/html;charset=utf-8"); response.headers().set(HttpHeaderNames.CONTENT_LENGTH,byteBuf.readableBytes()); channelHandlerContext.writeAndFlush(response); } }}
3. 粘包和拆包
简介:粘包和拆包是TCP网络编程中不可避免的,无论客户端还是服务端,当我们读取或发送消息的时候都要考虑TCP底层的粘包/拆包机制。
粘包产生的原因:
应用程序写入的数据小于套接字缓冲区大小,网卡将应用多次写入的数据发送到网络上
接收方不及时读取套接字缓冲区数据
TCP默认使用Nagle算法,将小数据包合并
拆包产生的原因:
数据太大超过剩余缓冲区的大小
数据太大超过MSS最大报文长度
粘包和拆包的解决方案
消息长度固定,累计读取到定长的报文就认为是一个完整的信息
将换行符作为消息结束符
将特殊的分隔符作为消息的结束标志
通过在消息头中定义长度字段来标识消息总长度
Netty中粘包和拆包的解决方案
Netty提供了4种解码器来解决:
固定长度拆包器FixedLengthFrameDecoder
行拆包器LineBasedFrameDecoder,以换行符作为分隔符
分隔符拆包器DelimiterBasedFrameDecoder,通过自定义的分隔符进行拆分
基于数据包长度的拆包器LengthFieldBasedFrameDecoder,将应用层数据包的长度最为拆分一句。要求应用层协议中包含数据包的长度。
DelimiterBasedFrameDecoder示例:
ByteBuf byteBuf =Unpooled.copiedBuffer("$".getBytes(StandardCharsets.UTF_8));ch.pipeline().addLast(new DelimiterBasedFrameDecoder(2048, byteBuf));
LengthFieldBasedFrameDecoder构造器参数讲解:public LengthFieldBasedFrameDecoder(ByteOrder byteOrder,int lengthFieldOffset,int lengthFieldLength,int lengthAdjustment,int initialBytesToStrip,boolean failFast)
byteOrder是指明Length字段是大端序还是小端序,因为Netty要读取Length字段的值,所以大端小端要设置好,默认Netty是大端序ByteOrder.BIG_ENDIAN。
maxFrameLength是指最大包长度,如果Netty最终生成的数据包超过这个长度,Netty就会报错。
lengthFieldOffset是指明Length的偏移位
lengthFieldLength是Length字段长度
lengthAdjustment 这个参数很多时候设为负数,这是最让小伙伴们迷惑的。下面我用一整段话来解释这个参数
当Netty利用lengthFieldOffset(偏移位)和lengthFieldLength(Length字段长度)成功读出Length字段的值后,Netty认为这个值是指从Length字段之后,到包结束一共还有多少字节,如果这个值是13,那么Netty就会再等待13个Byte的数据到达后,拼接成一个完整的包。但是更多时候,Length字段的长度,是指整个包的长度,如果是这种情况,当Netty读出Length字段的时候,它已经读取了包的4个Byte的数据,所以,后续未到达的数据只有9个Byte,即13 - 4 = 9,这个时候,就要用lengthAdjustment来告诉Netty,后续的数据并没有13个Byte,要减掉4个Byte,所以lengthAdjustment要设为 -4!!!
initialBytesToStrip,跳过的个数。比如这里initialBytesToStrip设置为4,那么Netty就会跳过前4位解析后面的内容
failFast 参数一般设置为true,当这个参数为true时,netty一旦读到Length字段,并判断Length超过maxFrameLength,就立即抛出异常。
示例:
@Override public void channelActive(ChannelHandlerContext channelHandlerContext) throws Exception { for (int i=0;i<100;i++){ byte[] bytes = "你好,我是客户端".getBytes(CharsetUtil.UTF_8); ByteBuf byteBuf = Unpooled.buffer(); byteBuf.writeInt(bytes.length); byteBuf.writeBytes(bytes); channelHandlerContext.writeAndFlush(byteBuf); } }
第2个参数和第三个参数表示:0-4个字节是内容长度字段,第五个参数的4代表跳过前4个字节。
socketChannel.pipeline().addLast(new LengthFieldBasedFrameDecoder(60535,0,4,0,4));
最后输出的内容:
4. 基于Netty和WebSocket的聊天室案例
1. WebSocket简介
WebSocket是一种在单个TCP连接上进行全双工通信的协议。相比HTTP协议,WebSocket具备如下特点:
支持双向通信,实时性更强
更好的二进制支持
较少的开销:协议控制的数据包头部较小
应用场景:
社交订阅
协同编辑
股票基金报价
体育实况更新
多媒体聊天
在线教育
2. 服务端开发
引入依赖
基于SpringBoot环境
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!--添加thymeleaf依赖 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency> <dependency> <groupId>io.netty</groupId> <artifactId>netty-all</artifactId> <version>4.1.72.Final</version> </dependency>
核心后端代码
@Componentpublic class NettyWebSocketServer implements Runnable { @Autowired private NettyConfig nettyConfig; @Autowired private WebSocketChannelInit webSocketChannelInit; private EventLoopGroup bossGroup = new NioEventLoopGroup(1); private EventLoopGroup wokerGroup = new NioEventLoopGroup(); @PreDestroy public void close(){ bossGroup.shutdownGracefully(); wokerGroup.shutdownGracefully(); } @Override public void run() { try{ ServerBootstrap serverBootstrap=new ServerBootstrap(); serverBootstrap.group(bossGroup,wokerGroup) .channel(NioServerSocketChannel.class) .childHandler(webSocketChannelInit); ChannelFuture channelFuture = serverBootstrap.bind(nettyConfig.getPort()).sync(); System.out.println("Netty服务端启动成功"); channelFuture.channel().closeFuture().sync(); }catch (Exception e){ e.printStackTrace(); }finally { bossGroup.shutdownGracefully(); wokerGroup.shutdownGracefully(); } }}
@Componentpublic class WebSocketChannelInit extends ChannelInitializer { @Autowired private NettyConfig nettyConfig; @Autowired private WebSocketHandler webSocketHandler; @Override protected void initChannel(Channel channel) throws Exception { ChannelPipeline pipeline = channel.pipeline(); //对http协议的支持 pipeline.addLast(new HttpServerCodec()); //对大数据流的支持 pipeline.addLast(new ChunkedWriteHandler()); //post请求分为3部分。request line、request header、body //HttpObjectAggregator将多个信息转化为单一的request或者response对象 pipeline.addLast(new HttpObjectAggregator(8000)); //将http协议升级为ws协议,websocket的支持 pipeline.addLast(new WebSocketServerProtocolHandler(nettyConfig.getPath())); pipeline.addLast(webSocketHandler); }}
@Component@ChannelHandler.Sharable //设置通道共享public class WebSocketHandler extends SimpleChannelInboundHandler<TextWebSocketFrame> { private List<Channel> channels=new ArrayList<>(); @Override public void channelActive(ChannelHandlerContext ctx) throws Exception { channels.add(ctx.channel()); System.out.println("有新的连接了..."); } @Override public void channelInactive(ChannelHandlerContext ctx) throws Exception { channels.remove(ctx.channel()); System.out.println("连接下线了"); } @Override protected void channelRead0(ChannelHandlerContext channelHandlerContext, TextWebSocketFrame textWebSocketFrame) throws Exception { String text = textWebSocketFrame.text(); Channel currentChannel = channelHandlerContext.channel(); for (Channel channel:channels){ //自己不给自己发消息 if(!channel.equals(currentChannel)){ channel.writeAndFlush(new TextWebSocketFrame(text)); } } } @Override public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { cause.printStackTrace(); Channel channel = ctx.channel(); channels.remove(channel); }}
3. 前端js代码
$(function () { //这里需要注意的是,prompt有两个参数,前面是提示的话,后面是当对话框出来后,在对话框里的默认值 var username = ""; while (true) { //弹出一个输入框,输入一段文字,可以提交 username = prompt("请输入您的名字", ""); //将输入的内容赋给变量 name , if (username.trim() === "")//如果返回的有内容 { alert("名称不能输入空") } else { $("#username").text(username); break; } } var ws = new WebSocket("ws://localhost:8081/chatService"); ws.onopen = function () { console.log("连接成功.") }; ws.onmessage = function (evt) { showMessage(evt.data); }; ws.onclose = function (){ console.log("连接关闭") }; ws.onerror = function (){ console.log("连接异常") }; function showMessage(message) { // 张三:你好 var str = message.split(":"); $("#msg_list").append("<li class="active"}>\n" + " <div class="main">\n" + " <img class="avatar" width="30" height="30" src="/img/user.png">\n" + " <div>\n" + " <div class="user_name">"+str[0]+"</div>\n" + " <div class="text">"+str[1]+"</div>\n" + " </div> \n" + " </div>\n" + " </li>"); // 置底 setBottom(); } $("#my_test").bind({ focus: function (event) { event.stopPropagation(); $("#my_test").val(""); $(".arrow_box").hide() }, keydown: function (event) { event.stopPropagation(); if (event.keyCode === 13) { if ($("#my_test").val().trim() === "") { this.blur(); $(".arrow_box").show(); setTimeout(this.focus(),1000); } else { $(".arrow_box").hide(); //发送消息 sendMsg(); this.blur(); setTimeout(this.focus()) } } } }); $("#send").on("click", function (event) { event.stopPropagation(); if ($("#my_test").val().trim() === "") { $(".arrow_box").show() } else { sendMsg(); } }); function sendMsg() { var message = $("#my_test").val(); $("#msg_list").append("<li class="active"}>\n" + " <div class="main self">\n" + " <div class="text">"+message+"</div>\n" + " </div>\n" + " </li>"); $("#my_test").val(""); //发送消息 message = username + ":" + message; ws.send(message); // 置底 setBottom(); } // 置底 function setBottom() { // 发送消息后滚动到底部 var container = $(".m-message"); var scroll = $("#msg_list"); container.animate({ scrollTop: scroll[0].scrollHeight - container[0].clientHeight + container.scrollTop() + 100 }); }});
作者:女友在高考
来源:https://www.cnblogs.com/javammc/p/15907602.html
标签: Netty
凡注有"三板富 | 专注于新三板的第一垂直服务平台"或电头为"三板富 | 专注于新三板的第一垂直服务平台"的稿件,均为三板富 | 专注于新三板的第一垂直服务平台独家版权所有,未经许可不得转载或镜像;授权转载必须注明来源为"三板富 | 专注于新三板的第一垂直服务平台",并保留"三板富 | 专注于新三板的第一垂直服务平台"的电头。
- 脂肪粒如何消除视频(脂肪粒如何消除)
- 百达智能拟将持有宁波百秦14%的140万股权转让给宁波源盛 交易价格不超过140万
- 信邦智能:已与广汽丰田、东风日产、比亚迪等客户在新能源行业开展合作-环球关注
- 上海凯宝:公司子公司顺捷医药拥有《医疗器械经营许可证》资质证书 可开拓医疗器械相关领域的业务-焦点观察
- 翰宇药业醋酸加尼瑞克原料药在美获批
- 东方雨虹(002271)龙虎榜数据(11-11)-全球视点
- 博世科:与华友钴业方面签署新能源电池材料回收利用合作协议-世界热文
- 丢掉苹果订单后 歌尔还将失去面包房-每日视讯
- 菲鹏生物携手华润医疗器械 共同打造IVD开放平台生态
- 格林斯达控股股东戴恩平配偶沈娇拟以9.5万的价格向安徽格林斯达环保设备有限公司转让别克牌汽车-关注
- 罗 牛 山:截止2022年9月末 公司生猪存栏数 45.75万头 其中种猪4.20万头-全球要闻
- 美股盘前要点 | 美股盘前走高 美元指数进一步走低 美国金融条件指数单日跌超50基点-当前简讯
- 工信部等部门:支持培育一批智能光伏示范企业-全球百事通
- “第二支箭”支持民营房企发债:美的置业、碧桂园等房企正沟通对接发债注册意向-今日快讯
- 方天股份拟增加与江苏纳邦数字技术有限公司的关联交易额 交易总金额不超过1300万-天天看点
- 湖北能源:拟54亿元投建江陵电厂二期扩建项目及新能源配套项目-当前要闻
- 电子税务局怎样导出财务报表(厦门市电子税务局财务报表在哪里导出)
- 说说心里话!-天天即时看
- 中青宝:拟购买广州宝云100%股权 14日起复牌-环球动态
- 润贝航科与南方航空签署合作项目,前三季度研发投入同比增30%
- 华联医疗拟向银行申请4500万承兑汇票 全资控股子公司提供连带责任担保-全球热推荐
- 雅化集团:拟向DMCC公司采购锂辉石矿产品-每日速看
- 当代置业(01107.HK):重组生效日期预期为11月18日或之前-每日观点
- 速腾聚创公布新一轮战略融资 多个产业投资方齐聚
- 英记茶庄集团(08241)发布中期业绩 净亏损366.1万港元 同比减少23.54%-天天微头条
- 顺鑫农业:拟对5款牛栏山陈酿产品提价-天天快资讯
- 云天化新能源材料项目加速落地 2023年起磷酸铁锂产能将逐步释放-天天信息
- 百达智能拟购买袁迪欢所持有的金百达10%的100万股权 交易完成后公司持有金百达60%股权-世界观天下
- 中科云网(002306.SZ):正与江苏省包括徐州市在内的多地市政府部门洽谈项目执行相关事宜-天天头条
- 京唐城际铁路开始试运行 北京通州至河北唐山最快39分钟
- 花架子什么意思简解(花架子什么意思)
- 北交所将于11月12日开展新增北交所证券类别通关测试-世界焦点
- 大禹节水:联合体收到37亿元江西省梅江灌区项目成交通知书-时快讯
- 南都电源:子公司拟6000万元向关联方购买锂离子电池绿色高效循环利用项目机器设备及无形资产-世界通讯
- 中国奥园10月销售额约9亿元 尚未披露去年年报及今年中报
- 北交所推出融资融券制度
- 十厘米参照物示意图(十厘米)
- 住房公积金上调意味着什么?有哪些好处?-热推荐
- 移为通信(300590.SZ):11.1825万股限制性股票将归属、上市流通-天天精选
- 百胜中国恢复开店步伐 近8个交易日股价涨幅超过20%
- 砍单风波中的歌尔股份-每日视讯
- 公告精选:顺鑫农业拟对5款牛栏山陈酿进行提价;三七互娱拟3亿元-6亿元回购股份-天天热点评
- 中指快评:杭州取消“认房又认贷”,二套首付最低四成-实时
- 中指快评:《天津津城城市更新规划指引(2021—2035年)》公开征求意见-当前热点
- 探寻数字化浪潮下的数字化转型之路-世界快播报
- 中大力德(002896)龙虎榜数据(11-11)-每日时讯
- “10连板”上涨1.6倍!供销社概念股天鹅股份将停牌核查
- 南都电源(300068.SZ):拟开展融资租赁业务、融资合计不超8.7亿元
- 港股创新药ETF(513120)涨4.86%,康希诺生物涨超14%-天天观热点
- 粤海饲料:公司与国内从事水产养殖、水产饲料经销业务的供销社及农民养殖专业合作社有业务合作-当前简讯
- 首届全球数字贸易博览会将在浙江杭州开幕
- 南都电源:子公司拟购买锂离子电池绿色高效循环利用项目资产-每日快播
- 瑞风新能源(00527.HK):已成立合营公司红松新能源(东营)有限公司-世界热头条
- 办理房产证所需要的材料有哪些?房产证土地使用权证办理程序-天天热头条
- 上峰水泥:出资5000万元与傲林科技、南方水泥合资设立建材数智研究院-环球视讯
- 今年双11中小主播日子难过:商家难被割韭菜,免坑位费免佣金抢资源,明星光环也不好使
- 银涛控股(01943.HK)料中期录得亏损净额约1000万-1500万港元-天天观速讯
- 中国金融投资管理(00605.HK)向上市覆核委员会提出覆核有关撤销上市的决定请求-全球报资讯
- 北京特种机械研究所携三大体系亮相中国航展
- 走进深圳坪山生物医药研究院 感受产业创新活力
- 1060显卡吃鸡设置最佳性能(1060显卡吃鸡设置最佳)
- 微信收不到消息(微信收不到消息)
- 河南电气每10股派现0.41元 共计派发现金红利206万
- 孚能科技完成超33亿元定增 为何被三家广州国资企业包揽?-每日消息
- 中达安:公司控制权拟发生变更
- 德联集团(002666.SZ):部分董监高拟合计减持不超84.58万股-天天热议
- 申朴信息每10股派现6.8元 共计派发现金红利2053.26万-焦点观察
- 永成股份权益分派实施 每10股转增2.1股 共计转增210万股-世界聚看点
- 圣邦股份(300661.SZ):荣基香港拟减持不超47.04万股-世界头条
- 鑫宇科技每10股派现3.3元 共计派发现金红利3033.25万-环球热推荐
- PF GROUP(08221)附属太平基业证券授出4600万港元融资贷款-视点
- 注意!怡亚通将于11月28日召开股东大会-最新快讯
- 一顿操作猛如虎 最后便宜两毛八 波司登这种价格套路怎么破?
- 宏景科技(301396)龙虎榜数据(11-11)-当前资讯
- 东方国信:公司有Web3.0底层技术栈储备 包括区块链、云计算、人工智能、数字孪生/元宇宙-观焦点
- 中南文化(002445.SZ):华润信托自6月6日起已累计减持5%股份-天天热资讯
- 信安世纪:拟收购普世科技80%股权 14日起停牌
- 榕基软件跌停 龙虎榜上机构买入5076.33万元 卖出35.88万元-世界讯息
- 隔夜美股史诗级暴涨,港股互联网ETF(513770)大涨超7%!
- 实益达(002137)龙虎榜数据(10-27)-全球消息
- 比优集团(08053)发布中期业绩 股东应占溢利9643.1万元 同比增加12.74%-全球头条
- 大宗交易:联创光电成交892.15万元,折价9.03%(11-11)
- 湖北能源:拟约54亿元投建江陵电厂二期扩建项目及新能源配套项目
- 联君科技每10股派现6.8元 共计派发现金红利1700万-每日焦点
- 什么是阳光工程(什么是阳包阴)
- 酷我音乐vip账号2021(酷我音乐vip账号密码)
- 麦捷科技:比亚迪是公司重点拓展的客户之一
- 百事达注销控股孙公司深圳百思童科技有限公司-焦点报道
- 丰岛食品及子公司以抵押、保证方式向银行合计申请1.34亿授信额度-环球观天下
- 国美1亿持股被冻结,创始人黄光裕夫妇密集套现-今日快讯
- 安道设计拟利用闲置募集资金不超过2000万(含2000万)购买银行理财产品-观点
- 星湖科技:公司目前尚未开通微博
- 恒大深圳湾地块75亿元挂牌转让:处于抵押状态,已停工超1年-环球热闻
- YGM TRADING(00375.HK)盈警:预计中期税后综合亏损2500万港元
- 青海华鼎(600243)龙虎榜数据(11-11)-世界微头条
- 博大新材全资子公司惠州天选拟购买土地使用权 预计总价不超过2300万-环球热推荐
- 小商品城:拟减免小微企业或个体工商户租金
- 川发龙蟒(002312.SZ):就收购重钢矿业49%的股权已完成过户-天天看热讯
- 普门科技(688389.SH):瀚钰生物、瑞普医疗、瑞源成健康拟减持合计不超6%股份-观察
- 聚焦粤港澳大湾区生物医药发展,2022粤港澳大湾区生物医药企业十强揭晓-天天即时看
公司
焦点
精彩推送
- 大港股份(002077)龙虎榜数据(11-11)-环球讯息
- 潮州社保缴费标准基数及比例2022一览表(潮州2022年个人社保缴费标准表)-每日视讯
- 那些加盟连锁咖啡店的人,现在怎么样了?-今日观点
- 大宗交易:长春高新成交207.99万元,折价9.37%(11-11)
- 雅化集团:全资子公司签署锂辉石矿产品承购协议-天天新资讯
- ST大集(000564)龙虎榜数据(11-11)-全球热门
- 青岛胶州“一网统管” 有效破解“停车难”
- 龙津药业(002750)龙虎榜数据(11-11)-全球最资讯
- 天鸿新材拟向浦东发展银行阜阳分行申请专精特新“小巨人”信用贷款 贷款金额总计1000万-全球速讯
- 云浮社保缴费标准基数及比例2022年一览表(2022年个人社保缴费标准表)
- 复盘66只涨停股:天鹅股份10板 众生药业天地板 天下秀炸板回封-天天热文
- 贵阳贵安2023医保怎么缴费?居民医保缴费方式-聚焦
- 金银河(300619.SZ)股东梁可累计减持比例达1.35% 减持数量过半-今日报
- 华峰测控(688200.SH)部分股东及董监高拟合计减持不超1.79万股-环球滚动
- 许家印再卖资产:恒大总部大楼退租一年后,75.43亿转让深圳湾总部地块-环球即时看
- 农民失地保险金如何领取?失地保险金有多少?-环球时讯
- 农民失地保险金怎么领取?有多少钱?
- 多型功勋航天惯导首次亮相中国航展
- 信用卡存款能取出来吗(信用卡存款)
- ST易购:公司苏宁易购广场(百货业态)有美妆、美容相关业态-天天热资讯
- 黑马•产业丨解构聚玻网:数智化重塑玻璃产业链,创立7年营收过百亿-焦点精选
- 天目湖振幅16.43% 机构龙虎榜净卖出4937.51万元
- 光荣之家门牌发放规定河北(光荣之家门牌发放的意义)
- 大港股份今日涨8.21%,上榜营业部席位近3日合计成交12.72亿元-新要闻
- 宁波韵升:参股公司中韵矿业拟收购非洲稀土矿权
- 国网信通:子公司中标3.87亿元国家电网采购项目
- 港股强劲拉升,恒生科技30ETF(513010)大涨5.8%-每日快报
- 深交所:本周对近期涨幅异常的“竞业达”“天地在线”进行重点监控
- 互太纺织(01382)发盈警,预计中期股东应占溢利可能同比下降约28.6%-短讯
- 天鹅股份:公司股价近期波动较大 停牌核查-天天资讯
- 宁波韵升:参股公司以500万美元收购中矿香港稀土100%股份
- 华纳药厂(688799.SH):监事金焰拟减持不超75.9万股
- 好消息!好消息!黄生就市论势本周分享多股止盈,实力杠杠的!-世界资讯
- 科美诊断股东拟合计减持不超9%股份-环球观点
- 龙虎榜丨荣联科技今日涨停 知名游资孙哥净买入4357.57万元-当前快报
- 华密新材“双11”北交所顺利过会:国家级专精特新“小巨人”企业 去年实现净利润4420万元
- 三七互娱拟斥资3亿元至6亿元回购股份 彰显长期信心
- 犀牛午讯:恒大挂牌转让原深圳总部地块 瑞斯康达回应被立案-天天热门
- 天鹅股份:股价异动 停牌核查-当前视点
- 天鹅股份:公司股价近期波动较大 停牌核查-天天速讯
- 华光环能:拟收购汕头益鑫股权并投建澄海益鑫天然气分布式能源项目
- 宁波韵升:参股公司中韵矿业拟收购非洲稀土矿权
- 顺鑫农业:公司部分产品提价
- 时隔5年杭州回归“认房不认贷” 二套首付降至四成-全球今热点
- 11月11日沪深两市主力资金净流入451.23亿元,加仓房地产、医药生物、非银金融-全球速看
- 宏润建设:公司与安徽省新能创业投资有限责任公司投资设立的上海皖宏新能源有限公司已完成工商登记手续
- 若羽臣(003010.SZ):朗姿股份减持比例达1.7887%-世界今日报
- 许家印再卖资产:恒大总部大楼退租一年后,75.43亿转让深圳湾总部地块-热点在线
- 普甜食品(01699):2021年年度业绩将于11月22日刊发 继续停牌
- 信安世纪(688201.SH)筹划增发及现金收购普世科技80%股权事宜 11月14日起停牌
- 外交部:中方出台进一步优化疫情防控工作二十条措施绝不是躺平
- 若羽臣:公司目前未和阿富汗、非洲等地有业务往来
- 微信否认“微信支持撤回5分钟内消息”
- 外交部:美方应该立即停止对中国光伏企业的无理打压-环球热消息
- 南大光电:公司电子特气产品可以应用于chiplet技术工艺-每日讯息
- 良莠不齐怎么读(良莠)
- 协鑫集成:目前芜湖电池项目已经取得项目备案证 确定了项目土地,能评、环评等正在办理中-全球微资讯
- 富士康拟大举扩建印度工厂 未来两年计划新招5.3万名员工
- 中欣氟材:公司主要对京新药业、国邦药业、浙江医药、天宇药业等公司提供医药中间体-环球讯息
- 安记食品(603696.SH):实控人林肖芳以大宗交易减持1.99%的股份-今热点
- 大森控股(01580.HK):财政年度年结日由12月31日变更为3月31日
- 广电运通:公司在Web3.0涉及的区块链、数字货币、NFT等方面拥有技术储备-今亮点
- 北美木制品规模预计在2026年达到24389亿美元-每日精选
- 苏宁家电加盟(苏宁家电)
- 家居卖场“转战”直播做“副业”-当前热门
- 机构:煤电基准价上调,电源均有望获益!电力ETF基金飘红
- 前三季度6家上市定制家居企业净利下滑 大宗业务加持不再?-环球微速讯
- STYLAND HOLD(00211.HK)拟11月25日举行董事会会议 审批中期业绩
- 债转股是否需要验资 债转股对股民是好是坏?
- 天阳科技:北京时间及其一致行动人珠海时间拟清仓减持合计6.94%公司股份
- 医疗保险和商业保险的区别是什么?哪个更好?
- 惠云钛业:上调各型号钛白粉销售价格-天天快讯
- 医保电子凭证亲情账户怎么使用?激活家庭成员流程一览-天天热头条
- 光线传媒控股股东拟减持降低负债,Q3亏损9876万元-环球热点
- 三七互娱:拟斥资3亿元至6亿元回购股份
- 老三板股票在哪里看行情分析 老三板交易费用怎么算?
- 芬兰木材进出口出现大幅缩减-全球动态
- 东方园林:股东何巧女所持4774万股公司股份将被司法拍卖-全球快看
- 75.4亿!原恒大深圳总部地块挂牌,成交款将用于还债-最资讯
- 机构:医药行业有望反转,美诺转债涨超15%!可转债ETF涨近1%-微速讯
- 这届“双11”:主播通宵卖货,但“狂欢”不再-全球信息
- 深圳市抽查家具、人造板等产品34批次不合格
- 合肥社保缴费基数2022是多少?2022年合肥社保一个月要交多少钱?-全球关注
- 场内基金是指什么 场内基金在哪个平台买比较好一点?
- 安井食品(603345.SH):董事长刘鸣鸣、总经理张清苗拟合计减持不超1.6707%股份-环球简讯
- 国网信通(600131.SH)四家子公司共计中标3.87亿元国家电网招标采购项目-实时
- 上海社会保险缴费基数2022下限6520元-环球要闻
- 农民失地保险金有多少?需要哪些资料?-速递
- 热继电器型号(热继电器符号)
- 公积金联名卡有什么用处 没有联名卡怎么提取公积金余额?
- 个人独资企业注册资金最低多少 注册一个空壳公司一年交多少费用合适?
- 优先股是指什么意思 优先股的优缺点是什么?
- 知名英语培训机构全国多个分校突然关门!学员索要学费 老师:我们也是受害者
- 办信用卡哪个银行好批额度高 有什么容易通过的信用卡?
- 收评:三大指数全天放量大涨 两市成交额突破1.2万亿-速读
- 太湖新城污水厂凸显互联互通优势 污水管“长途奔袭”15公里
- Web3.0概念热度不减 天地在线11日斩获9板 公司否认迎合热点概念炒作-世界快消息
- 北向资金净买入146.67亿元,中止连续4日净卖出-今日报
- NTT DATA业务解决方案荣获2022年SAP创新奖
- 新威凌11月11日14时北交所IPO路演: 国内锌粉生产领域龙头企业 打破国外垄断实现进口替代-当前要闻