网络聊天室战斗
发布时间:2019-08-20 20:29:32
作者:xhs
网络聊天室战斗:('\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小时删除涉嫌侵权内容。
热门推荐
1
聊天开车的污句子 聊到脸红心跳
在和自己喜欢的人聊天的时候,总会觉得这些话都不能表达自己的内心的想法,今天小编给大家分享聊天开车的污句子,聊到脸红心跳。彼此心里都知道对方的心意,说这样的一句话既不会尴尬还不失有点小情调的感觉。快来看淘网和小编一起学习聊天开车的污句子吧!
2
高情商女生撩男生的聊天记录 妹子快学起来吧
很多女生不懂得怎么撩男生,在和男生聊天的过程中很难让男生心动,其实你只是缺少了一些聊天经验,不如就一起来看看高情商女生撩男生的聊天记录,一定能够帮到你。
3
男生问你是哪里人怎么幽默的回答?
有的时候碰到男生问你一些个人问题,要怎么幽默的回答呢?例如:男生问你是哪里人怎么幽默的回答?如果这个男生正好是你喜欢的对象,那么可以说我是你的心上人呀!但如果不是,那么直接说自己来自哪个省就好了,面对男生的提问,女生如果能够幽默的回答,对于关系的发展会更好哦!下面就和看淘网一起看看各种问题如何幽默的回答吧!
4
和已婚女人怎么聊湿的一些话 ***话连篇
繁星点点跨越银河能否与你相见?看淘网推荐和已婚女人怎么聊湿的一些话。不怕遥远只盼此刻在你身边。往事如烟魂牵梦萦增添我的思念,追寻万年今生情缘不变。一起欣赏一下吧!
5
521个对不起我错了复制 这样道歉太有分量了
你尝试过连续道歉521遍吗?521个对不起我错了的道歉,她会感动吧?521个对不起我错了复制送给你,这样道歉太有分量了。
6
如何礼貌的问对方姓名 这样让人心生好感
在日常生活中,我们要认识一个人首先得知道对方的姓名,可是也不能直接问你叫啥,这样会让对方对你减分,那么如何礼貌的问对方姓名呢,接下来就一起来看看怎么礼貌的问对方姓名吧。