Grizzly开发Echo服务器实战

作者:chszs,转载需注明。博客主页:http://blog.csdn.net/chszs

用Java编写可伸缩的服务器应用是有难度的,用Java NIO开发、线程管理、为成千上万的用户做服务器扩展,这些都是难点。Grizzly NIO框架的设计目标就是帮助开发者很好地利用Java NIO API,编写出高可扩展性的、功能强大的服务器,并提高了扩展的框架组件:Web Framework(HTTP/S)、WebSocket、Comet等。

Grizzly 2.3开发Echo服务器/客户端的例子

1、下载grizzly-framework.jar库

Maven依赖

<dependency><groupId>org.glassfish.grizzly</groupId><artifactId>grizzly-framework</artifactId><version>2.3.16</version>
</dependency>

或下载地址: http://central.maven.org/maven2/org/glassfish/grizzly/grizzly-framework/2.3.16/grizzly-framework-2.3.16.jar
2014.10.23日刚发布了2.3.17版,地址见: 
https://maven.java.net/content/repositories/releases/org/glassfish/grizzly/grizzly-framework/2.3.17/grizzly-framework-2.3.17.jar
也可以用这个版本。

服务器端:

1)创建Echo过滤器
Echo过滤器负责把接收到的消息(不管其类型)原样返回给Grizzly连接。

import java.io.IOException;import org.glassfish.grizzly.filterchain.BaseFilter;
import org.glassfish.grizzly.filterchain.FilterChainContext;
import org.glassfish.grizzly.filterchain.NextAction;public class EchoFilter extends BaseFilter{/*** 仅处理读操作,当消息到来时进行处理* @param ctx  处理的上下文* @return 下一个动作*/@Overridepublic NextAction handleRead(FilterChainContext ctx) throws IOException{// Peer address用于无连接的UDP连接final Object peerAddress = ctx.getAddress();final Object message = ctx.getMessage();System.out.println("Server received: " + message);ctx.write(peerAddress, message, null);return ctx.getStopAction();}
}

2)服务器初始化代码
所有的服务器过滤器链都准备好,开始初始化并启动服务器。

import java.io.IOException;
import java.nio.charset.Charset;
import java.util.logging.Logger;import org.glassfish.grizzly.filterchain.FilterChainBuilder;
import org.glassfish.grizzly.filterchain.TransportFilter;
import org.glassfish.grizzly.nio.transport.TCPNIOTransport;
import org.glassfish.grizzly.nio.transport.TCPNIOTransportBuilder;
import org.glassfish.grizzly.utils.StringFilter;public class EchoServer {private static final Logger logger = Logger.getLogger(EchoServer.class.getName());public static final String HOST = "localhost";public static final int PORT = 7777;public static void main(String[] args) throws IOException{// 用FilterChainBuilder创建过滤器链FilterChainBuilder filterChainBuilder = FilterChainBuilder.stateless();// 添加TransportFilter,它负责从连接中读数据,并写数据到连接filterChainBuilder.add(new TransportFilter());// 字符串过滤器StringFilter负责缓冲和字符串之间的转换filterChainBuilder.add(new StringFilter(Charset.forName("UTF-8")));// 过滤器EchoFilter负责把接收到的消息原样返回给连接filterChainBuilder.add(new EchoFilter());// 创建TCP传输final TCPNIOTransport transport = TCPNIOTransportBuilder.newInstance().build();transport.setProcessor(filterChainBuilder.build());try{// 绑定传输,开始对主机+端口进行监听transport.bind(HOST, PORT);// 开始传输transport.start();logger.info("Press any key to stop the Echo server...");System.in.read();} finally{logger.info("Stopping transport...");// 停止传输服务器transport.shutdown();logger.info("Stopped transport...");}}
}

运行Echo服务器:

java -classpath grizzly-framework.jar EchoServer

客户端:

1)创建客户端过滤器
客户端过滤器负责重定向服务器的响应到标准输出。要注意,客户端过滤器需要FilterChainContext消息

import java.io.IOException;import org.glassfish.grizzly.filterchain.BaseFilter;
import org.glassfish.grizzly.filterchain.FilterChainContext;
import org.glassfish.grizzly.filterchain.NextAction;public class ClientFilter extends BaseFilter{/*** 仅处理读操作,当消息到来时进行处理* @param ctx  处理的上下文* @return 下一个动作*/@Overridepublic NextAction handleRead(final FilterChainContext ctx) throws IOException{// 从上下文得到字符串消息,过滤器链只使用了字符串过滤器StringFilterfinal String serverResponse = ctx.getMessage();System.out.println("Server echo: " + serverResponse);return ctx.getStopAction();}
}

2)客户端代码
简单的客户端,向Echo服务器发送消息并等待响应。

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.nio.charset.Charset;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
import java.util.logging.Logger;import org.glassfish.grizzly.Connection;
import org.glassfish.grizzly.Grizzly;
import org.glassfish.grizzly.filterchain.FilterChainBuilder;
import org.glassfish.grizzly.filterchain.TransportFilter;
import org.glassfish.grizzly.nio.transport.TCPNIOTransport;
import org.glassfish.grizzly.nio.transport.TCPNIOTransportBuilder;
import org.glassfish.grizzly.utils.StringFilter;import ch.echo.server.EchoServer;public class EchoClient {private static final Logger logger = Grizzly.logger(EchoClient.class);public static void main(String[] args) throws IOException,ExecutionException, InterruptedException, TimeoutException{Connection connection = null;// 用FilterChainBuilder类创建过滤器链FilterChainBuilder filterChainBuilder = FilterChainBuilder.stateless();// 添加传输过滤器,它负责从连接读数据并向连接写数据filterChainBuilder.add(new TransportFilter());// 添加字符串过滤器,它负责缓冲和字符串之间的转换filterChainBuilder.add(new StringFilter(Charset.forName("UTF-8")));// 添加客户端过滤器,他负责把服务器响应重定向到标准输出filterChainBuilder.add(new ClientFilter());// 创建TCP传输final TCPNIOTransport transport = TCPNIOTransportBuilder.newInstance().build();transport.setProcessor(filterChainBuilder.build());try{// 启动传输transport.start();// 异步执行,连接到服务器Future<Connection> future = transport.connect(EchoServer.HOST, EchoServer.PORT);// 等待连接操作的完成connection = future.get(10, TimeUnit.SECONDS);assert connection!=null;System.out.println("Ready...(\"q\" to exit");final BufferedReader inReader = new BufferedReader(new InputStreamReader(System.in));do{final String userInput = inReader.readLine();if(userInput==null || "q".equals(userInput))break;connection.write(userInput);} while(true);} finally{// 关闭客户端连接if(connection!=null)connection.close();// 停止传输transport.shutdownNow();}}
}

运行Echo客户端:

java -classpath grizzly-framework.jar EchoClient

已经通过测试,程序运行的非常完美。

Grizzly开发Echo服务器实战相关推荐

  1. Linux 高并发服务器实战 - 2 Linux多进程开发

    Linux 高并发服务器实战 - 2 Linux多进程开发 进程概述 概念1: 概念2: 微观而言,单CPU任意时刻只能运行一个程序 并发:两个队列交替使用一台咖啡机 并行:两个队列同时使用两台咖啡机 ...

  2. 【slighttpd】基于lighttpd架构的Server项目实战(4)—简单的echo服务器

    转载地址:https://blog.csdn.net/jiange_zh/article/details/50636536 在这一部分,我们将对上一篇中的master-worker进行拓展,成为一个简 ...

  3. Netty实战:Springboot+Netty+protobuf开发高性能服务器 (附源码下载)

    Springboot-cli 开发脚手架系列 Netty系列:Springboot使用Netty集成protobuf开发高性能服务器 文章目录 Springboot-cli 开发脚手架系列 简介 1. ...

  4. 敏捷开发与 DevOps 实战

    点击观看大咖分享 随着互联网.移动互联网的浪潮,软件工程从瀑布到敏捷发生了巨大的变化,服务器架构也从 IOE 演变到微型机,又发展为云计算,运维成本越来越低,持续部署逐渐流行起来.本课程主要讲解敏捷开 ...

  5. Linux 高并发服务器实战 - 1 Linux系统编程入门

    Linux 高并发服务器实战-1Linux系统编程入门 在本机和服务器端设置公共密钥(配置免密登录) 在本机cmd里输入 ssh-keygen -t rsa,生成本机的公密钥 在服务器端里也配置 ss ...

  6. 《Python爬虫开发与项目实战》——第3章 初识网络爬虫 3.1 网络爬虫概述

    本节书摘来自华章计算机<Python爬虫开发与项目实战>一书中的第3章,第3.1节,作者:范传辉著,更多章节内容可以访问云栖社区"华章计算机"公众号查看 第3章 初识网 ...

  7. 《Python爬虫开发与项目实战》——第1章 回顾Python编程 1.1 安装Python

    本节书摘来自华章计算机<Python爬虫开发与项目实战>一书中的第1章,第1.1节,作者:范传辉著,更多章节内容可以访问云栖社区"华章计算机"公众号查看 第1章 回顾P ...

  8. Nginx高性能Web服务器实战教程PDF

    网站 更多书籍点击进入>> CiCi岛 下载 电子版仅供预览及学习交流使用,下载后请24小时内删除,支持正版,喜欢的请购买正版书籍 电子书下载(皮皮云盘-点击"普通下载" ...

  9. 2018个人年度总结:我是如何从嵌入式开发到服务器开发对接天猫精灵、小爱智能音箱服务器!懵懂 | 奋斗 | 进阶 | 信心

    文章目录 一.个人总结? 二.步入职场那些事. 2.1 大学项目引起兴趣. 2.2 第一次面试. 二.职业发展的奠基石------ 机智云. 三.嵌入式开发.移动开发.服务器开发. 3.1.嵌入式开发 ...

最新文章

  1. 【matlab】第三章数组和数组的运算
  2. 鸿蒙智慧屏和pro有什么区别,体验揭秘荣耀智慧屏pro评测怎么样?荣耀智慧屏pro和普通版区别有什么不同?...
  3. 不平等加剧与问责机制:纽约大学AI Now研究所2018 AI现状报告 | 报告
  4. poj 1088 滑雪 详解
  5. 北京XXX学院WLAN项目现场勘查报告
  6. [Leedcode][JAVA][第466题][统计重复个数][数组]
  7. Failed to find Build Tools revision 26.0.1
  8. delphi idtcpclient 发送十六进制00_91413足球推荐分析 法甲 04:00 南特 VS 巴黎圣日尔曼...
  9. 学习三层结构心得(一)
  10. Alos 12.5米DEM免费下载教程、高精度DEM数据、土地利用数据、植被类型分布数据、建筑轮廓分布数据
  11. 数学女孩-伽罗瓦理论读书笔记尺规作图
  12. 9008刷机教程oppo_OPPO手机解锁教程
  13. DB数据库密码怎么破啊~~~求高手帮忙解决下~
  14. 一位优秀的学弟,计算机2019保研经历分享(北大信科、清华计算机系)
  15. google身份验证器
  16. hadoop快速自我学习--hadoop平台管理与维护
  17. 搭建前端错误监控系统
  18. USB OTG的工作原理
  19. 基于Netty的聊天系统(三)协议定制----消息篇
  20. Python零代码小游戏 · FreeGames

热门文章

  1. 硬件钱包linux安装,使用Trezor硬件钱包管理Omni版USDT教程
  2. 三推形态,一种常用的K线形态
  3. 20160209.CCPP体系详解(0019天)
  4. App推广经验|优派网助你了解读如何从零开始做好校园推广。
  5. 指责贝克汉姆的人,你们该闭嘴了.
  6. 树莓派搭WEB控制点灯(微信点灯,网页控制电机等)
  7. VMware ESXi安装NVIDIA GRID驱动
  8. Python3 将中文文件变成英文文件
  9. 董事长、总裁、CEO的区别
  10. 构造函数可以是虚函数吗?不看看你就亏大了