搭建服务器处理系统(基于netty)

推荐:

  google rest 一个不错的http测试应用,google浏览器可以使用。做接口什么的,很有帮助。亲,还不快了解一下。

扯淡:

  现在我算是进入一个能带着你向前走的团队,但是产品设计太扯淡,互联网应用,香港服务器,开发周期异常的短,也高估了开发的能力,赶进度的开发bug很多啊。

  如果开发只是完成任务的行动,是不会感到痛苦的。所以说:想要做好产品的开发,痛苦才刚刚开始。原因就是开发无法左右产品的设计…..

主题:

  时刻关注排行的朋友注意啦,香港空间,你们都得了排行强迫症啦,赶快找个护士就医吧。

  一个排行…..(我需要护士)

关于排名的详细:摸我

好吧,据说netty排在第一,那就学习一下吧!

更具公司很久以前的一个服务器框架代码,不断删减,然后得到一个很简单的服务器框架,分享一下。

自己画的流程图,流程比较简单,这方面比较弱,不太会用图表达:

1,启用netty

我们需要监听端口,这样就可以处理连接上来的tcp消息了。这一步netty用java 的NIO和OIO都封装了,我们自然选择NIO啦。

一下是启动服务器的代码:对于这个启动,你只要学习一下netty的手册例子,就马上明白了,它手册的例子也很好,建议大家看看。

public class Start { main(String[] args) {//ApplicationContext context = new ClassPathXmlApplicationContext(“D:/Users/dongchao/workspace/NettyTest/resources/applicationContext-task.xml”);System.out.println(“=============show time!=============”);initNetty();}tcpSendBufferSize = 32768;tcpReceiveBufferSize = 32768; initNetty(){InetSocketAddress addr = new InetSocketAddress(8989);//需要监听的端口,即tcp连接建立的端口//Executors.newCachedThreadPool()的解释://缓冲线程执行器,产生一个大小可变的线程池。//当线程池的线程多于执行任务所需要的线程的时候,对空闲线程(即60s没有任务执行)进行回收;//当执行任务的线程数不足的时候,自动拓展线程数量。因此线程数量是JVM可创建线程的最大数目。ServerSocketChannelFactory channelFactory = new NioServerSocketChannelFactory(Executors.newCachedThreadPool(),Executors.newCachedThreadPool());//It utilizes the non-blocking I/O mode which was introduced with NIO to serve many number of concurrent connections efficiently.// Creates a new group with a generated name.DefaultChannelGroup allChannels = new DefaultChannelGroup(“pushServerChannelGroup”);ServerBootstrap bootstrap = new ServerBootstrap(channelFactory);// PushServerPipelineFactory作为一个ChannelPipelineFactory产生的工厂类,我们可以把需要执行的Handler进行配置ChannelPipelineFactory pipelineFactory = new PushServerPipelineFactory(allChannels);// Whenever a new connection is accepted by the server, a new ChannelPipeline will be created by the specified ChannelPipelineFactory.// 服务器新连接建立的时候,新的ChannelPipeline会通过我们定义的ChannelPipelineFactory产生,其实是调用了getPipeline()方法。bootstrap.setPipelineFactory(pipelineFactory);if (tcpReceiveBufferSize != -1) {bootstrap.setOption(“child.receiveBufferSize”, tcpReceiveBufferSize);}if (tcpSendBufferSize != -1) {bootstrap.setOption(“child.sendBufferSize”, tcpSendBufferSize);}bootstrap.setOption(“reuseAddress”, true);bootstrap.setOption(“child.reuseAddress”, true);bootstrap.setOption(“child.keepAlive”, false);bootstrap.setOption(“child.tcpNoDelay”, true);System.out.println(” ===================netty started=====================”);Channel serverChannel = bootstrap.bind(addr);allChannels.add(serverChannel);}

PushServerPipelineFactory 其实就是配置了一下Handler,他叫pushServerCommandHandler,他的作用就是把接受到的信息放进叫receivedQueen的队列去就好了,其实就是调用了MessageManager的addSocketMessage方法。

我们看一下他的messageReceived方法就明白了,netty是事件机制的,messageReceived是重写的方法,只要是受到一个连接的消息,就会触发这个方法。

public void messageReceived(ChannelHandlerContext channelHandlerContext, MessageEvent messageEvent)throws Exception {CommandMessage command = (CommandMessage) messageEvent.getMessage();if (command.message.length() > 3) {Channel ch = channelHandlerContext.getChannel();ch.write(“———message received————-“);// 向消息队列里插消息包,通过handleMessage这个方法,// 插入的MessagePack其实已经更具消息的不同被选择成不同的子类// 我觉得这是很关键的设计,我们的业务逻辑就可以分成不同的MessagePack子类,然后实现它的onHandler方法messageManager.addSocketMessage(handleMessage(command.message, messageEvent));} else {// logger.warn(“too short message.”);}} MessagePack handleMessage(String msg, MessageEvent e) {MessagePack messagePack = null;int fid = SjsonUtil.getFIDFromMsg(msg);switch (fid) {case 25: // 调用TestCategoryMsgmessagePack = new ShowTimeMessage(msg, e.getChannel());break;case 26: // 调用不同的业务逻辑messagePack = new TestCategoryMsg(msg, e.getChannel());break;default:// logger.warn(“unknow FID=” + fid + “,raw msg=” + msg + “,client=” + e.getChannel().getRemoteAddress());}return messagePack;}

只知道心痛得滴血,都只为你。

搭建服务器处理系统(基于netty)

相关文章:

你感兴趣的文章:

标签云: