Netty实现简单的多人聊天
1、服务端代码:服务端配置、服务端自定义事件处理类。
自定义事件处理类 – NettyServerHandler :
- 继承类SimpleChannelInboundHandler,使用泛型,此处泛型的数据类型和接收的消息的数据类型一致
- 此类默认自动将接收到的消息转换成此类型数据
public class NettyServerHandler extends SimpleChannelInboundHandler<String> {/*** 注:此方法需设置成静态*/public static List<Channel> channelList = new ArrayList<>();/*** 通道就绪事件* @param ctx* @throws Exception*/@Overridepublic void channelActive(ChannelHandlerContext ctx) throws Exception {//获取就绪通道Channel channel = ctx.channel(); //获取当前准备就绪通道channelList.add(channel); //新增准备就绪通道//获取通道的地址,转换成String类型,从下表为1的位置截取该字符串System.out.println("[Server:"+channel.remoteAddress().toString().substring(1)+"] 上线!");}/*** 通道未就绪事件* @param ctx* @throws Exception*/@Overridepublic void channelInactive(ChannelHandlerContext ctx) throws Exception {Channel channel = ctx.channel(); //获取当前为准备就绪通道channelList.remove(channel); //移除当前未就绪通道System.out.println("[Server:"+channel.remoteAddress().toString().substring(1)+"] 下线!");}/*** 数据读取时间* @param ctx* @param msg* @throws Exception*/@Overrideprotected void channelRead0(ChannelHandlerContext ctx, String msg) throws Exception {Channel channel = ctx.channel(); //获取当前接发送消息的通道//广播接收到的消息给除了当前通道对应客户端的其他通道客户端for (Channel ch : channelList) { //遍历所有在线的通道if (ch != channel){ //排除当前通道ch.writeAndFlush("用户"+channel.remoteAddress().toString().substring(1)+"说:"+msg);}}}/*** 异常处理事件* @param ctx* @param cause* @throws Exception*/@Overridepublic void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {System.out.println("通道"+ctx.channel().remoteAddress().toString().substring(1)+"捕获到异常!");}
}
服务端配置类 – NettyServer :
public class NettyServer {public static void main(String[] args) {new NettyServer(8888).run();}private int port;public NettyServer(int port){this.port = port;}public void run(){//网络连接线程组EventLoopGroup bossGroup = new NioEventLoopGroup();//IO操作线程组EventLoopGroup workerGroup = new NioEventLoopGroup();try {//服务端启动助手ServerBootstrap bs = new ServerBootstrap();bs.group(bossGroup,workerGroup).channel(NioServerSocketChannel.class) //服务端通道的实现.option(ChannelOption.SO_BACKLOG,512) //通道中允许连接等待的数量.childOption(ChannelOption.SO_KEEPALIVE,true) //保持连接状态.childHandler(new ChannelInitializer<SocketChannel>() {//自定义通道事件处理类初始化,往链中添加自定义的事件处理类@Overrideprotected void initChannel(SocketChannel ch) throws Exception {ChannelPipeline cpp = ch.pipeline(); //获取链//解码cpp.addLast("decoder",new StringDecoder());//编码cpp.addLast("encoder",new StringEncoder());//添加自定义事件处理类,此处需要注意:自定义的事件处理类要在编解码配置后cpp.addLast("handler",new NettyServerHandler());}});//绑定服务端端口ChannelFuture bf = bs.bind(port).sync();System.out.println(".........服务端启动成功.........");//关闭通道bf.channel().closeFuture().sync();} catch (Exception e) {e.printStackTrace();} finally {bossGroup.shutdownGracefully();workerGroup.shutdownGracefully();}}
}
2、客户端代码:客户端配置类、客户端自定义事件处理类
**客户端自定义事件处理类 – NettyClientHandler **
public class NettyClientHandler extends SimpleChannelInboundHandler<String> {/*** 数据读取事件* @param ctx* @param msg* @throws Exception*/@Overrideprotected void channelRead0(ChannelHandlerContext ctx, String msg) throws Exception {System.out.println(msg.trim());}
}
客户端配置类 – NettyCient :
public class NettyCient {public static void main(String[] args) {new NettyCient("127.0.0.1",8888).run();}private String ipAddress;private int port;public NettyCient(String ipAddress,int port){this.ipAddress = ipAddress;this.port = port;}public void run(){//客户端线程组EventLoopGroup group = new NioEventLoopGroup();try {//客户端启动助手Bootstrap b = new Bootstrap();b.group(group).channel(NioSocketChannel.class) //客户端通道实现类.handler(new ChannelInitializer<SocketChannel>() {@Overrideprotected void initChannel(SocketChannel ch) throws Exception {ChannelPipeline cpp = ch.pipeline();cpp.addLast("decoder",new StringDecoder());cpp.addLast("encoder",new StringEncoder());cpp.addLast("handler",new NettyClientHandler());}});//连接服务端ChannelFuture cf = b.connect(ipAddress,port).sync();System.out.println("---------客户端启动成功--------");//java控制台输入Scanner sc = new Scanner(System.in);while(sc.hasNextLine()){String str = sc.nextLine();cf.channel().writeAndFlush(str+"\n"); //将控制台输入的值写入通道}//通道关闭cf.channel().closeFuture().sync();} catch (Exception e) {e.printStackTrace();} finally {group.shutdownGracefully();}}
}
Netty实现简单的多人聊天相关推荐
- udp实现简单的多人聊天功能
udp实现简单的多人聊天功能 多个客户端向服务器发送信息,服务端再将信息返回到各个客户端. 这是接收udp的实现类: public class Rec implements Runnable{priv ...
- SpringBoot——SpringBoot集成WebSocket实现简单的多人聊天室
文章目录: 1.什么是WebSocket? 2.Java中的WebSocket API 2.1 WebSocket开发中的相关注解及API方法 2.2 前端技术对WebSocket的支持 3.多人聊天 ...
- 利用Java实现简单的多人聊天(微信的基础实现原理TCP)
前言 最近在java中了解到了基于TCP的网络编程,即可以通过构建连接来使得客户机和服务器之间进行信息的交互(文字.文件.图片等等),之前也听说过利用java可以实现一个简单的网络聊天室.因此,我就自 ...
- 【Unity】Socket网络通信(TCP) - 实现简单的多人聊天功能
多客户端连接服务器其原理是在服务端保存客户端连入后与客户端通信的socket,由于等待客户端连接会阻塞主线程,所以结合多线程就能实现多客户端连入功能.多人聊天只需要将A客户端发来的消息,转发给除A客户 ...
- 【转载】API:简单实现多人聊天室
前言 API知识点:IO输入输出流.网络编程.多线程.多线程的并发安全问题的解决 IO输入输出流 前面讲到的变量.基本类型.对象等,它们在系统中存储的数据都是在内存中暂存的数据,当一个程序结束时,这些 ...
- python简单的多人聊天室
刚开始学习python,写了一个聊天室练练手. Server.py import socket,select,thread;host=socket.gethostname() port=5963 ad ...
- 网络编程多人聊天c语言,socket网络编程--简单的多人聊天
//本代码参考于马士兵的代码,做了一些简单的改动,例如获取主机名称好让用户知道那句话是谁发的,Swing方面基本上全改了,关键地方加了我所理解的注释,关键线程方面的代码基本上用马老师的 //服务器端代 ...
- python实现简单的多人聊天功能
实现聊天功能 1什么存储用户:列表 2什么类型套接字:udp 3怎么发消息:转发 即客户端发给服务器, 然后在送给其他人 *在客户端让发送和接收相互独立,各使用 ...
- Unity ~实现简单的多人聊天工具
代码1:服务端代码 using UnityEngine; using System.Net.Sockets; using System.Net; using System.Threading; pub ...
最新文章
- pyhon学习问题汇总
- c语言 数组比较不等往下累加,用C语言确定两个数组内的元素排列顺序不同,但是元素相同,代码有bug找不出?...
- Spring 入门学习二之IOC
- C# 控件双缓冲控制 ControlStyles 枚举详解
- 工作中用到的安卓日志相关命令(logcat)
- Flex 传JAVA BEAN 到后台 JAVA
- Java里进制转换(二进制、八进制、十进制、十六进制)
- 中小型网络工程设计与实现_小型网络如何实现经济可靠的设计和部署 (一)...
- SQL SERVER数据库三种数据插入方式
- win7下vs2017安装奋斗纠结过程
- FreeMarker生成word文档
- c# 中崎_C#版OPOS打印(基于北洋OPOS SDK二次开发包,支持EPSON和北洋、佳博、商祺等支持标准ESC/POS指令的POS打印机) | 学步园...
- 初识云计算————云计算概念
- 360浏览器自动填充表单
- 法拉克机器人自动怎么调_发那科机器人的正确操作方法及步骤
- 将应用程序设置可信任(在win10操作系统)
- tif批量转png格式 python
- HTTP Referer介绍和使用
- HDU 1415(Jugs)
- textpad和masm搭建汇编环境
热门文章
- 小清新的jQuery 幻灯片jQuery ck-slide 图片轮播
- 面试TCP/IP被虐了?
- SharedPreferences的使用注意事项
- 股票量化分析工具QTYX使用攻略——快速选出强势股(更新2.6.0)
- 56个民族的JSON数据
- mangos linux编译,Mangos 完全编译教程——客户端版本控制篇
- 基于Redis中 Zset数据类型实现各类高性能排行榜日榜、周榜(附上整合SpringBoot示例代码)
- 体前屈大赛(桶排序)
- 马云给阿里巴巴员工的公开信
- 义务教育学校计算机师机比,表1山东34个义务教育学校办学基本标准达标情况表...