分享web开发知识

注册/登录|最近发布|今日推荐

主页 IT知识网页技术软件开发前端开发代码编程运营维护技术分享教程案例
当前位置:首页 > 软件开发

利用netty简单实现聊天室

发布时间:2023-09-06 02:24责任编辑:沈小雨关键词:暂无标签

1.导入依赖包

 ???????<dependency> ???????????<groupId>io.netty</groupId> ???????????<artifactId>netty-all</artifactId> ???????????<version>5.0.0.Alpha1</version> ???????</dependency>

2.netty服务端代码

public class NettyServer { ???public static void main(String[] args) { ????????EventLoopGroup bossGroup = new NioEventLoopGroup(); ????????EventLoopGroup workGroup = new NioEventLoopGroup(); ????????ServerBootstrap bootStrap = new ServerBootstrap(); ???????????ChannelFuture cf; ???????????bootStrap.group(bossGroup,workGroup) ???????????????????.channel(NioServerSocketChannel.class) ???????????????????.option(ChannelOption.SO_BACKLOG, 1024) ???????????????????.childHandler(new ChannelInitializer<SocketChannel>() { ???????????????????????@Override ???????????????????????public void initChannel(SocketChannel ch) throws Exception { ???????????????????????????ChannelPipeline p = ch.pipeline(); ???????????????????????????p.addLast("decoder", new StringDecoder());//需要编解码,否则无法解析 ???????????????????????????p.addLast("encoder", new StringEncoder()); ???????????????????????????p.addLast(new NettyServerHandler()); ???????????????????????} ???????????????????}); ???????????try { ???????????????cf = ?bootStrap.bind(8099).sync();//监听8099端口 ???????????????System.out.println("8099:binded..."); ???????????????cf.channel().closeFuture().sync(); ???????????} catch (InterruptedException e) { ???????????????e.printStackTrace(); ???????????}finally{ ???????????????bossGroup.shutdownGracefully(); ???????????????workGroup.shutdownGracefully(); ???????????} ???}}

3.netty客户端代码

public class NettyClient { ???public static void main(String[] args) throws Exception { ???????EventLoopGroup group =new NioEventLoopGroup(); ???????try { ???????????Bootstrap b = new Bootstrap(); ???????????b.group(group) ???????????????????.channel(NioSocketChannel.class) ???????????????????.option(ChannelOption.TCP_NODELAY, true) ???????????????????.handler(new ChannelInitializer<SocketChannel>(){ ???????????????????????@Override ???????????????????????public void initChannel(SocketChannel ch) throws Exception { ???????????????????????????ChannelPipeline p = ch.pipeline(); ???????????????????????????p.addLast("decoder", new StringDecoder()); ???????????????????????????p.addLast("encoder", new StringEncoder()); ???????????????????????????p.addLast(new ClientHandler()); ???????????????????????????p.addLast(new ClientHandlerBak()); ???????????????????????} ???????????????????}); ???????????ChannelFuture future = b.connect("127.0.0.1", 8099).sync(); ???????????future.channel().writeAndFlush("这里是客户端,请求连接服务端!"); ???????????future.channel().closeFuture().sync(); ???????} finally { ???????????group.shutdownGracefully(); ???????} ???}}

4.服务端处理类

public class NettyServerHandler extends ChannelHandlerAdapter { ???//有客户端连接时触发 ???@Override ???public void channelActive(ChannelHandlerContext ctx) throws Exception { ???????System.out.println("one client connect..."); ???} ???//断开连接时触发 ???@Override ???public void channelInactive(ChannelHandlerContext ctx) throws Exception { ???????System.out.println("one client disconnect..."); ???} ???//接收客户端发送的消息 ???@Override ???public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { ???????System.out.println("客户端:"+msg.toString()); ???????InputStreamReader is = new InputStreamReader(System.in); ???????BufferedReader br = new BufferedReader(is); ???????String result ="result"; ???????try{ ???????????result = br.readLine(); ???????} ???????catch(IOException e){ ???????????e.printStackTrace(); ???????} ???????ctx.write(result);//给客户端回复 ???????ctx.flush(); ???}}

5.客户端处理类

public class ClientHandler extends ChannelHandlerAdapter { ???@Override ???public void channelActive(ChannelHandlerContext ctx) throws Exception { ???????System.out.println("Client01Handler Active"); ???????/*若把这一句注释掉将无法将event传递给下一个ClientHandler,例如例子中p.addLast(new Client01Handler())后面紧跟着p.addLast(new Client02Handler()) ????????后面的Client02Handler里的方法就不会被触发。 ???????*/ ???????ctx.fireChannelActive(); ???} ???@Override ???public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { ???????System.out.println("服务端: "+msg); ???????InputStreamReader is = new InputStreamReader(System.in); ???????BufferedReader br = new BufferedReader(is); ???????String result ="result"; ???????try{ ???????????result = br.readLine(); ???????} ???????catch(IOException e){ ???????????e.printStackTrace(); ???????} ???????ctx.write(result);//给服务端回复 ???????ctx.flush(); ???} ???@Override ???public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { ???????cause.printStackTrace(); ???????ctx.close(); ???}}

6.最后,看看效果,先启动服务端,再启动客户端

利用netty简单实现聊天室

原文地址:https://www.cnblogs.com/tinyj/p/10028979.html

知识推荐

我的编程学习网——分享web前端后端开发技术知识。 垃圾信息处理邮箱 tousu563@163.com 网站地图
icp备案号 闽ICP备2023006418号-8 不良信息举报平台 互联网安全管理备案 Copyright 2023 www.wodecom.cn All Rights Reserved