`

netty客户端与服务端例子

阅读更多

 

package com.snailteam.netty;

import io.netty.bootstrap.ServerBootstrap;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.EventLoopGroup;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.SocketChannel;
import io.netty.channel.socket.nio.NioServerSocketChannel;
import io.netty.handler.codec.LengthFieldBasedFrameDecoder;
import io.netty.handler.logging.LogLevel;
import io.netty.handler.logging.LoggingHandler;

/**
 * 服务端Bootstrap
 * @author  
 *
 */
public class NServer {
	static final int PORT = 8080; 

	public static void main(String[] args) {
		EventLoopGroup bossGroup = new NioEventLoopGroup(1);
        EventLoopGroup workerGroup = new NioEventLoopGroup();
        try {
            ServerBootstrap b = new ServerBootstrap();
            b.group(bossGroup, workerGroup)
             .channel(NioServerSocketChannel.class)
             .childHandler(new ChannelInitializer<SocketChannel>() {
                @Override
                public void initChannel(SocketChannel ch) throws Exception {
                         /**
                	Inbound: 1 ->2 ->3 ->n 顺序处理 
			Outbound: n ->n-1 ->n-2 .. ->1  逆序处理
                	 */
                	//new LengthFieldBasedFrameDecoder(1024*8*20, 0, 4,0,4) 最大1024*8*20位为接收数据包,从0,长4Byte是数据宽度,然后从0,长4Byte剔除后的byte数据包,传送 到后面的handler链处理
                	ch.pipeline().addLast(new LoggingHandler(LogLevel.DEBUG),new LengthFieldBasedFrameDecoder(1024*8*20, 0, 4,0,4), new NServerHandler());
                }
             });

            // Bind and start to accept incoming connections.
            b.bind(PORT).sync().channel().closeFuture().sync();
        } catch (InterruptedException e) {
			e.printStackTrace();
		} finally {
            bossGroup.shutdownGracefully();
            workerGroup.shutdownGracefully();
        }
	}
}

 

 

 

package com.snailteam.netty;

import java.nio.charset.Charset;

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

public class NServerHandler extends SimpleChannelInboundHandler<ByteBuf> {


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

	@Override
	protected void channelRead0(ChannelHandlerContext ctx, ByteBuf msg)
			throws Exception {
		String str = msg.toString(Charset.forName("UTF-8"));
		System.out.println("[ok]" +str );
		str = "辛苦了"+str.substring(str.lastIndexOf(',')+1);
		ctx.writeAndFlush(Unpooled.wrappedBuffer(str.getBytes()));
	}
}

 

 

 

package com.snailteam.netty;

import io.netty.bootstrap.Bootstrap;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import io.netty.channel.Channel;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.ChannelOption;
import io.netty.channel.EventLoopGroup;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.SocketChannel;
import io.netty.channel.socket.nio.NioSocketChannel;
import io.netty.handler.codec.LengthFieldPrepender;
import io.netty.handler.logging.LogLevel;
import io.netty.handler.logging.LoggingHandler;
/**
 * 客户端Bootstrap
 *
 */
public class Nclient {
	public static void main(String[] args) {
		EventLoopGroup group = new NioEventLoopGroup();
		try {
			Bootstrap b = new Bootstrap();
			b.group(group).channel(NioSocketChannel.class).option(ChannelOption.TCP_NODELAY, true)
					.handler(new ChannelInitializer<SocketChannel>() {
						@Override
						public void initChannel(SocketChannel ch)
								throws Exception {
							//LengthFieldPrepender 把发送的数据前加4Byte存储数据宽度,发送。
							ch.pipeline().addLast(new LoggingHandler(LogLevel.DEBUG),new LengthFieldPrepender(4),
									new NclientHandler());

						}
					});

			StringBuilder sb = new StringBuilder();
			for (int i = 0; i < 20; i++) {
				sb.append("中华人民共和国" + i + ",");
			}
			// Bind and start to accept incoming connections.
			Channel con = b.connect("localhost", NServer.PORT).sync().channel();
			
			for (int i = 0; i < 900; i++) {
				String str = sb.toString() + i; 
				con.writeAndFlush(Unpooled.wrappedBuffer(str.getBytes())).sync().get();
				System.out.println(i);
			}
			con.close().sync();//异步退出
		} catch (InterruptedException e) {
			e.printStackTrace();
		} finally {
			group.shutdownGracefully();
		}
	}
}

 

 

 

 

package com.snailteam.netty;

import java.nio.charset.Charset;

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

public class NclientHandler extends SimpleChannelInboundHandler<ByteBuf> {
	
	@Override
    public void exceptionCaught(
            ChannelHandlerContext ctx, Throwable cause) throws Exception {
		cause.printStackTrace();
        ctx.close();
    }
	@Override
	protected void channelRead0(ChannelHandlerContext ctx, ByteBuf msg)
			throws Exception {
		System.out.println(msg.toString(Charset.forName("UTF-8")));
		
	}
}

 

 

 

package com.snailteam.netty;

import java.util.List;

import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.ByteToMessageDecoder;
 

public class FrameDecoder extends ByteToMessageDecoder{
	int lengthFeildLength = 4;
	
	@Override
	protected void decode(ChannelHandlerContext ctx, ByteBuf in, List<Object> out) throws Exception {
		 Object decoded = decode(ctx, in);
	        if (decoded != null) {
	            out.add(decoded);
	        }
	}

	private Object decode(ChannelHandlerContext ctx, ByteBuf in) {
		if(in.readableBytes()<lengthFeildLength)return null;//
		int index = in.readerIndex();
		int len = in.readInt();//解析次数包中对象的大小
		if(in.readableBytes()<len){//数据包的内容不全
			in.readerIndex(index);//重置readerIndex 
			return null;
		}
		return in.readRetainedSlice(len);//截取完整的一个转码对象。
	}

}

 

 

 

 

 

pom

<dependency>
			<groupId>io.netty</groupId>
			<artifactId>netty-example</artifactId>
			<version>4.1.6.Final</version>
			<exclusions>
				<exclusion>
					<artifactId>netty-tcnative</artifactId>
					<groupId>io.netty</groupId>
				</exclusion>
			</exclusions>
		</dependency>
		<dependency>
			<groupId>io.netty</groupId>
			<artifactId>netty-tcnative</artifactId>
			<version>1.1.33.Fork23</version>
			<classifier>windows-x86_64</classifier>
		</dependency>

 

 

 

 

 

 

分享到:
评论

相关推荐

    JavaNetty客户端与服务器

    标题"Java Netty客户端与服务器"表明我们将探讨如何使用Netty构建一个简单的服务器和客户端系统,其中客户端能够发送消息到服务器,而服务器则会给予响应。这种通信模式在许多分布式系统中非常常见,例如聊天应用、...

    基于netty的服务器客户端收发消息代码

    在这个“基于Netty的服务器客户端收发消息代码”中,我们可以看到一个简单的实现,它演示了如何使用Netty进行双向通信,即服务器与客户端之间的消息交换。 首先,我们从服务器端(ChatServer)入手。服务器端通常...

    java socket 客户端和服务端例子

    在这个"java socket 客户端和服务端例子"中,我们有两个主要组件:服务端(server)和客户端(client),以及可能的服务类(service)用于处理特定的业务逻辑。 首先,让我们详细了解一下Java Socket的工作原理。在...

    netty 包含客户端和服务器端

    - 客户端 ChannelHandler 用于处理与服务器的交互,包括连接建立、数据发送和接收、异常处理等。 - 连接建立后,客户端可以通过 Channel.writeAndFlush() 方法向服务器发送数据。 3. **服务器端实现**: - ...

    nettty 客户端和服务端demo

    在这个“nettty 客户端和服务端demo”中,我们将会探讨如何利用Netty 4.1.16版本实现一个简单的客户端与服务端通信的例子。 首先,让我们了解Netty的基本架构。Netty的核心是其Channel(通道)概念,它代表了一个到...

    netty4服务端客户端实例

    在本文中,我们将深入探讨如何利用Netty 4构建一个简单的服务端和客户端实例,以及如何在IntelliJ IDEA 2018.1.3这个强大的Java开发环境中设置和运行这些实例。 首先,Netty 4相较于之前的版本,引入了更多的性能...

    Netty粘包分包服务器端客户端完整例子

    这个项目可能包含了使用`LineBasedFrameDecoder`和`DelimiterBasedFrameDecoder`的服务器端和客户端实现,通过这些文件,开发者可以学习如何在实际项目中应用Netty来处理粘包和分包问题。 总之,理解和正确使用...

    Netty的Socket编程详解-搭建服务端与客户端并进行数据传输示例代码.rar

    2. **Netty客户端的创建**: - 创建`Bootstrap`实例,这是客户端的启动类。 - 设置`group()`,通常与服务端相同,使用`NioEventLoopGroup`。 - 使用`channel()`指定客户端使用的Channel类型,如`NioSocketChannel...

    Netty5完整例子

    例子的内容是:服务端启动,客户端启动,客户端连接服务器后服务器发一个Message的对象给客户端,客户端接受并打印Message里边的内容。编解码的处理为:消息长度[int] + 消息内容[byte[]]。心跳设置的是读写空闲都是10...

    Netty的入门经典例子

    "Netty 入门经典例子" Netty 是一个异步的、事件驱动的网络编程框架和工具,使用 Netty 可以快速开发出可维护的、high-performance 的协议服务及其客户端应用。Netty 相当简化和流线化了网络应用的编程开发过程,...

    用Netty5写一个简单的服务端和客户端.rar

    在这个“用Netty5写一个简单的服务端和客户端”的示例中,我们将探讨如何使用Netty 5版本来构建基本的TCP通信模型,包括单连接和多连接的实现。 首先,Netty 5的核心组件包括Bootstrap(引导类)、Channel(通道)...

    Netty5入门3个简单例子

    总之,通过这三个简单的例子,你可以理解Netty的基本工作原理,包括服务器和客户端的搭建,以及处理器链的配置。继续探索Netty提供的丰富功能,如编解码器、心跳机制和多线程模型,将有助于你进一步提升在网络编程...

    一个NIO服务端,客户端的例子

    总的来说,这个NIO服务端和客户端的例子可以帮助我们深入理解Java NIO和Netty框架的工作原理,学习如何构建高效、可靠的网络应用。通过实践和分析这个示例代码,我们可以更好地掌握异步I/O、事件驱动编程以及Netty...

    java Netty 框架例子源码.rar

    - **Echo 示例**:最基本的 Netty 应用,服务端接收客户端发送的数据并回显,展示了 Netty 的基本使用。 - **HTTP 示例**:展示如何使用 Netty 实现一个简单的 HTTP 服务器,处理 GET 和 POST 请求。 - **WebSocket ...

    netty小例子

    这个“netty小例子”很可能是为了帮助初学者理解和掌握 Netty 的基本用法,包括如何创建客户端和服务端,以及如何集成日志系统。 在 Netty 中,服务端通常由 `ServerBootstrap` 类来初始化,它负责配置服务器的参数...

    Netty例子含Netty jar

    Netty是一个高性能、异步事件驱动的网络应用框架,用于快速开发可维护的高性能协议服务器和客户端。在Java开发领域,Netty因其高效、稳定和丰富的功能而备受推崇。本项目是一个基于MyEclipse的Netty实例,包含了...

    Netty 官方例子

    `Bootstrap` 和 `ServerBootstrap` 分别用于创建客户端和服务端的启动配置。它们允许我们配置连接参数,如事件循环组、套接字选项、处理器管道等。 5. **Handler** `ChannelInboundHandler` 和 `...

    netty4完整配置及实例

    Netty 是一个高性能、异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端。在本文中,我们将深入探讨 Netty 4 的完整配置以及如何通过实例来理解和应用它。 1. **Netty 4 版本差异**:...

    Netty和SSL/TLS应用例子

    在压缩包中的"Netty和SSL-TLS例子"文件中,你可以找到具体实现这些功能的源代码。通过阅读和分析这些代码,你可以深入理解Netty如何与SSL/TLS结合,以及如何在实际项目中实现安全的网络通信。代码中可能包括了如`...

Global site tag (gtag.js) - Google Analytics