`

基于netty的echo server和echo client

阅读更多
既然学了netty自然需要实验下,自然自己就简单实验下。
这个是简版的,所以比较粗糙。


package study.netty;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import io.netty.bootstrap.ServerBootstrap;
import io.netty.channel.Channel;
import io.netty.channel.ChannelFuture;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.nio.NioServerSocketChannel;

public class EchoServer {

	private static final Logger LOGGER = LoggerFactory.getLogger(EchoServer.class);

	private int port;

	public EchoServer(int port) {

		this.port = port;
	}
	
	public static void main(String... args) {
		
		EchoServer echoServer = new EchoServer(12345);
		echoServer.start();
	}

	public void start() {

		NioEventLoopGroup bossGroup = new NioEventLoopGroup(), 
				workerGroup = new NioEventLoopGroup();
		try {
			ServerBootstrap bootstrap = new ServerBootstrap();
			bootstrap.group(bossGroup, workerGroup)
					.channel(NioServerSocketChannel.class)
					.localAddress(port)
					.childHandler(new ChannelInitializer<Channel>() {
						
						@Override
						protected void initChannel(Channel ch) throws Exception {
							
							ch.pipeline().addLast(new EchoServerHandler());
						}
					});

			ChannelFuture f = bootstrap.bind().sync();
			System.out.println(EchoServer.class.getName() + " started and listen on " + f.channel().localAddress());
			f.channel().closeFuture().sync();
		} catch (InterruptedException e) {
			
			LOGGER.error(e.getMessage());
		} finally {
			
			try {
				workerGroup.shutdownGracefully().sync();
				bossGroup.shutdownGracefully().sync();
			} catch (InterruptedException e) {
				
				LOGGER.error(e.getMessage());
			}
		}
	}
}




不过没其他原因的话,最好还是用SimpleChannelInboundHandler吧,毕竟池化的bytebuf虽然性能好,但是自己手动维护难免错误。
package study.netty;

import java.nio.charset.StandardCharsets;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import io.netty.channel.ChannelFutureListener;
import io.netty.channel.ChannelHandler.Sharable;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;

@Sharable
public class EchoServerHandler extends ChannelInboundHandlerAdapter {
	
	private static final Logger LOGGER = LoggerFactory.getLogger(EchoServerHandler.class);
	
	@Override
	public void channelActive(ChannelHandlerContext ctx) throws Exception {
		
		super.channelActive(ctx);
	}

	@Override
	public void channelRead(ChannelHandlerContext ctx, Object msg) {

		ByteBuf byteBuf = (ByteBuf) msg;
		LOGGER.info("echo server receive msg:{}", byteBuf.toString(StandardCharsets.UTF_8));
		ctx.write(msg);
	}

	@Override
	public void channelReadComplete(ChannelHandlerContext ctx) {

		ctx.writeAndFlush(Unpooled.EMPTY_BUFFER).addListener(ChannelFutureListener.CLOSE);
	}

	@Override
	public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {
		cause.printStackTrace();
		ctx.close();
	}
}



package study.netty;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import io.netty.bootstrap.Bootstrap;
import io.netty.channel.Channel;
import io.netty.channel.ChannelFuture;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.nio.NioSocketChannel;

public class EchoClient {

	private final Logger logger = LoggerFactory.getLogger(getClass());
	
	private static String host = "127.0.0.1";
	private static int port = 12345;
	
	public static void main(String[] args) {
		
		EchoClient client = new EchoClient();
		client.start();
	}
	
	public void start() {
		
		NioEventLoopGroup nelg = new NioEventLoopGroup();
		try {
			
			Bootstrap bootstrap = new Bootstrap();
			bootstrap.group(nelg)
			.channel(NioSocketChannel.class)
			.remoteAddress(host, port)
			.handler(new ChannelInitializer<Channel>() {

				@Override
				protected void initChannel(Channel ch) throws Exception {
					
					ch.pipeline().addLast(new EchoClientHandler());
				}
			});
			
			ChannelFuture future = bootstrap.connect().sync();
			future.channel().closeFuture().sync();
			
		} catch (InterruptedException e) {
			
			e.printStackTrace();
		} finally {
			
			try {
				nelg.shutdownGracefully().sync();
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}
}


package study.netty;

import java.nio.charset.StandardCharsets;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler;

public class EchoClientHandler extends SimpleChannelInboundHandler<ByteBuf> {

	private final Logger logger = LoggerFactory.getLogger(getClass());

	@Override
	public void channelActive(ChannelHandlerContext ctx) {

		ctx.writeAndFlush(Unpooled.copiedBuffer("client short msg", StandardCharsets.UTF_8));
	}

	@Override
	public void channelRead0(ChannelHandlerContext ctx, ByteBuf msg) throws Exception {

		logger.info("client received:{}", msg.toString(StandardCharsets.UTF_8));
	}

	@Override
	public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {
		
		logger.error(cause.getMessage());
		ctx.close();
	}

}
分享到:
评论

相关推荐

    Netty4EchoDemo

    Netty4EchoDemo是一个基于Netty 4框架实现的简单回显客户端(echo client)和服务器(echo server)示例。这个项目适用于那些想要学习如何使用Netty进行网络编程的开发者,尤其是对Java NIO(非阻塞I/O)感兴趣的...

    Netty_Chat_server_client_src_java.zip_netty_netty html5 chat_sep

    在这个"Netty_Chat_server_client_src_java.zip"压缩包中,包含了一个基于Netty实现的简单聊天应用的源代码,分为服务器(server)和客户端(client)两部分。 首先,我们来看"server"部分。Netty服务器端通常由多个...

    netty入门Demo源码

    使用:先运行UserServer,在运行UserClient。成功连接后,服务器发送一个User对象给客户端。输出到客户端控制台 5.第四个示例 com.user_1 Netty将java对象作为数据的发送与接收升级版。将数据的预处理模块化提炼...

    netty 官方文档

    - **回声服务 (Echo Server):**该示例展示了如何创建一个服务器端程序,它接收到客户端发送的数据后原样返回。 - **时间服务 (Time Server):**此示例更进一步,服务器不仅接收数据,还会根据客户端请求发送当前...

    netty-3.2.5终极手册

    - **Echo Server**:与丢弃服务器不同,回声服务器会将接收到的数据原样返回给客户端。 - **Time Server**:时间服务器接收客户端请求后返回当前的时间戳。 - **Time Client**:与时间服务器配对使用的客户端程序,...

    高性能网络通信框架Netty从入门到核心源码剖析.rar

    2. 快速启动:通过编写一个简单的Echo Server和Client,展示Netty的基本使用,包括Bootstrap、ServerBootstrap、Channel、Handler等关键概念。 3. 事件驱动模型:解释Netty的NIO(非阻塞I/O)事件模型,包括...

    【打天下篇】Netty实战.zip

    # Netty 实战 第二章节 ...echo server \ client by netty nio socket ``` # 启动 ``` server 端启动设置 端口 java -jar xxx.jar 9090 client 端启动设置 目标地址 目标端口 java -jar xxx.jar localhost 9090 ```

    java-netty:netty框架例子代码

    在实际应用中,`java-netty-master` 可能包含了简单的服务器和客户端示例,如 Echo Server(服务器接收并回显客户端发送的数据)和 Time Client(客户端向服务器请求当前时间)。通过这些例子,你可以学习如何配置 ...

    netty参考文档

    3. **时间服务器与客户端**(Writing a Time Server and Client):实现一个 TCP 服务器与客户端,服务器端接收请求并返回当前时间。 4. **处理流式传输**(Dealing with a Stream-based Transport):针对 TCP 连接...

    jreactive-8583:适用于ISO8583和Netty的Java客户端和服务器

    解决方案: “ J-Reactive-8583” ISO8583客户端和服务器基于进行编码/解码, 出色的异步消息传递框架构建。 它根据Apache License 2.0分发。 支持的功能 客户端和服务器端点。 Java 11+ 使用库支持ISO8583消息。 ...

    一款Android平台UDP双向通信源码

    在Android Echo Client UDP项目中,我们可能找到了以下组件和概念: 1. **DatagramSocket**:UDP通信的核心组件,它用于发送和接收数据报(datagrams)。在这个客户端中,DatagramSocket创建并配置以连接到服务器的...

    DotNetty_Test.rar

    在"DotNetty_Test.rar"这个压缩包中,包含了两个关键的文件:Echo.Server和Echo.Client,这显然是一个简单的回显服务示例,展示了如何使用DotNetty进行客户端和服务端之间的通信。 首先,让我们深入了解一下...

    sockjs JAVA版本的客户端.zip

    在Java中,实现SOCKJS客户端的库通常是基于Netty框架的“sockjs-client-java”,这个库允许Java开发者轻松地创建和管理SOCKJS连接。"SOCKJS-JAVA-master"这个压缩包文件很可能是这个库的源代码仓库,包含了项目的主...

    java精典编程100例

    通过对《Java经典编程100例》中的两个例子——Server端编程和Client端编程的详细介绍,我们不仅了解了Java网络编程的基本原理和技术要点,还掌握了如何使用Java编写简单的服务器端和客户端程序的方法。这对于初学者...

    javalruleetcode-magician:java学习

    server/client ##数据结构与算法 ####动态规划 CUT: 分隔钢筋 LCS: 最长公共子序列 LIS: 最长递增子序列 MaxLength: 无环有向图最长加权路径 LPS: 最长回文子序列 Knapspack: 01背包问题 ####贪心算法 ActiveSelect:...

    一款iOS平台UDP双向通信源码

    在源码中,`ios_echo_client_udp`很可能是一个简单的UDP回显客户端,它向服务器发送一个数据包,然后等待服务器回传相同的数据。这是测试网络连接和延迟的一个常见做法。客户端发送一个消息,服务器接收到后立即原样...

Global site tag (gtag.js) - Google Analytics