Netty 搭建网络聊天室 demo

利用webSocket 搭建网络聊天

所需jar包

          
        
            io.netty
            netty-all
            4.1.25.Final
        

      

前端页面,



	
		
		
	
	
			
发送消息

后端代码主要三个类

wsServer 启动类
 

/**
 * websocket 启动类
 * @author ABC
 *
 */
public class wsServer {
	public static void main(String[] args) throws InterruptedException {
		
		EventLoopGroup main = new NioEventLoopGroup();
		EventLoopGroup sub = new NioEventLoopGroup();
		try {
			ServerBootstrap server = new ServerBootstrap();
			server.group(main, sub)
				  .channel(NioServerSocketChannel.class)
				  .childHandler(new wsServerInitializer());
			
			ChannelFuture cf = server.bind(8088).sync();
			cf.channel().closeFuture().sync();
		} finally {
			main.shutdownGracefully();
			sub.shutdownGracefully();
		}

		
		
	}
}

初始化类

/**
 * websocket 初始化器
 * @author ABC
 *
 */
public class wsServerInitializer extends ChannelInitializer{

	@Override
	protected void initChannel(SocketChannel ch) throws Exception {
		ChannelPipeline pipeline = 	ch.pipeline();
		//http编解码
		pipeline.addLast(new HttpServerCodec());
		//对大数据流的支持
		pipeline.addLast(new ChunkedWriteHandler());
		//对httpMessage 进行 聚合,整合成FullHttpRequest 或 FullHttpResponse
		// 几乎在netty 中的编程,都会用到此handler
		pipeline.addLast(new HttpObjectAggregator(1024*64));
		
		//================================  以上是用于支持http协议   ==============================================
		/**
		 * webSocket  服务器处理的协议,用于指定给客户端连接访问的路由:/ws
		 * 本handler 会帮你处理一些繁重的复杂的事
		 * 会帮你处理握手动作,handshaking(close,ping ,pong)
		 * 对于webSocket 来讲  都是以frames 进行传输的,不同的数据类型对应的frames 也不同
		 */
		pipeline.addLast(new WebSocketServerProtocolHandler("/ws"));
		
		//自定义的handler
		pipeline.addLast(new wsHandler());
	}

}

处理类

/**
 * 处理消息的handler
 * TextWebSocketFrame : 在netty 中,是用于websocket专门处理文本的对象,frame 是消息的载体
 * @author ABC
 *
 */
public class wsHandler extends SimpleChannelInboundHandler{
	private static ChannelGroup clients 
				   = new DefaultChannelGroup(GlobalEventExecutor.INSTANCE);
	@Override
	protected void channelRead0(ChannelHandlerContext ctx, TextWebSocketFrame msg) throws Exception {
		//获取客户端传输过来的消息
		String content = msg.text();
		System.out.println("接收到的数据:"+content);
		
		for(Channel channel : clients) {
			channel.writeAndFlush
			(new TextWebSocketFrame
					("服务器在"+LocalDateTime.now()+"收到消息:"+content));
		}
		
/*		clients.writeAndFlush(new TextWebSocketFrame
					("服务器在"+LocalDateTime.now()+"收到消息:"+content));*/
		
	}
	/**
	 * 客户端链接之后触发
	 * 获取客户端的channel 并且放到ChannelGroup中去进行管理
	 */
	@Override
	public void handlerAdded(ChannelHandlerContext ctx) throws Exception {
		System.out.println(ctx.channel().id().asLongText()+"已连接");
		clients.add(ctx.channel());
	}
	/**
	 * 客户端链接断开之后触发
	 */
	@Override
	public void handlerRemoved(ChannelHandlerContext ctx) throws Exception {
		//当触发此方法时,channelGroup 会自动移除对应的客户端的channel
		//clients.remove(ctx.channel());
		System.out.println("客户端断开");
		System.out.println("长Id:"+ctx.channel().id().asLongText());
		System.out.println("短Id:"+ctx.channel().id().asShortText());
	}

	
}


 

你可能感兴趣的:(Netty 搭建网络聊天室 demo)