[Netty] - Netty入门(最简单的Netty客户端/服务器程序)
Java中的NIO是一种解决阻塞式IO问题的基本技术,但是NIO的编写对java程序员是有比较高的要求的。那么Netty就是一种简化操作的一个成熟的网络IO编程框架。这里简单介绍一个程序,代码是《netty in action》里面的,不过那个里面的实例有点问题,反正我没有跑成功,修改后成功。直接上代码:
一、服务器编写
Server代码,监听连接
- package com.gerry.netty.server;
- import io.netty.bootstrap.ServerBootstrap;
- import io.netty.channel.ChannelFuture;
- 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;
- public class EchoServer {
- private final int port;
- public EchoServer(int port) {
- this.port = port;
- }
- public void start() throws Exception {
- EventLoopGroup group = new NioEventLoopGroup();
- try {
- ServerBootstrap sb = new ServerBootstrap();
- sb.group(group) // 绑定线程池
- .channel(NioServerSocketChannel.class) // 指定使用的channel
- .localAddress(this.port)// 绑定监听端口
- .childHandler(new ChannelInitializer<SocketChannel>() { // 绑定客户端连接时候触发操作
- @Override
- protected void initChannel(SocketChannel ch) throws Exception {
- System.out.println("connected...; Client:" + ch.remoteAddress());
- ch.pipeline().addLast(new EchoServerHandler()); // 客户端触发操作
- }
- });
- ChannelFuture cf = sb.bind().sync(); // 服务器异步创建绑定
- System.out.println(EchoServer.class + " started and listen on " + cf.channel().localAddress());
- cf.channel().closeFuture().sync(); // 关闭服务器通道
- } finally {
- group.shutdownGracefully().sync(); // 释放线程池资源
- }
- }
- public static void main(String[] args) throws Exception {
- new EchoServer(65535).start(); // 启动
- }
- }
具体的处理客户端连接的代码
- package com.gerry.netty.server;
- import io.netty.buffer.Unpooled;
- import io.netty.channel.ChannelFutureListener;
- import io.netty.channel.ChannelHandlerContext;
- import io.netty.channel.ChannelInboundHandlerAdapter;
- public class EchoServerHandler extends ChannelInboundHandlerAdapter {
- @Override
- public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
- System.out.println("server channelRead...; received:" + msg);
- ctx.write(msg);
- }
- @Override
- public void channelReadComplete(ChannelHandlerContext ctx) throws Exception {
- System.out.println("server channelReadComplete..");
- // 第一种方法:写一个空的buf,并刷新写出区域。完成后关闭sock channel连接。
- ctx.writeAndFlush(Unpooled.EMPTY_BUFFER).addListener(ChannelFutureListener.CLOSE);
- //ctx.flush(); // 第二种方法:在client端关闭channel连接,这样的话,会触发两次channelReadComplete方法。
- //ctx.flush().close().sync(); // 第三种:改成这种写法也可以,但是这中写法,没有第一种方法的好。
- }
- @Override
- public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
- System.out.println("server occur exception:" + cause.getMessage());
- cause.printStackTrace();
- ctx.close(); // 关闭发生异常的连接
- }
- }
二、客户端编写
具体的连接代码
- package com.gerry.netty.client;
- import io.netty.bootstrap.Bootstrap;
- import io.netty.channel.ChannelFuture;
- 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.NioSocketChannel;
- import java.net.InetSocketAddress;
- public class EchoClient {
- private final String host;
- private final int port;
- public EchoClient() {
- this(0);
- }
- public EchoClient(int port) {
- this("localhost", port);
- }
- public EchoClient(String host, int port) {
- this.host = host;
- this.port = port;
- }
- public void start() throws Exception {
- EventLoopGroup group = new NioEventLoopGroup();
- try {
- Bootstrap b = new Bootstrap();
- b.group(group) // 注册线程池
- .channel(NioSocketChannel.class) // 使用NioSocketChannel来作为连接用的channel类
- .remoteAddress(new InetSocketAddress(this.host, this.port)) // 绑定连接端口和host信息
- .handler(new ChannelInitializer<SocketChannel>() { // 绑定连接初始化器
- @Override
- protected void initChannel(SocketChannel ch) throws Exception {
- System.out.println("connected...");
- ch.pipeline().addLast(new EchoClientHandler());
- }
- });
- System.out.println("created..");
- ChannelFuture cf = b.connect().sync(); // 异步连接服务器
- System.out.println("connected..."); // 连接完成
- cf.channel().closeFuture().sync(); // 异步等待关闭连接channel
- System.out.println("closed.."); // 关闭完成
- } finally {
- group.shutdownGracefully().sync(); // 释放线程池资源
- }
- }
- public static void main(String[] args) throws Exception {
- new EchoClient("127.0.0.1", 65535).start(); // 连接127.0.0.1/65535,并启动
- }
- }
连接成功后,具体的通信代码
- package com.gerry.netty.client;
- import java.nio.charset.Charset;
- import io.netty.buffer.ByteBuf;
- import io.netty.buffer.ByteBufUtil;
- import io.netty.buffer.Unpooled;
- import io.netty.channel.ChannelHandlerContext;
- import io.netty.channel.SimpleChannelInboundHandler;
- import io.netty.util.CharsetUtil;
- public class EchoClientHandler extends SimpleChannelInboundHandler<ByteBuf> {
- @Override
- public void channelActive(ChannelHandlerContext ctx) throws Exception {
- System.out.println("client channelActive..");
- ctx.writeAndFlush(Unpooled.copiedBuffer("Netty rocks!", CharsetUtil.UTF_8)); // 必须有flush
- // 必须存在flush
- // ctx.write(Unpooled.copiedBuffer("Netty rocks!", CharsetUtil.UTF_8));
- // ctx.flush();
- }
- @Override
- protected void channelRead0(ChannelHandlerContext ctx, ByteBuf msg) throws Exception {
- System.out.println("client channelRead..");
- ByteBuf buf = msg.readBytes(msg.readableBytes());
- System.out.println("Client received:" + ByteBufUtil.hexDump(buf) + "; The value is:" + buf.toString(Charset.forName("utf-8")));
- //ctx.channel().close().sync();// client关闭channel连接
- }
- @Override
- public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
- cause.printStackTrace();
- ctx.close();
- }
- }
三、结果
先运行server,在运行client即可。
[Netty] - Netty入门(最简单的Netty客户端/服务器程序)的更多相关文章
- [转]Netty入门(最简单的Netty客户端/服务器程序)
Java中的NIO是一种解决阻塞式IO问题的基本技术,但是NIO的编写对java程序员是有比较高的要求的.那么Netty就是一种简化操作的一个成熟的网络IO编程框架.这里简单介绍一个程序,代码是< ...
- Netty快速入门(06)Netty介绍
前面简单的介绍了Java I/O 和NIO,写了示例程序. Java I/O是阻塞的,为了让它支持多个并发,就要针对每个链接启动线程,这种方式的结果就是在海量链接的情况下,会创建海量的线程,就算用线程 ...
- Linux下select的用法--实现一个简单的回射服务器程序
1.先看man手册 SYNOPSIS /* According to POSIX.1-2001 */ #include <sys/select.h> / ...
- 【转】C# client 与java netty 服务端的简单通信,客户端采用Unity
http://blog.csdn.net/wilsonke/article/details/24721057 近日根据官方提供的通信例子自己写了一个关于Unity(C#)和后台通信的类,拿出来和大家分 ...
- 简单的TCPIP 客户端 服务器
// soClient.cpp : Defines the entry point for the console application. // #include "stdafx.h&qu ...
- 最简单的回射客户/服务器程序、time_wait 状态
下面通过最简单的客户端/服务器程序的实例来学习socket API. echoser.c 程序的功能是从客户端读取字符然后直接回射回去. C++ Code 1 2 3 4 5 6 7 8 9 10 ...
- Netty学习笔记(六) 简单的聊天室功能之WebSocket客户端开发实例
在之前的Netty相关学习笔记中,学习了如何去实现聊天室的服务段,这里我们来实现聊天室的客户端,聊天室的客户端使用的是Html5和WebSocket实现,下面我们继续学习. 创建客户端 接着第五个笔记 ...
- 关于Netty的入门使用
Netty介绍: Netty是一个提供异步事件驱动的网络应用框架,用以快速开发高性能.高可靠性的网络服务器和客户端程序. 换句话说,Netty是一个NIO框架,使用它可以简单快速地开发网络应用程序,比 ...
- Netty学习笔记(四) 简单的聊天室功能之服务端开发
前面三个章节,我们使用了Netty实现了DISCARD丢弃服务和回复以及自定义编码解码,这篇博客,我们要用Netty实现简单的聊天室功能. Ps: 突然想起来大学里面有个课程实训,给予UDP还是TCP ...
随机推荐
- Maven的安装环境配置
一.Maven的安装 二.Maven的配置 Settings.xml可以用来定义本地仓库.远程仓库.联网代理 Settings.xml文件可以存在两个地方: 1.多用户情况 conf目录下 2.单用户 ...
- 弹出式菜单(下拉菜单)实现——PopupMenu
PopupMenu代表弹出式菜单,它会在指定组件上弹出PopupMenu,默认情况下,PopupMenu会显示在该组件的下方或上方.PopupMenu可增加多个菜单项,并可为菜单项增加子菜单. 使用P ...
- 解析xml的问题未解决
工作上需要解析xml,目前的逻辑是:解析xml到对象中,然后对象再插入数据库.但这存在内存溢出的风险. 今天做的另外一件事是将循环用到工作上,暂时还没有测试,是否能保证程序的重启.有待观察 ##### ...
- C++指针与const
在C++中,const修饰符一般用于修饰常量.常量在定义的时候必须初始化,而且值一旦定义之后就不能修改,这样就能保证常量的值在程序运行过程中不会发生变换. 1.指向const对象的指针 指向const ...
- jQuery初始化
jQuery 初始化的理解 var jQuery = function( selector, context ) { // The jQuery object is actually just the ...
- PHP mysqli连接MySQL数据库
1. 开启PHP的API支持 (1)首先修改您的php.ini的配置文件.查找下面的语句:;extension=php_mysqli.dll将其修改为:extension=php_mysqli.dll ...
- js dorado
1.dorado http://bsdn.org/projects/dorado7/deploy/sample-center/com.bstek.dorado.sample.Main.d#40350
- Delphi基本图像处理方法汇总
这篇文章主要介绍了Delphi基本图像处理方法,实例汇总了Delphi操作图像实现浮雕.反色.模糊.翻转等常用效果的方法,非常具有实用价值,需要的朋友可以参考下 本文实例汇总了Delphi基本图像 ...
- ASP.NET速度优化
用过ASP.NET的人都知道吧,页面首次打开很慢,本来网站第一次启动就慢,但别的页面如果没有访问过的第一次访问也会慢. 原因:asp.net程序第一次运行需要验证数字签名,这个验证需要远程连接微软服务 ...
- 小试 Ninja
Ninja 是最近冒出来的一个 build system,它很像 make,然而效率更高,对大项目支持更好.当然我用 Ninja 和效率无关(我又没有那种有几百个中间目标的 C++ 项目要 build ...