不喜欢写描述什么的,基本上使用步骤,注意事项都在代码注释中标明了,而相关的内容网上有很多,比自己的理解更好,所以自己对某个知识点的理解则都写在了为知笔记中。
1、服务端的编写
package com.netty.helloserver; import java.net.InetSocketAddress; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import org.jboss.netty.bootstrap.ServerBootstrap; import org.jboss.netty.buffer.ChannelBuffer; import org.jboss.netty.buffer.ChannelBuffers; import org.jboss.netty.channel.ChannelHandlerContext; import org.jboss.netty.channel.ChannelPipeline; import org.jboss.netty.channel.ChannelPipelineFactory; import org.jboss.netty.channel.ChannelStateEvent; import org.jboss.netty.channel.Channels; import org.jboss.netty.channel.ExceptionEvent; import org.jboss.netty.channel.MessageEvent; import org.jboss.netty.channel.SimpleChannelHandler; import org.jboss.netty.channel.socket.nio.NioServerSocketChannelFactory; import org.jboss.netty.handler.codec.string.StringDecoder; import org.jboss.netty.handler.codec.string.StringEncoder; /** * @author Chalmers 2016年2月18日 下午6:49:57 */ public class NettyServer { public static void main(String[] args) { // 创建服务类对象 ServerBootstrap serverBootstrap = new ServerBootstrap(); // 创建两个线程池 // 简单来讲,就是boss监听端口,worker来监听selector(NIO里面的) ExecutorService boss = Executors.newCachedThreadPool(); ExecutorService worker = Executors.newCachedThreadPool(); // 设置工厂,并且把两个线程池加入进去 // 经测试,该方法在netyy3.0中有效,5.0中没有 serverBootstrap.setFactory(new NioServerSocketChannelFactory(boss, worker)); // 设置管道工厂 serverBootstrap.setPipelineFactory(new ChannelPipelineFactory() { @Override public ChannelPipeline getPipeline() throws Exception { ChannelPipeline channelPipeline = Channels.pipeline(); // 加上此行代码,在Handler中便可以直接获取字符串,而不用经过ChannelBuffer了 // 看源码可得,decoder用来处理上行数据 channelPipeline.addLast("decoder", new StringDecoder()); // encoder用来数据下行数据 channelPipeline.addLast("encoder", new StringEncoder()); /** * 经测试可得,decoder和encoder不能省去,而下面的可以省掉 */ channelPipeline.addLast("helloHandler", new ServerHandler()); // 返回 return channelPipeline; } }); // 注意此行代码,在绑定时,一定要在工厂之后,否则就会报错 serverBootstrap.bind(new InetSocketAddress(9090)); System.out.println("start --> server"); } } class ServerHandler extends SimpleChannelHandler { /** * 不管是否已经连接,都将执行 */ @Override public void channelClosed(ChannelHandlerContext ctx, ChannelStateEvent e) throws Exception { super.channelClosed(ctx, e); System.out.println("channelClosed"); } /** * 当网络连接时执行 */ @Override public void channelConnected(ChannelHandlerContext ctx, ChannelStateEvent e) throws Exception { super.channelConnected(ctx, e); System.out.println("channelConnected"); } /** * 只有当网络连接过,断开时才会执行 */ @Override public void channelDisconnected(ChannelHandlerContext ctx, ChannelStateEvent e) throws Exception { super.channelDisconnected(ctx, e); System.out.println("channelDisconnected"); } /** * 捕获异常 */ @Override public void exceptionCaught(ChannelHandlerContext ctx, ExceptionEvent e) throws Exception { super.exceptionCaught(ctx, e); System.out.println("exceptionCaught"); } /** * 接收消息 */ @Override public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Exception { super.messageReceived(ctx, e); System.out.println("messageReceived"); // 因为在设置管道工厂时,设置了StringDecode,所以在此时可以直接获得 // 但如果没有设置的话,可以通过以下方法 // ChannelBuffer message = (ChannelBuffer) e.getMessage(); // System.out.println(new String(message.array())); System.out.println(e.getMessage()); /* * 发送消息 */ // ChannelBuffer copiedBuffer = ChannelBuffers.copiedBuffer("hi" // .getBytes()); // ctx.getChannel().write(copiedBuffer); // 因为在管道中设置了encoder,所以可以像读取一样,写成下面的形式 ctx.getChannel().write("hi"); } }
2、客户端的编写
package com.netty.hiclient; import java.net.InetSocketAddress; import java.util.Scanner; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import org.jboss.netty.bootstrap.ClientBootstrap; import org.jboss.netty.channel.Channel; import org.jboss.netty.channel.ChannelFuture; import org.jboss.netty.channel.ChannelHandlerContext; import org.jboss.netty.channel.ChannelPipeline; import org.jboss.netty.channel.ChannelPipelineFactory; import org.jboss.netty.channel.ChannelStateEvent; import org.jboss.netty.channel.Channels; import org.jboss.netty.channel.ExceptionEvent; import org.jboss.netty.channel.MessageEvent; import org.jboss.netty.channel.SimpleChannelHandler; import org.jboss.netty.channel.socket.nio.NioClientSocketChannelFactory; import org.jboss.netty.handler.codec.string.StringDecoder; import org.jboss.netty.handler.codec.string.StringEncoder; /** * @author Chalmers 2016年2月18日 下午10:22:08 */ public class NettyClient { private static ClientBootstrap clientBootstrap; public static void main(String[] args) { // 获得客户端对象 clientBootstrap = new ClientBootstrap(); // 创建两个线程池 ExecutorService boss = Executors.newCachedThreadPool(); ExecutorService worker = Executors.newCachedThreadPool(); // 设置工厂,跟服务端一样 clientBootstrap.setFactory(new NioClientSocketChannelFactory(boss, worker)); // 设置管道工厂 clientBootstrap.setPipelineFactory(new ChannelPipelineFactory() { @Override public ChannelPipeline getPipeline() throws Exception { ChannelPipeline channelPipeline = Channels.pipeline(); // 进行包装 channelPipeline.addLast("decoder", new StringDecoder()); channelPipeline.addLast("encoder", new StringEncoder()); channelPipeline.addLast("hiHandler", new ClientHandler()); return channelPipeline; } }); System.out.println("start --> client"); // 一定记住,这个地方用的是connect,而不是bind ChannelFuture channelFuture = clientBootstrap .connect(new InetSocketAddress("127.0.0.1", 9090)); // 可以冲future中获得channel Channel channel = channelFuture.getChannel(); Scanner sc = new Scanner(System.in); while (true) { System.out.print("输入: "); // 用获得channel进行输出 channel.write(sc.next()); } } } class ClientHandler extends SimpleChannelHandler { @Override public void channelClosed(ChannelHandlerContext ctx, ChannelStateEvent e) throws Exception { super.channelClosed(ctx, e); System.out.println("channelClosed"); } @Override public void channelConnected(ChannelHandlerContext ctx, ChannelStateEvent e) throws Exception { super.channelConnected(ctx, e); System.out.println("channelConnected"); } @Override public void channelDisconnected(ChannelHandlerContext ctx, ChannelStateEvent e) throws Exception { super.channelDisconnected(ctx, e); System.out.println("channelDisconnected"); } @Override public void exceptionCaught(ChannelHandlerContext ctx, ExceptionEvent e) throws Exception { super.exceptionCaught(ctx, e); System.out.println("exceptionCaught"); } @Override public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Exception { super.messageReceived(ctx, e); System.out.println("messageReceived"); System.out.println(e.getMessage()); } }
相关推荐
在"java应用netty服务端和客户端"的示例中,Netty被用来构建一个简单的通信系统,其中包含服务端(Server)和客户端(Client)。为了实现通信,服务端和客户端都需要定义自己的`model对象`,这些对象通常包含了数据...
通过netty编写文件传输的客户端与服务端,以及协议说明, 通用的netty传输协议 通过该协议进行文件传输 文件传输客户端与服务端 可以根据文件的最后更新时间来增量传输文件 源码开放,通过eclipse或者idea导入代码...
在本文中,我们将深入探讨如何使用 Netty 实现服务端与客户端之间的通信,以及涉及到的关键知识点。 首先,我们要理解 Netty 的核心概念。Netty 基于非阻塞 I/O 模型,利用 Java NIO(Non-blocking Input/Output)...
在这个“netty5服务端和客户端通讯的demo”中,我们将深入探讨如何利用Netty 5实现Java中的服务器和客户端通信。Netty 5(尽管现在Netty已经更新到更高级别的版本)提供了丰富的功能,包括NIO(非阻塞I/O)支持,...
标题中的“Netty实现Java服务端和C#客户端联通”是指使用Netty作为Java服务器框架,与C#客户端(使用DotNetty库)进行通信的一种技术实现。这涉及到跨平台的网络通信,以及两个不同编程语言间的交互。 Netty是Java...
springboot整合netty,分客户端和服务端两个项目,springboot整合netty,分客户端和服务端两个项目,springboot整合netty,分客户端和服务端两个项目,springboot整合netty,分客户端和服务端两个项目
使用Netty搭建服务端和客户端过程详解 Netty是当前Java领域中最流行的网络编程框架之一,它提供了一个简洁、灵活、可扩展的架构,可以轻松地构建高性能的网络应用程序。在本篇文章中,我们将详细介绍使用Netty搭建...
Netty中使用WebSocket实现服务端与客户端的长连接通信发送消息示例代码;Netty中使用WebSocket实现服务端与客户端的长连接通信发送消息示例代码;Netty中使用WebSocket实现服务端与客户端的长连接通信发送消息示例代码
#### 已实现: * 发布订阅功能 * 遗言通知 * 会话session数据 * 发布保留消息 * 主题过滤(/test 会接受到 /test/yy 的主题消息) * 实现标准的 qos0 qos1 qos2消息确认机制 * ssl加密 * 支持ws协议 ...
netty-mqtt是一个基于Java开发的MQTT 3.1.1协议服务端与客户端,包含113个文件,其中包括87个Java源文件、8个XML文件、7个Iml文件、3个YAML文件、3个JKS文件、2个Factories文件、1个LICENSE文件和1个Markdown文件。...
Netty服务端和客户端调用demo是一个基于Spring Boot和Maven构建的应用,它演示了如何使用Netty框架进行网络通信。Netty是一个高性能、异步事件驱动的网络应用框架,适用于开发服务器和客户端的Java应用。这个demo...
本实践将详细介绍如何在Android环境中使用Netty进行客户端和服务端的通信。 首先,我们需要理解Netty的基本概念。Netty的核心是其EventLoopGroup(事件循环组),它负责处理I/O事件,并将它们分发到相应的...
在本文中,我们将深入探讨如何使用 Netty 实现简单的客户端-服务端通信,这对于初学者来说是一个很好的起点。 首先,理解 Netty 的核心概念至关重要。Netty 的设计基于 NIO(非阻塞 I/O),它利用了 Java 提供的 ...
在本文中,我们将深入探讨Netty的基本概念、如何创建Netty服务端和客户端,以及与SpringBoot的集成。 首先,Netty的核心设计理念是基于NIO(非阻塞I/O)和Reactor模式,这种模式可以有效地处理大量并发连接,减少了...
《基于Netty实现的MQTT客户端在Java与Android环境中的应用》 MQTT(Message Queuing Telemetry Transport)是一种轻量级的发布/订阅式消息协议,广泛应用于物联网(IoT)领域,尤其是资源受限的设备之间。在本文中...
在这个"Netty框架,服务端、客户端代码示例"中,我们将深入探讨如何使用Netty构建服务端和客户端的通信。 首先,让我们了解Netty的基本架构。Netty的核心是它的“线程模型”和“通道”概念。线程模型采用“事件循环...
本项目包含两个关键部分:Netty服务端和客户端,它们共同构建了一个稳定且可靠的通信架构。 Netty服务端: 1. **多设备连接管理**:服务端设计为能够同时处理多个设备的连接请求,通过非阻塞I/O(NIO)机制,提高...
在本文中,我们将深入探讨如何利用Netty 4构建一个简单的服务端和客户端实例,以及如何在IntelliJ IDEA 2018.1.3这个强大的Java开发环境中设置和运行这些实例。 首先,Netty 4相较于之前的版本,引入了更多的性能...
自己基于netty开发的服务端,支持spring配置服务器启动模式:http,websocket,ssl等,并支持NIO和OIO方式,项目已应用于生产,可以通过jar形式加入其它项目,业务类实现业务service,启动不依赖于其他应用服务器,内...
在本项目中,"netty客户端和服务端通讯" 实现了基于 Netty 的通信机制,允许客户端与服务端进行高效的数据交互。 首先,让我们深入了解 Netty 的核心概念: 1. **ByteBuf**:Netty 提供了 ByteBuf 作为字节缓冲区...