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>
相关推荐
标题"Java Netty客户端与服务器"表明我们将探讨如何使用Netty构建一个简单的服务器和客户端系统,其中客户端能够发送消息到服务器,而服务器则会给予响应。这种通信模式在许多分布式系统中非常常见,例如聊天应用、...
在这个“基于Netty的服务器客户端收发消息代码”中,我们可以看到一个简单的实现,它演示了如何使用Netty进行双向通信,即服务器与客户端之间的消息交换。 首先,我们从服务器端(ChatServer)入手。服务器端通常...
在这个"java socket 客户端和服务端例子"中,我们有两个主要组件:服务端(server)和客户端(client),以及可能的服务类(service)用于处理特定的业务逻辑。 首先,让我们详细了解一下Java Socket的工作原理。在...
- 客户端 ChannelHandler 用于处理与服务器的交互,包括连接建立、数据发送和接收、异常处理等。 - 连接建立后,客户端可以通过 Channel.writeAndFlush() 方法向服务器发送数据。 3. **服务器端实现**: - ...
在这个“nettty 客户端和服务端demo”中,我们将会探讨如何利用Netty 4.1.16版本实现一个简单的客户端与服务端通信的例子。 首先,让我们了解Netty的基本架构。Netty的核心是其Channel(通道)概念,它代表了一个到...
在本文中,我们将深入探讨如何利用Netty 4构建一个简单的服务端和客户端实例,以及如何在IntelliJ IDEA 2018.1.3这个强大的Java开发环境中设置和运行这些实例。 首先,Netty 4相较于之前的版本,引入了更多的性能...
这个项目可能包含了使用`LineBasedFrameDecoder`和`DelimiterBasedFrameDecoder`的服务器端和客户端实现,通过这些文件,开发者可以学习如何在实际项目中应用Netty来处理粘包和分包问题。 总之,理解和正确使用...
2. **Netty客户端的创建**: - 创建`Bootstrap`实例,这是客户端的启动类。 - 设置`group()`,通常与服务端相同,使用`NioEventLoopGroup`。 - 使用`channel()`指定客户端使用的Channel类型,如`NioSocketChannel...
例子的内容是:服务端启动,客户端启动,客户端连接服务器后服务器发一个Message的对象给客户端,客户端接受并打印Message里边的内容。编解码的处理为:消息长度[int] + 消息内容[byte[]]。心跳设置的是读写空闲都是10...
"Netty 入门经典例子" Netty 是一个异步的、事件驱动的网络编程框架和工具,使用 Netty 可以快速开发出可维护的、high-performance 的协议服务及其客户端应用。Netty 相当简化和流线化了网络应用的编程开发过程,...
在这个“用Netty5写一个简单的服务端和客户端”的示例中,我们将探讨如何使用Netty 5版本来构建基本的TCP通信模型,包括单连接和多连接的实现。 首先,Netty 5的核心组件包括Bootstrap(引导类)、Channel(通道)...
总之,通过这三个简单的例子,你可以理解Netty的基本工作原理,包括服务器和客户端的搭建,以及处理器链的配置。继续探索Netty提供的丰富功能,如编解码器、心跳机制和多线程模型,将有助于你进一步提升在网络编程...
总的来说,这个NIO服务端和客户端的例子可以帮助我们深入理解Java NIO和Netty框架的工作原理,学习如何构建高效、可靠的网络应用。通过实践和分析这个示例代码,我们可以更好地掌握异步I/O、事件驱动编程以及Netty...
- **Echo 示例**:最基本的 Netty 应用,服务端接收客户端发送的数据并回显,展示了 Netty 的基本使用。 - **HTTP 示例**:展示如何使用 Netty 实现一个简单的 HTTP 服务器,处理 GET 和 POST 请求。 - **WebSocket ...
这个“netty小例子”很可能是为了帮助初学者理解和掌握 Netty 的基本用法,包括如何创建客户端和服务端,以及如何集成日志系统。 在 Netty 中,服务端通常由 `ServerBootstrap` 类来初始化,它负责配置服务器的参数...
Netty是一个高性能、异步事件驱动的网络应用框架,用于快速开发可维护的高性能协议服务器和客户端。在Java开发领域,Netty因其高效、稳定和丰富的功能而备受推崇。本项目是一个基于MyEclipse的Netty实例,包含了...
`Bootstrap` 和 `ServerBootstrap` 分别用于创建客户端和服务端的启动配置。它们允许我们配置连接参数,如事件循环组、套接字选项、处理器管道等。 5. **Handler** `ChannelInboundHandler` 和 `...
Netty 是一个高性能、异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端。在本文中,我们将深入探讨 Netty 4 的完整配置以及如何通过实例来理解和应用它。 1. **Netty 4 版本差异**:...
在压缩包中的"Netty和SSL-TLS例子"文件中,你可以找到具体实现这些功能的源代码。通过阅读和分析这些代码,你可以深入理解Netty如何与SSL/TLS结合,以及如何在实际项目中实现安全的网络通信。代码中可能包括了如`...