netty框架学习之初始篇---多客户端的实现
2016-10-26 23:19
387 查看
前面基础已经搞定,那么解决问题的重点来了,如何使用netty搭建一个可以识别不同客户端的server?
晚上回来经过一个多小时的奋斗,搞定了这个问题,但是我也不知道我这种方式是否有什么问题或者说方向是否正确,感觉与自己用bio写的socket似乎是一样的道理,简单的地方就是无需关注线程问题。
上代码,
这个是HelloServerHandler 的完整版,首先继承SimpleChannelInboundHandler类并覆盖其中的几个方法,代码中写的很详细,各个方法的作用就不再赘述。
详细的讲一下流程和几个细节问题,
流程:client连接到server时,首先发送一个注册id到server,比如A客户端发送“111111”这样的字符串表示其id,B客户端发送“222222”,当A连接到server发送其注册id时将其与channel存储到channelMap中,当B连接到server的时候做同样处理。此时就有两个客户端连接到了server了,那么让A发送“123”字符串,当server收到后将其发送给B。如何发送给B呢,当A发送123的时候,channelRead0方法中的channel时A的channel而不是B的,于是我们首先要拿到B的channel才能调用writer方法给B发消息,那么此时就要调用map的get方法,获取map中的channel,于是这样路就通了。
结果:
客户端使用的一个软件模拟的,这个软件可以多开,省去了写客户端的麻烦,回头上传。
细节:
此处的Map必须静态化,不然是没法存储不同的channel的。
channelMap用来存储客户端id与channel的对应关系,所谓的客户端id就是客户端的注册名称。
下一步与数据库整合,并实现后台管理(不知道是用struts2还是servlet或者spring mvc,,,选择综合症)
有时间再研究下websocket是如何实现的。。。
小弟菜鸟,有不对的地方望大神指正,另外这种区分客户端的方式如果有更简便、更高效,更牛逼的方式希望童鞋们能教导一下
爱编程,爱学习,爱挑战。
程序猿就是我,我就是程序猿。
晚上回来经过一个多小时的奋斗,搞定了这个问题,但是我也不知道我这种方式是否有什么问题或者说方向是否正确,感觉与自己用bio写的socket似乎是一样的道理,简单的地方就是无需关注线程问题。
上代码,
package com.netty.demo2; import java.net.InetAddress; import java.util.HashMap; import java.util.Map; import io.netty.channel.Channel; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; public class HelloServerHandler extends SimpleChannelInboundHandler<String> { static Map<String, Channel> channelMap = new HashMap<String, Channel>();//用于存储客户端id与channel的关系 /** * 覆盖了 channelRead0() 事件处理方法。每当从服务端读到客户端写入信息时,将信息转发给其他客户端的 Channel。 */ @Override protected void channelRead0(ChannelHandlerContext ctx, String msg) throws Exception { Channel channel = ctx.channel(); if(msg.equals("111111")||msg.equals("222222")){ channelMap.put(msg,channel); } System.out.println(ctx.channel().remoteAddress() + " Say : " + msg);// 收到消息直接打印输出 byte [] b = {0x01,0x02}; if(msg.equals("123")){ channelMap.get("222222").writeAndFlush("发送给123的信息"); }else if(msg.equals("456")){ channelMap.get("111111").writeAndFlush("发送给456的信息"); } } /** * * 覆盖 channelActive 方法 在channel被启用的时候触发 (在建立连接的时候) * * channelActive 和 channelInActive 在后面的内容中讲述,这里先不做详细的描述 * */ @Override public void channelActive(ChannelHandlerContext ctx) throws Exception { System.out.println("RamoteAddress : " + ctx.channel().remoteAddress() + " active !"); ctx.writeAndFlush( "Welcome to " + InetAddress.getLocalHost().getHostName() + " service!\n"); super.channelActive(ctx); } }
这个是HelloServerHandler 的完整版,首先继承SimpleChannelInboundHandler类并覆盖其中的几个方法,代码中写的很详细,各个方法的作用就不再赘述。
详细的讲一下流程和几个细节问题,
流程:client连接到server时,首先发送一个注册id到server,比如A客户端发送“111111”这样的字符串表示其id,B客户端发送“222222”,当A连接到server发送其注册id时将其与channel存储到channelMap中,当B连接到server的时候做同样处理。此时就有两个客户端连接到了server了,那么让A发送“123”字符串,当server收到后将其发送给B。如何发送给B呢,当A发送123的时候,channelRead0方法中的channel时A的channel而不是B的,于是我们首先要拿到B的channel才能调用writer方法给B发消息,那么此时就要调用map的get方法,获取map中的channel,于是这样路就通了。
结果:
客户端使用的一个软件模拟的,这个软件可以多开,省去了写客户端的麻烦,回头上传。
细节:
此处的Map必须静态化,不然是没法存储不同的channel的。
channelMap用来存储客户端id与channel的对应关系,所谓的客户端id就是客户端的注册名称。
下一步与数据库整合,并实现后台管理(不知道是用struts2还是servlet或者spring mvc,,,选择综合症)
有时间再研究下websocket是如何实现的。。。
小弟菜鸟,有不对的地方望大神指正,另外这种区分客户端的方式如果有更简便、更高效,更牛逼的方式希望童鞋们能教导一下
爱编程,爱学习,爱挑战。
程序猿就是我,我就是程序猿。
相关文章推荐
- netty框架学习之初始篇---多客户端的实现补充部分
- TCP-IP学习笔记八:RPC(Netty和Spring)实现webServer框架
- 基于Netty的RPC简单框架实现(一):RPC客户端
- netty框架的学习笔记 + 一个netty实现websocket通信案例
- 自定义基于netty的rpc框架(3)---客户端的实现
- Mina框架的学习笔记——Android客户端的实现
- 从今天开始学习iOS开发(iOS 7版)--实现一款App之Foundation框架的使用
- 开源学习--SlideExpandableListView中的列表项动画实现框架分析
- python3 学习-1(实现简单的服务器与客户端)
- 从今天开始学习iOS开发(iOS 7版)--实现一款App之Foundation框架的使用
- DWZ富客户端框架(jQuery RIA framework), 是中国人自己开发的基于jQuery实现的Ajax RIA开源框架.
- netty框架学习1--使用NIO创建Server
- Netty实例-简单的服务端-客户端实现,注释详细
- Java实现Restful框架Jersey学习
- 【Andorid开发框架学习】之Mina开发之客户端开发
- 【Andorid开发框架学习】之Mina开发之客户端开发
- Jquery LigerUI框架学习(二)之Tree于Tab标签实现iframe功能
- unity3d socket( unity socket )客户端通信插件-在Unity3d中的简易实现网游客户端通信框架
- Netty框架学习(一)
- Netty:一个非阻塞的客户端/服务器框架