Grizzly开发Echo服务器实战

简介: 版权声明:本文为博主chszs的原创文章,未经博主允许不得转载。 https://blog.csdn.net/chszs/article/details/40426723 Grizzly开发Echo服务器实战作者:chszs,转载需注明。
版权声明:本文为博主chszs的原创文章,未经博主允许不得转载。 https://blog.csdn.net/chszs/article/details/40426723

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 下一个动作
	 */
	@Override
	public 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 下一个动作
	 */
	@Override
	public NextAction handleRead(final FilterChainContext ctx) throws IOException{
		// 从上下文得到字符串消息,过滤器链只使用了字符串过滤器StringFilter
		final 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

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


目录
相关文章
|
2月前
|
机器学习/深度学习 弹性计算 运维
云计算系列之阿里云ECS服务器管理实战
本文档介绍了阿里云ECS(Elastic Compute Service)的基本概念、实例管理、磁盘操作、快照与镜像功能及其应用场景,最后通过具体案例解析ECS的实际应用。ECS是阿里云提供的高效、可靠的云计算服务,支持多种业务需求,如Web应用、高并发网站、数据库等,帮助企业快速构建稳定安全的应用,提升运维效率,降低IT成本。文档还详细说明了ECS实例的创建方式、连接方法及日常管理操作,帮助用户更好地利用ECS服务。
73 2
云计算系列之阿里云ECS服务器管理实战
|
1月前
|
关系型数据库 API 数据库
后端开发的艺术:从零到一构建高效服务器
在数字化时代,后端开发是支撑现代互联网应用的基石。本文旨在探讨后端开发的核心概念、关键技术以及如何构建一个高效的服务器。我们将从基础的编程语言选择开始,逐步深入到数据库设计、API开发和性能优化等关键领域。通过实际案例分析,我们将揭示后端开发的复杂性和挑战性,同时提供实用的解决方案和最佳实践。无论你是初学者还是有经验的开发者,这篇文章都将为你提供宝贵的见解和启发。
|
2月前
|
网络安全 Docker 容器
VScode远程服务器之远程 远程容器 进行开发(五)
VScode远程服务器之远程 远程容器 进行开发(五)
38 1
|
2月前
|
Java PHP
PHP作为广受青睐的服务器端脚本语言,在Web开发中占据重要地位。理解其垃圾回收机制有助于开发高效稳定的PHP应用。
【10月更文挑战第1天】PHP作为广受青睐的服务器端脚本语言,在Web开发中占据重要地位。其垃圾回收机制包括引用计数与循环垃圾回收,对提升应用性能和稳定性至关重要。本文通过具体案例分析,详细探讨PHP垃圾回收机制的工作原理,特别是如何解决循环引用问题。在PHP 8中,垃圾回收机制得到进一步优化,提高了效率和准确性。理解这些机制有助于开发高效稳定的PHP应用。
49 3
|
2月前
|
NoSQL PHP Redis
布谷语音app源码服务器环境配置及技术开发语言
布谷语音app源码服务器环境配置及技术语言研发。。
|
2月前
|
Kubernetes 网络安全 容器
VScode远程服务器进行开发(三)
VScode远程服务器进行开发(三)
44 0
|
3月前
|
网络协议
keepalived对后端服务器的监测方式实战案例
关于使用keepalived进行后端服务器TCP监测的实战案例,包括配置文件的编辑和keepalived服务的重启,以确保配置生效。
69 1
keepalived对后端服务器的监测方式实战案例
|
3月前
|
开发框架 JavaScript 前端开发
|
15天前
|
人工智能 弹性计算 编解码
阿里云GPU云服务器性能、应用场景及收费标准和活动价格参考
GPU云服务器作为阿里云提供的一种高性能计算服务,通过结合GPU与CPU的计算能力,为用户在人工智能、高性能计算等领域提供了强大的支持。其具备覆盖范围广、超强计算能力、网络性能出色等优势,且计费方式灵活多样,能够满足不同用户的需求。目前用户购买阿里云gpu云服务器gn5 规格族(P100-16G)、gn6i 规格族(T4-16G)、gn6v 规格族(V100-16G)有优惠,本文为大家详细介绍阿里云gpu云服务器的相关性能及收费标准与最新活动价格情况,以供参考和选择。
|
20天前
|
机器学习/深度学习 人工智能 弹性计算
什么是阿里云GPU云服务器?GPU服务器优势、使用和租赁费用整理
阿里云GPU云服务器提供强大的GPU算力,适用于深度学习、科学计算、图形可视化和视频处理等多种场景。作为亚太领先的云服务提供商,阿里云的GPU云服务器具备灵活的资源配置、高安全性和易用性,支持多种计费模式,帮助企业高效应对计算密集型任务。