java netty and html 实现点对点 即时通讯 点对群及时通讯 实例代码 和jvm设置
目录
点对点
点对点反向
群发
maven 引入依赖
java netty 主启动类 代码
java netty 初始化类 代码
java netty 通道类 代码
java netty 通讯上下文管理类
html 网页代码
实例代码和jar包
附上一个netty 启动jar jvm
jvm常见配置汇总介绍
点对点
点对点反向
群发
maven 引入依赖
io.netty netty-all 4.1.32.Final
java netty 主启动类 代码
package com.superman.testnetty;import io.netty.bootstrap.ServerBootstrap;import io.netty.channel.Channel;import io.netty.channel.EventLoopGroup;import io.netty.channel.nio.NioEventLoopGroup;import io.netty.channel.socket.nio.NioServerSocketChannel;/** * 程序的入口,负责启动应用 *Timely communication */public class TCNettyServer { private int port; public TCNettyServer(int port) { this.port = port; } public void run() { // 启用两个Reactor线程池【netty是基于NIO的,基于线程处理的】 // 用于接收Client端连接的 EventLoopGroup bossGroup = new NioEventLoopGroup(); // 进行网络通信读写 EventLoopGroup workGroup = new NioEventLoopGroup(); try { // 创建一个辅助类Bootstrap,就是对我们的Server进行一系列的配置 ServerBootstrap b = new ServerBootstrap(); b.group(bossGroup, workGroup); // 指定使用NioServerSocketChannel这种类型的通道 b.channel(NioServerSocketChannel.class); /* * 使用 childHandler 去初始化服务器 添加handler,用来监听已经连接的客户端的Channel的动作和状态。 * * 被绑定的MyWebSocketChannelHandler()里面设置了服务端初始化参数以及 */ b.childHandler(new TCWebSocketChannelHandler()); System.out.println("netty服务端开启等待客户端连接...."); Channel ch = b.bind(port).sync().channel(); ch.closeFuture().sync(); } catch (Exception e) { e.printStackTrace(); } finally { // 优雅的退出程序 bossGroup.shutdownGracefully(); workGroup.shutdownGracefully(); } } public static void main(String[] args) { new TCNettyServer(8888).run(); }}
springboot 类启动的时候调用 new TCNettyServer(8888).run();
java netty 初始化类 代码
package com.superman.testnetty;import io.netty.channel.Channel;import io.netty.channel.ChannelHandlerContext;import io.netty.channel.ChannelInitializer;import io.netty.channel.ChannelPipeline;import io.netty.channel.socket.SocketChannel;import io.netty.handler.codec.io.netty.handler.codec.io.netty.handler.stream.ChunkedWriteHandler;import io.netty.handler.timeout.IdleStateHandler;import java.util.concurrent.TimeUnit;/** * 初始化连接时候的各个组件 * Timely communication * */public class TCWebSocketChannelHandler extends ChannelInitializer { @Override protected void initChannel(SocketChannel e) throws Exception { e.pipeline().addLast("new HttpServerCodec()); e.pipeline().addLast("aggregator", new HttpObjectAggregator(65536)); e.pipeline().addLast("new ChunkedWriteHandler()); // 添加具体的处理器。可以addLast(或者addFirst)多个handler, // 第一个参数是名字,无具体要求,如果填写null,系统会自动命名。 e.pipeline().addLast("handler", new TCWebSocketHandler()); /**通过使用管道的ChannelPipeline方式来处理请求 * 第一个配置的管道先处理,然后移交给下一个管道来处理,在每个管道处理中 * 各个handler可以决定是否继续或中断 * ChannelPipeline和ChannelHandler机制类似于Servlet和Filter过滤器{@link ChannelPipeline} * Netty中的事件分为inbound事件和outbound事件。 * inbound事件通常由I/O线程触发,例如TCP链路建立事件、链路关闭事件、读事件、异常通知事件等。方法名以file开始{@link ChannelHandlerContext} * outbound事件类似于发送、刷新、断开连接、绑定本地地址等关闭channel */ }}
java netty 通道类 代码
package com.superman.testnetty;import io.netty.buffer.ByteBuf;import io.netty.buffer.Unpooled;import io.netty.channel.*;import io.netty.handler.codec.io.netty.handler.codec.io.netty.handler.codec.io.netty.handler.codec.io.netty.handler.codec.io.netty.handler.codec.io.netty.handler.codec.io.netty.handler.codec.io.netty.handler.codec.io.netty.handler.codec.io.netty.handler.codec.io.netty.handler.codec.io.netty.util.CharsetUtil;import java.io.IOException;import java.util.HashMap;import java.util.List;import java.util.Map;/** * 接收/处理/响应客户端websocket请求的核心业务处理类 * 通过添加hanlder,我们可以监听Channel的各种动作以及状态的改变,包括连接,绑定,接收消息等。 * * Timely communication */public class TCWebSocketHandler extends SimpleChannelInboundHandler
这个类主要处理通讯时候寻找对应的通道
java netty 通讯上下文管理类
package com.superman.testnetty;import io.netty.channel.Channel;import io.netty.channel.group.ChannelGroup;import io.netty.channel.group.DefaultChannelGroup;import io.netty.handler.codec.io.netty.util.concurrent.GlobalEventExecutor;import java.util.concurrent.ConcurrentHashMap;import java.util.concurrent.ConcurrentMap;import java.util.concurrent.locks.ReentrantReadWriteLock;/** * 存储整个工程的全局配置 * Timely communication * */public class TCChannelManage { /** * 存储每一个客户端接入进来时的channel对象 */ public static ChannelGroup group = new DefaultChannelGroup(GlobalEventExecutor.INSTANCE); // 读锁 private static ReentrantReadWriteLock rwLock = new ReentrantReadWriteLock(true); public static ConcurrentMap userIdAndChannelMap = new ConcurrentHashMap<>(); public static void send(String senderId, String receiverId, String message, Channel senderChannel) { // 发送肯定是A要给B发,A就是发消息的对象,B可以是人,机器等对象 try { rwLock.readLock().lock(); // 1.寻找receiverId的channel Channel receiverChannel = userIdAndChannelMap.get(receiverId); if (receiverChannel == null) { // 使用发送者的通道告知发送者,你要发的那个人不在线 senderChannel.writeAndFlush(new TextWebSocketFrame(receiverId + "不在线")); return; } // 2.发送。A给B发,B若要收到消息,其实是通过B的channel给B发消息 receiverChannel.writeAndFlush(new TextWebSocketFrame(senderId + "发来消息===》" + message)); } catch (Exception e) { e.printStackTrace(); } finally { rwLock.readLock().unlock(); } } public static boolean hasChannel(String id) { Channel channel = userIdAndChannelMap.get(id); if (channel == null) { return false; } else { return true; } }}
通道存储和添加删除啥的用在这即可
html 网页代码
WebSocket客户端
及时唠嗑
实例代码和jar包
javascript:void(0)
附上一个netty 启动jar jvm
java -jar -server -Xms4G -Xmx4G -XX:NewSize=3584m -XX:PermSize=64m -XX:SurvivorRatio=1 -XX:+UseParallelGC -XX:-UseAdaptiveSizePolicy
java -jar -server -Xms4G:初始堆大小,设置JVM促使内存为4G。此值可以设置与-Xmx相同,以避免每次垃圾回收完成后JVM重新分配内存。 -Xmx4G :最大堆大小设置JVM最大可用内存为4G。 -XX:NewSize=3584m :设置年轻代大小-XX:PermSize=64m :设置持久代大小为-XX:SurvivorRatio=1 :年轻代中Eden区与两个Survivor区的比值。注意Survivor区有两个。如:3,表示Eden:Survivor=3:2,一个Survivor区占整个年轻代的1/5-XX:+UseParallelGC :设置并行收集器-XX:+UseAdaptiveSizePolicy :设置此选项后,并行收集器会自动选择年轻代区大小和相应的Survivor区比例,以达到目标系统规定的最低相应时间或者收集频率等,此值建议使用并行收集器时,一直打开。
jvm常见配置汇总介绍
堆设置
-Xms:初始堆大小-Xmx:最大堆大小-XX:NewSize=n:设置年轻代大小-XX:NewRatio=n:设置年轻代和年老代的比值。如:为3,表示年轻代与年老代比值为1:3,年轻代占整个年轻代年老代和的1/4-XX:SurvivorRatio=n:年轻代中Eden区与两个Survivor区的比值。注意Survivor区有两个。如:3,表示Eden:Survivor=3:2,一个Survivor区占整个年轻代的1/5-XX:MaxPermSize=n:设置持久代大小
收集器设置
-XX:+UseSerialGC:设置串行收集器-XX:+UseParallelGC:设置并行收集器-XX:+UseParalledlOldGC:设置并行年老代收集器-XX:+UseConcMarkSweepGC:设置并发收集器
垃圾回收统计信息
-XX:+PrintGC-XX:+PrintGCDetails-XX:+PrintGCTimeStamps-Xloggc:filename
并行收集器设置
-XX:ParallelGCThreads=n:设置并行收集器收集时使用的CPU数。并行收集线程数。-XX:MaxGCPauseMillis=n:设置并行收集最大暂停时间-XX:GCTimeRatio=n:设置垃圾回收时间占程序运行时间的百分比。公式为1/(1+n)
并发收集器设置
-XX:+CMSIncrementalMode:设置为增量模式。适用于单CPU情况。-XX:ParallelGCThreads=n:设置并发收集器年轻代收集方式为并行收集时,使用的CPU数。并行收集线程数。
轻松处理器支持1w往上
ok
持续更新
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
暂时没有评论,来抢沙发吧~