不喜欢写描述什么的,基本上使用步骤,注意事项都在代码注释中标明了,而相关的内容网上有很多,比自己的理解更好,所以自己对某个知识点的理解则都写在了为知笔记中。
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()); } }
相关推荐
通过netty编写文件传输的客户端与服务端,以及协议说明, 通用的netty传输协议 通过该协议进行文件传输 文件传输客户端与服务端 可以根据文件的最后更新时间来增量传输文件 源码开放,通过eclipse或者idea导入代码...
利用idea,构建的maven项目,用idea打开即可测试运行,实现了netty的服务段和客户端,利用netty实现服务端和客户端的通信demo.
java应用netty服务端和客户端示例,客户端和服务端的model对象目录必须一致
实现Java服务端和C#客户端联通 Java使用Netty 开发环境为IDEA C#使用DotNetty 开发环境为VS2017 运行时先开启Java服务端 再开启客户端
springboot整合netty,分客户端和服务端两个项目,springboot整合netty,分客户端和服务端两个项目,springboot整合netty,分客户端和服务端两个项目,springboot整合netty,分客户端和服务端两个项目
Netty中使用WebSocket实现服务端与客户端的长连接通信发送消息示例代码;Netty中使用WebSocket实现服务端与客户端的长连接通信发送消息示例代码;Netty中使用WebSocket实现服务端与客户端的长连接通信发送消息示例代码
主要介绍了使用Netty搭建服务端和客户端过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
Netty实现简单的客户端服务端通信示例,户端发送请求给服务端,并由服务端响应客户端请求,希望对初学Netty的同学有所帮助。
本资源包含netty服务端和客户端代码,以及连接工具WebLisTools
Android Studio 开发Netty网络访问框架,实现了客户端、服务端两种访问方式,支持发送心跳数据,使用Handler实现外部数据交互,有调用Demo,在实际项目中使用暂时没有问题
通过netty4实现的简单的服务端与客户端的源代码,采用IntelliJ IDEA 2018.1.3开发工具,该例子可以帮助你入门netty框架。
Netty服务端与客户端依靠Java序列化传输数据
此项目做了netty通讯的客户端和服务端,可以直接运行 注意pom文件需要添加netty依赖
自己基于netty开发的服务端,支持spring配置服务器启动模式:http,websocket,ssl等,并支持NIO和OIO方式,项目已应用于生产,可以通过jar形式加入其它项目,业务类实现业务service,启动不依赖于其他应用服务器,内...
客户端发送16进制给服务端,并行实现socket通道活动状态和断开重新连接的功能, 监听接口是否存在数据,如果存在socket客户端发送给socket服务端的实现 随着物联网的发展,随之出现了各种传感器监测数据的实时发送,...
demo采用spring boot和maven编写,直接使用maven方式打开项目先运行TimeServer中的main函数再运行TimeClient中的main函数即可在控制台中看到效果
Netty的Socket编程详解-搭建服务端与客户端并进行数据传输示例代码.
本人基于netty开发的服务端,支持spring配置服务器启动模式:http,websocket,ssl等,并支持NIO和OIO方式,项目已应用于生产,可以通过jar形式加入其它项目,业务类实现业务service,启动不依赖于其他应用服务器,内...
根据给定的消息协议,自己定义一个消息类,编写好服务端与客户端,自定义好编解码器,在客户端发送此消息,服务端获取消息并向客户端发送同样格式的消息;导入Eclipse maven项目运行即可跑通。
spring boot 整合的netty 实现的socket的demo(包括服务端和客户端是分开的两个项目,导入idea,启动即可)。