网络聊天室战斗
发布时间:2019-08-20 20:29:32
作者:xhs
阅读:854
网络聊天室战斗:('\n其中第一个是聊天室,聊天室是最容易实现的部分。也是IM结构中最简单的一部分,其次是单聊和群聊,业务逻辑一层一层的增加,但并不复杂,彻底取聊天室代码,高级单聊和群聊非常简单。\n\n如果纯粹想实现聊天室很简单,但我需要为了便于理解,我会尽量把整个过程都进行下去。\n它主要由两个功能类实现:初始化类和响应处理类\n0。准备\n添加POM。xml \n\ntyio.net.\nnetty-all.\n4.1.2.最后一个 \n\n\n1。辅助接口实现\n\n辅助接口使服务体系结构更清晰。有两个接口,一个用于HTTP请求,一个用于Webocket请求。\n\nmyHTTP服务。与此请求相关的接口。Java\N/**N*处理WebSoCults请求\n*/\Nub接口MyWebSoCultService {\nValb手帧(ChhannHealLeRealEngultCCTX,WebSoSkFraseFrand框架);\n}\n\nSO问题是,谁实现这两个类,处理这两个请求的分发。\Nee Service RESPONSE处理类别:WebSocketServerHandler。Java\N2。请求处理类\n\n继承了SimpleChannelInboundHandler类,Realize ChannelRead0 HandlerAdded()()HandlerRemoved ExceptionCatch()()方法,是我们进行某些标记和后续处理的首选方法、其他方法。\n\nWebSocketServerHandler。Java\n@ SLF4J\Nub类WebSoCKServer处理程序扩展了SimeChhanNeLimeDebug处理程序<对象> {N\MyHythpService HTTPService .\NBuyMyWebSoCultService WebSoCultService;\N\Nealstatic ChannChansChansChans=新Debug通道组(GualLeJavaeExcRetuor)。instance);\n\npublic websocketServerHandler(myhttpservice httpservice,mywebsocketservice websocketservice)\nsuper();\nencolling httpservice=httpservice;\nencolling websocketservice=websocketservice;\n \n\n@override\nthrows exception protected void channelread0(channelhandlerContext ctx,object msg)引发异常\nif(msg instanceof fullhttprequest)\nhttpservice。handlehtprequest(ctx,(fullhttprequest)msg);\nelse if(msg instanceof websocketframe)\nwebsocketservice。handleframe(ctx,(websocketframe)msg);\n \n \n \n \n@override \n throws exception public void handlerAdded(channelhandlerContext ctx)throws exception \nchannels。添加(CTX)通道());\n通道。writeandflush(new textWebSocketFrame(ctx.channel()+“channels are online”));\n \n\n@override\nthroows exception public void handlerRemoved(channelhandlerContext ctx)throws exception \nchannels。删除(CTX)通道());\n通道。writeandflush(new textWebSocketFrame(ctx.channel()+“channel off”));\n \n\n/**\n*发生异常时处理异常\n*/\n@override\n throws exception public void exceptioncatched(channelhandlerContext ctx,throwable cause)引发异常\nchannels。删除(CTX)通道());\nctx。close();\nlog.info(“exception info:”,cause.getmessage());\n \n \n \n \n创建channelgroup以在handlerAdded()方法channels.add(ctx.channel())中保存已连接的每个通道;在handlerRemoved方法中删除。\n在channelread0()方法中,请求识别和sep实现了相关处理。\n\n发生异常时使用了exceptioncatched()方法。\n\n3。初始化类实现\n@slf4j\npublic class websocketserver实现myhttpservice,mywebsocketservice \n \n \n \n/**\n*握手变量\n*/\n私有静态最终attributekeyattr_hand_shaker=attributekey。newinstance(“attr_key_channel_id”);\n\n private static final int max_content_length=65536;\n\n/**\n*请求类型常量\n*/\n private static final string websocket_upgrade=“websocket”;\n private static final string websocket_connection=“upgrade”;\n private static final string websocket_ri_root_pattern=“ws://%s:%d”;\n\n/**\n*用户字段\n*/\n private string host;\n private int port;\n\n/**\n*保存所有连接\n*/\n private mapchannelmap=new hashmap<>();\n private final string websocket_uri_root;\n\n public websocketserver(string host,int port)\nthis.主机=主机;\n此。port=port;\n//将IP和端口格式分配给uri\n websocket_uri_root=string.format(websocket_uri_root_pattern,host,port);\n \n \npublic void the start()\n//实例化NIO侦听事件池\nEventLoopGroup bossGroup=new nioEventLoopGroup();\n//实例化NIO WWorker线程池\nEventLoopGroup workerGroup=new nioEventLoopGroup();\n//starter\nserbootstrap boo'、'6c9967fa458c0683'、'932ed2czzhbujmcgi7ftbe5zgeq5qc1v',1,'tstrap=new serverbootstrap();\n引导。group(bossgroup workergroup);\n引导程序。通道(nioserversocketchannel.类);\n引导程序。childhandler(new channelinitializer()\n@override\n throws exception protected void initchannel(channel channel)throws exception \nchannelpipeline pl=channel.管道();\n//将通道保存到映射\n通道映射。放置(通道。ID(),频道)。\n信息(“new channel”,频道);\n频道。close future(.)addlistener((channelfuturelistener)channelfuture->\n信息(“channel close future”,channelfuture);\n关闭channel map后从映射中删除。移除(通道未来。频道()。ID());\n);\n//添加http codec\npl。addlast(new httpservercodec());\n//聚合器\npl。addlast(new httpobjectaggregator(max_content_length));\n//支持大数据流\npl。addlast(new chunkedwritehandler());\n//设置WebSocket服务处理\npl。addlast(新的WebSocketServerHandler(WebSocketServer)。这是WebSocketServer。this));\n \n);\n/**\n*在实例化之后,需要完成端口绑定\n*/\ntry \n channelfuture channelfuture=bootstrap.bind(主机,端口)。addListener((channelFutureListener)channelFuture1->\nif(channelFuture1 issueccess())\n信息(“websocket started”);\n \n)。同步();\n频道未来。channel(.)closefuture()addlistener((channelfuturelistener)channelfuture12->\nlog.info(“server channel closed.”,channelfuture12.channel()).\n匹配(interruptedException e)\ne.p rintstacktrace();\nssystem.out.println(“绑定端口失败”);\n finally \nbossGroup。优雅地关闭();\n工作组。正常关闭();\n \n信息(“websocket shutdown”);\n \n \n@override \npublic void handlehtprequest(channelhandlerContext ctx,fullhttpRequest request)\n//确定它是否是套接字请求\n如果(iswebsocketupgrade(request))\n//如果是websocket请求\nlog.info(“request is websocket协议);\n//获取子协议\n发送子协议=请求头()。获取(httpheadername)。sec_websocket_protocol);\n//握手工厂设置uri+protocol+不允许扩展\nwebsocketServerHandshakerFactory handshakerFactory=new websocketServerHandshakerFactory(websocket_uri_root subtocols,false);\n//实例化工厂的握手请求\nwebsocketServerHandshaker handshaker=握手工厂。newhandshaker(request);\nif(handshaker==null)\n//握手失败:不支持协议\nWebSocketServerHandshakerFactory。sendunSupportedVersionResponse(CTX)channel());\n else \n//对请求的响应:channel移交握手者\n。握手(CTX)通道(),请求)。\n//将通道绑定到握手器\n ctx。频道()。ATTR(ATTR-Hand-Shaker)。set(handshaker);\n \n return;\n else \n//不处理http请求\nlog.info(“不处理http请求”);\n \n \n \n@override \npublic void handle frame(channelhandlerContext CTX,websocketframe frame)\n/**\n*文本帧处理程序\n*/\nif(textwebsocketframe的帧实例)\nstring text=(textWebSocketFrame)frame).text();\textWebSocketFrame textWebSocketFrame=new textWebSocketFrame(text);\nlog.info(“从频道接收textWebSocketFrame:”,ctx.channel(),channelmap.size());\n//发送到其他频道(组聊天功能):(频道ch:频道映射值)s())\nif(ch.equals(ctx)channel())\n continue;\n \n//写出文本框\nch。写入和刷新(textwebsock、'6c9967fa458c0683'、'932ed2czhbujmcgi7ftbe5zgeq5qc1v',1)、'6c9967fa458c0683'、'932ed2czhbujmcgi7ftbe5zgeq5qc1v',1,('etframe);\nlog.info(“消息发送到”,ch);\n信息(“写入文本到频道:”,textwebsocketframe,ctx)频道());\n \n返回;\n}\ n/**\n*ping帧,reply pong帧\n*/\nif(pingWebSocketFrame的帧实例)\nlog.info(“receive pingWebSocket from channel:”,ctx.channel());\nctx。地震道(.)写入和刷新(新PongWebSocketFrame(帧)。内容()。retain());\n返回;\n \n/**\n长帧,不执行任何操作\n*/\nif(pongwebsocket frame的帧实例)\nlog.info(“receive pongwebsocket from channel:”,ctx.channel());\n返回;\n \n/**\n*关闭帧,关闭帧\n*/\nif(closewebsocketframe的帧实例)\nlog.info(“receive closewebsocketframe from channel:“,ctx.channel());\n//获取握手信息\nwebsocketserverHandshaker handshaker=ctx。频道()。ATTR(ATTR-Hand-Shaker)。get();\nif(handshaker==null)\nlog。错误(“channel:has no handshaker”,ctx.channel());\n返回值;\n \nhandshaker。关闭(CTX)通道(),((CloseWebSocketFrame)帧)。retain());\n返回;\n \n/**\n*其余为二进制帧,ignore \n*/\nlog.warn(“接收二进制帧,ignore to handle”);\n \n\n/**\n*确定它是否为WebSocket请求\n*/\n private boolean isWebSocketupgrade(fullhttprequest req)\nhttpheaders headers=req。头();\n返回请求。方法(.)等于(httpmethod。获取\n和标题。获取(httpheadername。升级)。包含(websocket_upgrade)标题。获取(httpheadername。连接)。contains(websocket_connection);\n \n \n \n \n \nl.a.ddlas网络聊天室战斗
版权声明:本文内容由互联网用户投稿整理编辑发布,不拥有所有权,不承担应有相关法律责任。如果文章、图片有涉嫌抄袭的内容,请发送到邮箱举报,且提供抄袭的相关证据,一但查实,会在24小时删除涉嫌侵权内容。
猜您喜欢
想知道女生是不是喜欢你,教用一个问题测试她喜欢你的方法:你可以对她说一句话:你好像长胖了一点?(看看女生是什么反应。不过如果男生问出这个问题,可能让女生觉得你情商低,就算女生喜欢你也有一定的风险性)
2024-02-20
如果男生犯了错惹女朋友生气,那就一定要想办法哄好她,因为是你错了呀。而想要哄好生气的女朋友,那你一定要认识到自己的错误,下面给大家分享惹女朋友生气检讨书1000字,希望能够帮助你哄好你的女朋友。
2024-02-19
如果女朋友说分手后做朋友是什么意思呢?如果是还爱着对方那就不应该选择分手,如果是不爱了那大家就应该彻底断了联系,真正深爱过的人是不可能在分手后做朋友的。下面就来分析女朋友的心理。
2024-02-18
脱单神器
安卓版蜜小助APP
iOS版蜜小助APP
20W+可复制撩妹话术
实战案例+话术+视频+教程
热门聊天攻略
聊天开车的污句子 聊到脸红心跳
2019-11-15
213341
高情商女生撩男生的聊天记录 妹子快学起来吧
2020-02-03
193242
男生问你是哪里人怎么幽默的回答?
2019-12-02
130356
和已婚女人怎么聊湿的一些话 ***话连篇
2019-10-21
122591
521个对不起我错了复制 这样道歉太有分量了
2020-06-18
111532
如何礼貌的问对方姓名 这样让人心生好感
2020-02-06
102881
别人问你怎么了怎么幽默回复?
2020-04-17
100596
卖东西微信群幽默开场白 让你幽默感爆棚
2019-12-04
95488
女生说啧啧啧神回复 别慌朋友淡定应对
2020-03-26
73728
网恋每晚都要聊污的吗?其实还可以这样维系感情
2020-02-18
72793