日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術(shù)文章
文章詳情頁

JAVA Netty實(shí)現(xiàn)聊天室+私聊功能的示例代碼

瀏覽:23日期:2022-08-26 15:53:26

功能介紹

使用Netty框架實(shí)現(xiàn)聊天室功能,服務(wù)器可監(jiān)控客戶端上下限狀態(tài),消息轉(zhuǎn)發(fā)。同時(shí)實(shí)現(xiàn)了點(diǎn)對點(diǎn)私聊功能。技術(shù)點(diǎn)我都在代碼中做了備注,這里不再重復(fù)寫了。希望能給想學(xué)習(xí)netty的同學(xué)一點(diǎn)參考。

服務(wù)器代碼

服務(wù)器入口代碼

package nio.test.netty.groupChat;import io.netty.bootstrap.ServerBootstrap;import io.netty.channel.ChannelFuture;import io.netty.channel.ChannelInitializer;import io.netty.channel.ChannelOption;import io.netty.channel.ChannelPipeline;import io.netty.channel.EventLoopGroup;import io.netty.channel.nio.NioEventLoopGroup;import io.netty.channel.socket.SocketChannel;import io.netty.channel.socket.nio.NioServerSocketChannel;import io.netty.handler.codec.string.StringDecoder;import io.netty.handler.codec.string.StringEncoder;import io.netty.util.concurrent.Future;import io.netty.util.concurrent.GenericFutureListener;/** * netty群聊 服務(wù)器端 * @author zhang * */public class NettyChatServer {private int port;public NettyChatServer(int port){this.port = port;}//初始化 netty服務(wù)器private void init() throws Exception{EventLoopGroup boss = new NioEventLoopGroup(1);EventLoopGroup work = new NioEventLoopGroup(16);try {ServerBootstrap boot = new ServerBootstrap();boot.group(boss,work);boot.channel(NioServerSocketChannel.class);//設(shè)置boss selector建立channel使用的對象boot.option(ChannelOption.SO_BACKLOG, 128);//boss 等待連接的 隊(duì)列長度boot.childOption(ChannelOption.SO_KEEPALIVE, true); //讓客戶端保持長期活動狀態(tài)boot.childHandler(new ChannelInitializer<SocketChannel>() {@Overrideprotected void initChannel(SocketChannel ch) throws Exception {//從channel中獲取pipeline 并往里邊添加HandlerChannelPipeline pipeline = ch.pipeline();pipeline.addLast('encoder',new StringEncoder());pipeline.addLast('decoder',new StringDecoder());pipeline.addLast(new ServerMessageHandler());//自定義Handler來處理消息}});System.out.println('服務(wù)器開始啟動...');//綁定端口 ChannelFuture channelFuture = boot.bind(port).sync();channelFuture.addListener(new GenericFutureListener<Future<? super Void>>() {@Overridepublic void operationComplete(Future<? super Void> future)throws Exception {if(future.isSuccess()){System.out.println('服務(wù)器正在啟動...');}if(future.isDone()){System.out.println('服務(wù)器啟動成功...OK');}}});//監(jiān)聽channel關(guān)閉channelFuture.channel().closeFuture().sync();channelFuture.addListener(new GenericFutureListener<Future<? super Void>>() {@Overridepublic void operationComplete(Future<? super Void> future)throws Exception {if(future.isCancelled()){System.out.println('服務(wù)器正在關(guān)閉..');}if(future.isCancellable()){System.out.println('服務(wù)器已經(jīng)關(guān)閉..OK');}}});}finally{boss.shutdownGracefully();work.shutdownGracefully();}}/** * 啟動服務(wù)器 main 函數(shù) * @param args * @throws Exception */public static void main(String[] args) throws Exception {new NettyChatServer(9090).init();}}

服務(wù)器端消息處理Handler

package nio.test.netty.groupChat;import io.netty.channel.Channel;import io.netty.channel.ChannelHandlerContext;import io.netty.channel.SimpleChannelInboundHandler;import io.netty.channel.group.ChannelGroup;import io.netty.channel.group.DefaultChannelGroup;import io.netty.util.concurrent.GlobalEventExecutor;import java.text.SimpleDateFormat;import java.util.Date;import java.util.HashMap;import java.util.Map;/** * 自定義 服務(wù)器端消息處理Handler * @author zhang * */public class ServerMessageHandler extends SimpleChannelInboundHandler<String>{/** * 管理全局的channel * GlobalEventExecutor.INSTANCE 全局事件監(jiān)聽器 * 一旦將channel 加入 ChannelGroup 就不要用手動去 * 管理channel的連接失效后移除操作,他會自己移除 */private static ChannelGroup channels = new DefaultChannelGroup(GlobalEventExecutor.INSTANCE);/** * 為了實(shí)現(xiàn)私聊功能,這里key存儲用戶的唯一標(biāo)識, * 我保存 客戶端的端口號 * 當(dāng)然 這個(gè)集合也需要自己去維護(hù) 用戶的上下線 不能像 ChannelGroup那樣自己去維護(hù) */private static Map<String,Channel> all = new HashMap<String,Channel>();private SimpleDateFormat sf = new SimpleDateFormat('yyyy-MM-dd HH:mm:ss');/** * 處理收到的消息 */@Overrideprotected void channelRead0(ChannelHandlerContext ctx, String msg)throws Exception {Channel channel = ctx.channel();/** * 這里簡單判斷 如果內(nèi)容里邊包含#那么就是私聊 */if(msg.contains('#')){String id = msg.split('#')[0];String body = msg.split('#')[1];Channel userChannel = all.get(id);String key = channel.remoteAddress().toString().split(':')[1];userChannel.writeAndFlush(sf.format(new Date())+'n 【用戶】 '+key+' 說 : '+body);return;}//判斷當(dāng)前消息是不是自己發(fā)送的for(Channel c : channels){String addr = c.remoteAddress().toString();if(channel !=c){c.writeAndFlush(sf.format(new Date())+'n 【用戶】 '+addr+' 說 : '+msg);}else{c.writeAndFlush(sf.format(new Date())+'n 【自己】 '+addr+' 說 : '+msg);}}}/** * 建立連接以后第一個(gè)調(diào)用的方法 */@Overridepublic void handlerAdded(ChannelHandlerContext ctx) throws Exception {Channel channel = ctx.channel();String addr = channel.remoteAddress().toString();/** * 這里 ChannelGroup 底層封裝會遍歷給所有的channel發(fā)送消息 * */channels.writeAndFlush(sf.format(new Date())+'n 【用戶】 '+addr+' 加入聊天室 ');channels.add(channel);String key = channel.remoteAddress().toString().split(':')[1];all.put(key, channel);}/** * channel連接狀態(tài)就緒以后調(diào)用 */@Overridepublic void channelActive(ChannelHandlerContext ctx) throws Exception {String addr = ctx.channel().remoteAddress().toString();System.out.println(sf.format(new Date())+' n【用戶】 '+addr+' 上線 ');}/** * channel連接狀態(tài)斷開后觸發(fā) */@Overridepublic void channelInactive(ChannelHandlerContext ctx) throws Exception {String addr = ctx.channel().remoteAddress().toString();System.out.println(sf.format(new Date())+' n【用戶】 '+addr+' 下線 ');//下線移除String key = ctx.channel().remoteAddress().toString().split(':')[1];all.remove(key);}/** * 連接發(fā)生異常時(shí)觸發(fā) */@Overridepublic void exceptionCaught(ChannelHandlerContext ctx, Throwable cause)throws Exception {//System.out.println('連接發(fā)生異常!');ctx.close();}/** * 斷開連接會觸發(fā)該消息 * 同時(shí)當(dāng)前channel 也會自動從ChannelGroup中被移除 */@Overridepublic void handlerRemoved(ChannelHandlerContext ctx) throws Exception {Channel channel = ctx.channel();String addr = channel.remoteAddress().toString();/** * 這里 ChannelGroup 底層封裝會遍歷給所有的channel發(fā)送消息 * */channels.writeAndFlush(sf.format(new Date())+'n 【用戶】 '+addr+' 離開了 ');//打印 ChannelGroup中的人數(shù)System.out.println('當(dāng)前在線人數(shù)是:'+channels.size());System.out.println('all:'+all.size());}}

客戶端主方法代碼

package nio.test.netty.groupChat;import io.netty.bootstrap.Bootstrap;import io.netty.channel.Channel;import io.netty.channel.ChannelFuture;import io.netty.channel.ChannelInitializer;import io.netty.channel.ChannelPipeline;import io.netty.channel.EventLoopGroup;import io.netty.channel.nio.NioEventLoopGroup;import io.netty.channel.socket.nio.NioSocketChannel;import io.netty.handler.codec.string.StringDecoder;import io.netty.handler.codec.string.StringEncoder;import io.netty.util.concurrent.Future;import io.netty.util.concurrent.GenericFutureListener;import java.util.Scanner;public class NettyChatClient {private String ip;private int port;public NettyChatClient(String ip,int port){this.ip = ip;this.port = port;}/** * 初始化客戶 */private void init() throws Exception{//創(chuàng)建監(jiān)聽事件的監(jiān)聽器EventLoopGroup work = new NioEventLoopGroup();try {Bootstrap boot = new Bootstrap();boot.group(work);boot.channel(NioSocketChannel.class);boot.handler(new ChannelInitializer<NioSocketChannel>() {@Overrideprotected void initChannel(NioSocketChannel ch)throws Exception {ChannelPipeline pipeline = ch.pipeline();pipeline.addLast('encoder',new StringEncoder());pipeline.addLast('decoder',new StringDecoder());pipeline.addLast(new ClientMessageHandler());}});ChannelFuture channelFuture = boot.connect(ip, port).sync();channelFuture.addListener(new GenericFutureListener<Future<? super Void>>() {@Overridepublic void operationComplete(Future<? super Void> future)throws Exception {if(future.isSuccess()){System.out.println('客戶端啟動中...');}if(future.isDone()){System.out.println('客戶端啟動成功...OK!');}}});System.out.println(channelFuture.channel().localAddress().toString());System.out.println('#################################################');System.out.println('~~~~~~~~~~~~~~端口號#消息內(nèi)容~~這樣可以給單獨(dú)一個(gè)用戶發(fā)消息~~~~~~~~~~~~~~~~~~');System.out.println('#################################################');/** * 這里用控制臺輸入數(shù)據(jù) */Channel channel = channelFuture.channel();//獲取channelScanner scanner = new Scanner(System.in);while(scanner.hasNextLine()){String str = scanner.nextLine();channel.writeAndFlush(str+'n');}channelFuture.channel().closeFuture().sync();scanner.close();} finally {work.shutdownGracefully();}}/** * 主方法入口 * @param args * @throws Exception */public static void main(String[] args) throws Exception{new NettyChatClient('127.0.0.1',9090).init();}}

客戶端消息處理Handler

package nio.test.netty.groupChat;import io.netty.channel.ChannelHandlerContext;import io.netty.channel.SimpleChannelInboundHandler;/** * 客戶點(diǎn)消息處理 Handler * @author zhang * */public class ClientMessageHandler extends SimpleChannelInboundHandler<String> {/** * 處理收到的消息 */@Overrideprotected void channelRead0(ChannelHandlerContext ctx, String msg)throws Exception {System.out.println(msg);}/** * 連接異常后觸發(fā) */@Overridepublic void exceptionCaught(ChannelHandlerContext ctx, Throwable cause)throws Exception {ctx.close();}}

測試結(jié)果

啟動了四個(gè)客戶端 服務(wù)器端日志效果如下:

JAVA Netty實(shí)現(xiàn)聊天室+私聊功能的示例代碼

客戶端一端日志:

JAVA Netty實(shí)現(xiàn)聊天室+私聊功能的示例代碼

客戶端二日志:

JAVA Netty實(shí)現(xiàn)聊天室+私聊功能的示例代碼

客戶端三日志:

JAVA Netty實(shí)現(xiàn)聊天室+私聊功能的示例代碼

客戶端四日志:

JAVA Netty實(shí)現(xiàn)聊天室+私聊功能的示例代碼

現(xiàn)在在客戶端四發(fā)送消息:

JAVA Netty實(shí)現(xiàn)聊天室+私聊功能的示例代碼

每個(gè)客戶端都可以收到消息:

JAVA Netty實(shí)現(xiàn)聊天室+私聊功能的示例代碼

JAVA Netty實(shí)現(xiàn)聊天室+私聊功能的示例代碼

JAVA Netty實(shí)現(xiàn)聊天室+私聊功能的示例代碼

軟化關(guān)閉客戶端客戶端三:

服務(wù)器日志:

JAVA Netty實(shí)現(xiàn)聊天室+私聊功能的示例代碼

其他客戶端日志:

JAVA Netty實(shí)現(xiàn)聊天室+私聊功能的示例代碼

JAVA Netty實(shí)現(xiàn)聊天室+私聊功能的示例代碼

JAVA Netty實(shí)現(xiàn)聊天室+私聊功能的示例代碼

發(fā)送私聊消息:

JAVA Netty實(shí)現(xiàn)聊天室+私聊功能的示例代碼

這個(gè)客戶端收不到消息

JAVA Netty實(shí)現(xiàn)聊天室+私聊功能的示例代碼

JAVA Netty實(shí)現(xiàn)聊天室+私聊功能的示例代碼

到此這篇關(guān)于JAVA Netty實(shí)現(xiàn)聊天室+私聊功能的示例代碼的文章就介紹到這了,更多相關(guān)JAVA Netty聊天室內(nèi)容請搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標(biāo)簽: Java
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
视频一区二区中文字幕| 亚洲精品高潮| 欧美激情视频一区二区三区免费| 91精品亚洲| 亚洲黄色网址| 亚洲精品888| 欧美va天堂| 图片区亚洲欧美小说区| 亚洲国产专区校园欧美| 91成人网在线观看| 日韩亚洲精品在线| 免费日韩一区二区| 色8久久久久| 国产欧美日韩视频在线| 国产精品久一| 久久精品国产久精国产爱| 国产aa精品| 欧美日韩精品免费观看视欧美高清免费大片 | 国内亚洲精品| 亚洲午夜黄色| 免费在线视频一区| 日韩av一级片| 麻豆一区二区三| av在线资源| 欧美日韩一二| 亚洲一区国产一区| 亚洲一区亚洲| 日本中文字幕视频一区| 国产精品片aa在线观看| 中文字幕人成乱码在线观看 | 日韩av中文字幕一区| 国产日韩免费| 日韩综合在线| 黄色日韩在线| 欧美日韩在线精品一区二区三区激情综合 | 91嫩草精品| 精品视频一区二区三区在线观看 | 久久国产免费看| 国产精品久久观看| av不卡免费看| 久久国产乱子精品免费女| 国产成人免费| 亚洲欧美日韩国产一区二区| 日韩成人一级| 国产自产自拍视频在线观看| 午夜国产精品视频| 日韩有吗在线观看| www在线观看黄色| 爽爽淫人综合网网站| 国产精品一区二区中文字幕| 成人av三级| 中文字幕av亚洲精品一部二部 | 国产极品一区| 99riav国产精品| 国产精品mv在线观看| 99热国内精品| 午夜久久av | 福利一区二区免费视频 | 亚州av乱码久久精品蜜桃| 国产日韩欧美中文在线| 久久精品青草| 日韩av一二三| 日韩三区免费| 国产亚洲精品美女久久 | 久久av综合| 欧美专区18| 手机在线电影一区| 亚洲精品福利| 蜜桃视频在线网站| 日韩二区在线观看| 蜜臀久久99精品久久一区二区| 国产欧美日韩在线一区二区 | 免费人成黄页网站在线一区二区 | 欧美一区二区三区高清视频| 日韩成人午夜精品| 亚洲激情中文| 日韩欧美字幕| 国产日韩欧美三区| 在线一区二区三区视频| 日韩毛片视频| 欧美有码在线| 999在线观看精品免费不卡网站| 精品国产精品久久一区免费式 | 欧美xxxx性| 日韩一区二区三免费高清在线观看| 日韩在线观看不卡| 久久av资源| 日韩一区二区三区高清在线观看| 久久国产小视频| 福利欧美精品在线| 欧美日一区二区三区在线观看国产免| 红桃视频欧美| 亚洲天堂免费电影| 久久99高清| 欧美在线日韩| 六月婷婷一区| 亚洲精品888| 久久久777| 国产美女高潮在线观看| 国产精品一页| 亚洲a级精品| 亚洲欧美日韩视频二区| 久久久人人人| 国产成人黄色| 91欧美日韩在线| 亚洲三区欧美一区国产二区| 激情欧美亚洲| 在线人成日本视频| 成人一区而且| 精品高清久久| 国产欧美日韩精品一区二区三区| 日韩精品一区二区三区中文字幕| 国产精品社区| 亚洲欧美伊人| 美女久久久久| 不卡一区2区| 在线国产一区| 欧美精品一区二区久久| 久久蜜桃资源一区二区老牛| 日韩电影免费在线观看| 日韩综合一区二区| 日韩国产在线不卡视频| 97精品国产福利一区二区三区| 精品欧美久久| 欧美一级鲁丝片| 日本aⅴ免费视频一区二区三区| 中文字幕视频精品一区二区三区| 亚洲资源av| 蜜芽一区二区三区| 免费美女久久99| 亚洲精品美女91| 亚洲精品乱码久久久久久蜜桃麻豆| 中文一区一区三区免费在线观 | 国产理论在线| 日韩啪啪电影网| 久久精品官网| 好看的av在线不卡观看| 欧美一级专区| 日韩亚洲国产欧美| 亚洲精品无吗| 国产欧美一级| 国产精品久久久久久av公交车| 国产精品久久免费视频| 卡一精品卡二卡三网站乱码| 国内精品美女在线观看| 97精品中文字幕| 久久中文字幕av一区二区不卡| 黄色成人在线网址| 蜜桃视频在线观看一区| 视频一区中文字幕精品| 国产精品一区二区精品视频观看| 国产精品久久久亚洲一区| 精品久久亚洲| 香蕉精品久久| 免费在线观看一区二区三区| 日韩成人精品一区二区三区| 欧美激情视频一区二区三区免费| 日韩成人精品一区| 亚洲成人日韩| 日本不卡高清视频| 国产精品一在线观看| 国产999精品在线观看| 婷婷中文字幕一区| 亚洲一区二区三区无吗| 欧美日本不卡| 91综合视频| 亚洲综合国产| 国产精品亚洲综合色区韩国| 中文一区一区三区高中清不卡免费| 婷婷综合激情| 91精品日本| 国产美女高潮在线| 午夜在线视频观看日韩17c| 日韩av成人高清| 98精品视频| 亚洲毛片在线免费| 中文字幕在线看片| 性欧美长视频| 日韩va亚洲va欧美va久久| 免费亚洲婷婷| 亚洲一级黄色| 国产精品亚洲人成在99www| 色老板在线视频一区二区| 亚洲精品九九| 日本а中文在线天堂| 日韩中文字幕麻豆| 国产999精品在线观看| 亚洲久久在线| 日韩中文字幕高清在线观看| 深夜福利一区| 蜜桃av.网站在线观看| 日韩欧美2区| 久久免费高清| 国产亚洲人成a在线v网站| 香蕉精品久久| 国产精品久久久一区二区| 午夜欧美精品| 国产一区二区三区不卡av| 视频一区在线视频| 成人污污视频|