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

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


目录
相关文章
|
6天前
|
存储 人工智能 自然语言处理
ChatMCP:基于 MCP 协议开发的 AI 聊天客户端,支持多语言和自动化安装 MCP 服务器
ChatMCP 是一款基于模型上下文协议(MCP)的 AI 聊天客户端,支持多语言和自动化安装。它能够与多种大型语言模型(LLM)如 OpenAI、Claude 和 OLLama 等进行交互,具备自动化安装 MCP 服务器、SSE 传输支持、自动选择服务器、聊天记录管理等功能。
66 14
ChatMCP:基于 MCP 协议开发的 AI 聊天客户端,支持多语言和自动化安装 MCP 服务器
|
14天前
|
存储 监控 调度
云服务器成本优化深度解析与实战案例
本文深入探讨了云服务器成本优化的策略与实践,涵盖基本原则、具体策略及案例分析。基本原则包括以实际需求为导向、动态调整资源、成本控制为核心。具体策略涉及选择合适计费模式、优化资源配置、存储与网络配置、实施资源监控与审计、应用性能优化、利用优惠政策及考虑多云策略。文章还通过电商、制造企业和初创团队的实际案例,展示了云服务器成本优化的有效性,最后展望了未来的发展趋势,包括智能化优化、多云管理和绿色节能。
|
28天前
|
安全 开发工具 Swift
Swift 是苹果公司开发的现代编程语言,具备高效、安全、简洁的特点,支持类型推断、闭包、泛型等特性,广泛应用于苹果各平台及服务器端开发
Swift 是苹果公司开发的现代编程语言,具备高效、安全、简洁的特点,支持类型推断、闭包、泛型等特性,广泛应用于苹果各平台及服务器端开发。基础语法涵盖变量、常量、数据类型、运算符、控制流等,高级特性包括函数、闭包、类、结构体、协议和泛型。
29 2
|
2月前
|
机器学习/深度学习 弹性计算 运维
云计算系列之阿里云ECS服务器管理实战
本文档介绍了阿里云ECS(Elastic Compute Service)的基本概念、实例管理、磁盘操作、快照与镜像功能及其应用场景,最后通过具体案例解析ECS的实际应用。ECS是阿里云提供的高效、可靠的云计算服务,支持多种业务需求,如Web应用、高并发网站、数据库等,帮助企业快速构建稳定安全的应用,提升运维效率,降低IT成本。文档还详细说明了ECS实例的创建方式、连接方法及日常管理操作,帮助用户更好地利用ECS服务。
82 2
云计算系列之阿里云ECS服务器管理实战
|
1月前
|
关系型数据库 API 数据库
后端开发的艺术:从零到一构建高效服务器
在数字化时代,后端开发是支撑现代互联网应用的基石。本文旨在探讨后端开发的核心概念、关键技术以及如何构建一个高效的服务器。我们将从基础的编程语言选择开始,逐步深入到数据库设计、API开发和性能优化等关键领域。通过实际案例分析,我们将揭示后端开发的复杂性和挑战性,同时提供实用的解决方案和最佳实践。无论你是初学者还是有经验的开发者,这篇文章都将为你提供宝贵的见解和启发。
|
2月前
|
网络安全 Docker 容器
VScode远程服务器之远程 远程容器 进行开发(五)
VScode远程服务器之远程 远程容器 进行开发(五)
45 1
|
2月前
|
NoSQL PHP Redis
布谷语音app源码服务器环境配置及技术开发语言
布谷语音app源码服务器环境配置及技术语言研发。。
|
2月前
|
Kubernetes 网络安全 容器
VScode远程服务器进行开发(三)
VScode远程服务器进行开发(三)
46 0
|
3天前
|
弹性计算 运维 安全
阿里云轻量应用服务器与ECS的区别及选择指南
轻量应用服务器和云服务器ECS(Elastic Compute Service)是两款颇受欢迎的产品。本文将对这两者进行详细的对比,帮助用户更好地理解它们之间的区别,并根据自身需求做出明智的选择。
|
4天前
|
SQL 弹性计算 安全
阿里云上云优选与飞天加速计划活动区别及购买云服务器后续必做功课参考
对于很多用户来说,购买云服务器通常都是通过阿里云当下的各种活动来购买,这就有必要了解这些活动的区别,同时由于活动内的云服务器购买之后还需要单独购买并挂载数据盘,还需要设置远程密码以及安全组等操作之后才能正常使用云服务器。本文就为大家介绍一下目前比较热门的上云优选与飞天加速计划两个活动的区别,以及通过活动来购买云服务器之后的一些必做功课,确保云服务器可以正常使用,以供参考。