简单的介绍一些服务端代码的编写顺序。
1.得到 ServerBootstrap的对象,用来监听客户端
ServerBootstrap serverBootstrap = new ServerBootstrap();
2.创建两个线程池
EventLoopGroup boss = new NioEventLoopGroup(); EventLoopGroup worker = new NioEventLoopGroup();
boss用来对端口的监听,worker对数据进行处理
3.设置工厂
serverBootstrap.group(boss, worker); serverBootstrap.channel(NioServerSocketChannel.class);
4.设置,可以理解为netty3中的管道
serverBootstrap.childHandler(new ChannelInitializer<Channel>() { @Override protected void initChannel(Channel channel) throws Exception { /** * 将“上传下载”数据装饰成String类型 */ channel.pipeline().addLast(new StringDecoder()); channel.pipeline().addLast(new StringEncoder()); // 要处理的Handler channel.pipeline().addLast(new ServerHandler2()); } });
5.设置TCP参数
serverBootstrap.option(ChannelOption.SO_BACKLOG, 2048);// serverSocketchannel的设置,链接缓冲池的大小 serverBootstrap.childOption(ChannelOption.SO_KEEPALIVE, true);// socketchannel的设置,维持链接的活跃,清除死链接 serverBootstrap.childOption(ChannelOption.TCP_NODELAY, true);// socketchannel的设置,关闭延迟发送
6.绑定端口
ChannelFuture future = serverBootstrap.bind(new InetSocketAddress( 9090));
7.(等待)关闭客户端
Channel channel = future.channel(); channel.closeFuture().sync();
完整代码如下:
服务端:
package com.netty5.server; import java.net.InetSocketAddress; import io.netty.bootstrap.ServerBootstrap; import io.netty.channel.Channel; import io.netty.channel.ChannelFuture; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.ChannelInitializer; import io.netty.channel.ChannelOption; import io.netty.channel.EventLoopGroup; import io.netty.channel.SimpleChannelInboundHandler; import io.netty.channel.nio.NioEventLoopGroup; import io.netty.channel.socket.nio.NioServerSocketChannel; import io.netty.handler.codec.string.StringDecoder; import io.netty.handler.codec.string.StringEncoder; /** * @author Chalmers 2016年2月20日 下午7:52:49 */ public class NettyServer2 { public static void main(String[] args) { // 得到ServerBootstrap对象 ServerBootstrap serverBootstrap = new ServerBootstrap(); // 创建线程池 EventLoopGroup boss = new NioEventLoopGroup(); EventLoopGroup worker = new NioEventLoopGroup(); try { // 类似于Netty3中的工厂 serverBootstrap.group(boss, worker); serverBootstrap.channel(NioServerSocketChannel.class); // 类似于Netty3中的管道 serverBootstrap.childHandler(new ChannelInitializer<Channel>() { @Override protected void initChannel(Channel channel) throws Exception { /** * 将“上传下载”数据装饰成String类型 */ channel.pipeline().addLast(new StringDecoder()); channel.pipeline().addLast(new StringEncoder()); // 要处理的Handler channel.pipeline().addLast(new ServerHandler2()); } }); // 设置参数,TCP参数 serverBootstrap.option(ChannelOption.SO_BACKLOG, 2048);// serverSocketchannel的设置,链接缓冲池的大小 serverBootstrap.childOption(ChannelOption.SO_KEEPALIVE, true);// socketchannel的设置,维持链接的活跃,清除死链接 serverBootstrap.childOption(ChannelOption.TCP_NODELAY, true);// socketchannel的设置,关闭延迟发送 // 绑定端口,并且返回ChannelFuture对象 ChannelFuture future = serverBootstrap.bind(new InetSocketAddress( 9090)); System.out.println("启动服务器..."); // 等待客户端的关闭 Channel channel = future.channel(); // 要记得是closeFuture(),作用是等待服务端的关闭 channel.closeFuture().sync(); // 该条语句不会输出,原因:上面没有关闭... // System.out.println("客户端已经关闭..."); } catch (Exception e) { e.printStackTrace(); } finally { boss.shutdownGracefully(); worker.shutdownGracefully(); } } } class ServerHandler2 extends SimpleChannelInboundHandler<String> { @Override protected void messageReceived(ChannelHandlerContext arg0, String arg1) throws Exception { // 输出接收到的数据 System.out.println(arg1); // 向客户端发送数据 arg0.channel().writeAndFlush("hi"); } /** * */ @Override public void channelActive(ChannelHandlerContext ctx) throws Exception { super.channelActive(ctx); System.out.println("channelActive"); } @Override public void channelInactive(ChannelHandlerContext ctx) throws Exception { super.channelInactive(ctx); System.out.println("channelInactive"); } }
客户端:
package com.netty.client; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import io.netty.bootstrap.Bootstrap; import io.netty.channel.Channel; import io.netty.channel.ChannelFuture; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.ChannelInitializer; import io.netty.channel.EventLoopGroup; import io.netty.channel.SimpleChannelInboundHandler; import io.netty.channel.nio.NioEventLoopGroup; import io.netty.channel.socket.nio.NioSocketChannel; import io.netty.handler.codec.string.StringDecoder; import io.netty.handler.codec.string.StringEncoder; /** * @author Chalmers 2016年2月20日 下午8:31:25 */ public class Client { public static void main(String[] args) { Bootstrap bootstrap = new Bootstrap(); EventLoopGroup worker = new NioEventLoopGroup(); bootstrap.channel(NioSocketChannel.class); bootstrap.group(worker); bootstrap.handler(new ChannelInitializer<Channel>() { @Override protected void initChannel(Channel channel) throws Exception { channel.pipeline().addLast(new StringEncoder()); channel.pipeline().addLast(new StringDecoder()); channel.pipeline().addLast(new ClientHandler()); } }); ChannelFuture future = bootstrap.connect("127.0.0.1", 9090); BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); while (true) { System.out.print("输入: "); try { String line = br.readLine(); future.channel().writeAndFlush(line); } catch (IOException e) { e.printStackTrace(); } } } } class ClientHandler extends SimpleChannelInboundHandler<String> { @Override protected void messageReceived(ChannelHandlerContext arg0, String arg1) throws Exception { System.out.println("收到服务端发送的消息..." + arg1); } @Override public void channelActive(ChannelHandlerContext ctx) throws Exception { // TODO Auto-generated method stub super.channelActive(ctx); } @Override public void channelInactive(ChannelHandlerContext ctx) throws Exception { // TODO Auto-generated method stub super.channelInactive(ctx); } }
因为netty5与netty3的差别挺大,所以注意区分开。
http://moonmonster.iteye.com/blog/2278672
当然,因为本人水平有限,所以更详细的解释可见
netty权威指南作者的博客
相关推荐
在"java应用netty服务端和客户端"的示例中,Netty被用来构建一个简单的通信系统,其中包含服务端(Server)和客户端(Client)。为了实现通信,服务端和客户端都需要定义自己的`model对象`,这些对象通常包含了数据...
总结来说,这个“netty5服务端和客户端通讯的demo”展示了如何利用Netty 5的特性,结合Java的NIO,构建一个高效、可扩展的网络通信应用。通过理解和实践这个示例,你可以更好地掌握Netty的用法,以及如何在实际项目...
在本文中,我们将深入探讨如何使用 Netty 实现服务端与客户端之间的通信,以及涉及到的关键知识点。 首先,我们要理解 Netty 的核心概念。Netty 基于非阻塞 I/O 模型,利用 Java NIO(Non-blocking Input/Output)...
标题中的“Netty实现Java服务端和C#客户端联通”是指使用Netty作为Java服务器框架,与C#客户端(使用DotNetty库)进行通信的一种技术实现。这涉及到跨平台的网络通信,以及两个不同编程语言间的交互。 Netty是Java...
Netty服务端和客户端调用demo是一个基于Spring Boot和Maven构建的应用,它演示了如何使用Netty框架进行网络通信。Netty是一个高性能、异步事件驱动的网络应用框架,适用于开发服务器和客户端的Java应用。这个demo...
使用Netty搭建服务端和客户端过程详解 Netty是当前Java领域中最流行的网络编程框架之一,它提供了一个简洁、灵活、可扩展的架构,可以轻松地构建高性能的网络应用程序。在本篇文章中,我们将详细介绍使用Netty搭建...
客户端的Pipeline配置可以与服务端类似,但通常会缺少服务器的接受新连接的部分。 心跳机制在长连接中非常重要,它可以确保连接的活跃性。在Netty中,我们可以自定义HeartbeatHandler,定期向对端发送心跳消息,并...
在本文中,我们将深入探讨Netty的基本概念、如何创建Netty服务端和客户端,以及与SpringBoot的集成。 首先,Netty的核心设计理念是基于NIO(非阻塞I/O)和Reactor模式,这种模式可以有效地处理大量并发连接,减少了...
通过这个项目,你可以学习到如何使用 Netty 构建高效的网络应用,包括客户端和服务端的交互、数据编码解码以及事件驱动的编程模型。这将有助于你理解网络通信的底层原理,并能应用于实际的分布式系统开发。
《基于Netty实现的MQTT客户端在Java与Android环境中的应用》 MQTT(Message Queuing Telemetry Transport)是一种轻量级的发布/订阅式消息协议,广泛应用于物联网(IoT)领域,尤其是资源受限的设备之间。在本文中...
整合Spring Boot与Netty,可以利用Spring的便捷性和Netty的高效性来构建实时通信系统,例如基于Socket的服务。以下将详细讲解如何实现Spring Boot整合Netty的Socket服务端和客户端。 首先,我们来看服务端的实现。...
在这个"Netty框架,服务端、客户端代码示例"中,我们将深入探讨如何使用Netty构建服务端和客户端的通信。 首先,让我们了解Netty的基本架构。Netty的核心是它的“线程模型”和“通道”概念。线程模型采用“事件循环...
本项目包含两个关键部分:Netty服务端和客户端,它们共同构建了一个稳定且可靠的通信架构。 Netty服务端: 1. **多设备连接管理**:服务端设计为能够同时处理多个设备的连接请求,通过非阻塞I/O(NIO)机制,提高...
在创建Netty服务端时,我们需要以下组件: 1. **Bootstrap**: 服务启动器,用于配置服务器的参数,如绑定的端口、事件循环组等。 2. **ServerSocketChannel**: 表示服务器端的套接字通道,用于监听客户端连接。 3. ...
Netty 是一个高性能、异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端。在这个项目中,我们将深入理解如何利用 Netty 4 来编写服务器和客户端,实现自定义的消息编解码,并进行通信...
Socket编程是网络通信的基础,而Netty则为构建基于Socket的服务端提供了强大的支持。 Netty的核心在于其使用了非阻塞I/O(Non-blocking I/O,也称为NIO)模型,这使得它在处理大量并发连接时表现出色。NIO是一种I/O...
在本文中,我们将深入探讨如何使用 Netty 4.0.31.Final 版本构建 Android 客户端和服务器端应用程序。 首先,Netty 提供了一种简化网络编程的方式,它通过非阻塞 I/O 和 Channel 抽象来处理并发连接。在 Android 上...
在这个“用Netty5写一个简单的服务端和客户端”的示例中,我们将探讨如何使用Netty 5版本来构建基本的TCP通信模型,包括单连接和多连接的实现。 首先,Netty 5的核心组件包括Bootstrap(引导类)、Channel(通道)...
在"Netty WebSocket服务端"的实现中,我们首先需要了解Netty的ChannelHandlerContext,它是Netty的核心组件,包含了处理I/O事件和发送数据的所有方法。当我们监听到WebSocket连接建立时,会创建一个WebSocket的通道...
在Netty4中,通过Channel和ChannelHandlerContext实现长连接,它们是Netty的核心组件,Channel代表网络连接,而ChannelHandlerContext则用于处理与该连接相关的事件。 断开重连机制是确保网络通信稳定的关键。在...