Netty——简单创建服务器、客户端通讯
Netty 是一个基于NIO的客户、服务器端编程框架,使用Netty 可以确保你快速和简单的开发出一个网络应用,例如实现了某种协议的客户,服务端应用。Netty相当简化和流线化了网络应用的编程开发过程,例如,TCP和UDP的socket服务开发。
Netty简单来说就是socket通讯,支持多协议的通讯
对 创建 netty 的过程作了详细的解析
1、简单创建一个Netty服务器
- package com.netty.test;
- import java.net.InetAddress;
- import io.netty.bootstrap.ServerBootstrap;
- import io.netty.channel.ChannelFuture;
- import io.netty.channel.ChannelHandlerContext;
- import io.netty.channel.ChannelInboundHandlerAdapter;
- 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.NioServerSocketChannel;
- import io.netty.handler.codec.DelimiterBasedFrameDecoder;
- import io.netty.handler.codec.Delimiters;
- import io.netty.handler.codec.string.StringDecoder;
- import io.netty.handler.codec.string.StringEncoder;
- /**
- * Netty4 服务端代码
- *
- */
- public class HelloWorldServer {
- public static void main(String[] args) {
- // EventLoop 代替原来的 ChannelFactory
- EventLoopGroup bossGroup = new NioEventLoopGroup();
- EventLoopGroup workerGroup = new NioEventLoopGroup();
- try {
- ServerBootstrap serverBootstrap = new ServerBootstrap(); //创建 一个netty 服务器
- // server端采用简洁的连写方式,client端才用分段普通写法。
- serverBootstrap.group(bossGroup, workerGroup)
- .channel(NioServerSocketChannel.class) // 指定channel[通道]类型
- .childHandler(new ChannelInitializer<SocketChannel>() { // 指定Handler [操纵者]
- @Override
- public void initChannel(SocketChannel ch) throws Exception {
- // 以("\n")为结尾分割的 解码器
- ch.pipeline().addLast("framer", new DelimiterBasedFrameDecoder(8192, Delimiters.lineDelimiter()));
- // 字符串 解码 和 编码 默认的 StringDecoder 字符串形式输出
- ch.pipeline().addLast("decoder", new StringDecoder());
- ch.pipeline().addLast("encoder", new StringEncoder());
- ch.pipeline().addLast(new HelloServerHandler()); // 添加自己的对 上传数据的处理
- }
- }).option(ChannelOption.SO_KEEPALIVE, true);
- ChannelFuture f = serverBootstrap.bind(8000).sync(); // 绑定 8000 端口
- f.channel().closeFuture().sync();
- }
- catch (InterruptedException e) {
- } finally {
- workerGroup.shutdownGracefully(); // 销毁 netty
- bossGroup.shutdownGracefully();
- }
- }
- /**
- * 自己对 处理数据
- *
- * @author flm
- * 2017年11月10日
- */
- private static class HelloServerHandler extends ChannelInboundHandlerAdapter {
- @Override
- public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
- // 收到消息直接打印输出
- System.out.println(ctx.channel().remoteAddress() + " Say : " + msg);
- // 返回客户端消息 - 我已经接收到了你的消息
- ctx.writeAndFlush("server Received your message !\n");
- }
- /*
- *
- * 覆盖 channelActive 方法 在channel被启用的时候触发 (在建立连接的时候)
- *
- * channelActive 和 channelInActive 在后面的内容中讲述,这里先不做详细的描述
- */
- @Override
- public void channelActive(ChannelHandlerContext ctx) throws Exception {
- System.out.println("RamoteAddress : " + ctx.channel().remoteAddress() + " active !");
- ctx.writeAndFlush("Welcome to " + InetAddress.getLocalHost().getHostName() + " service!\n"); //回复
- super.channelActive(ctx);
- }
- }
2、netty 客户端 创建
- package com.netty.test;
- import java.net.InetSocketAddress;
- import java.util.Date;
- import io.netty.bootstrap.Bootstrap;
- import io.netty.channel.Channel;
- import io.netty.channel.ChannelHandlerContext;
- import io.netty.channel.ChannelInboundHandlerAdapter;
- import io.netty.channel.ChannelInitializer;
- import io.netty.channel.ChannelPipeline;
- import io.netty.channel.nio.NioEventLoopGroup;
- import io.netty.channel.socket.nio.NioSocketChannel;
- import io.netty.handler.codec.DelimiterBasedFrameDecoder;
- import io.netty.handler.codec.Delimiters;
- import io.netty.handler.codec.string.StringDecoder;
- import io.netty.handler.codec.string.StringEncoder;
- /**
- * Netty4 客户端代码
- *
- */
- public class HelloWorldClient {
- public static void main(String args[]) {
- // Bootstrap,且构造函数变化很大,这里用无参构造。
- Bootstrap bootstrap = new Bootstrap();
- // 指定channel[通道]类型
- bootstrap.channel(NioSocketChannel.class);
- // 指定Handler [操纵者]
- bootstrap.handler(new ChannelInitializer<Channel>() {
- @Override
- protected void initChannel(Channel ch) throws Exception {
- ChannelPipeline pipeline = ch.pipeline();
- /*
- * 这个地方的 必须和服务端对应上。否则无法正常解码和编码
- *
- */
- pipeline.addLast("framer", new DelimiterBasedFrameDecoder(8192, Delimiters.lineDelimiter()));
- pipeline.addLast("decoder", new StringDecoder());
- pipeline.addLast("encoder", new StringEncoder());
- // 客户端的逻辑,自己对数据处理
- pipeline.addLast(new HelloClientHandler());
- }
- });
- // 指定EventLoopGroup [事件 组]
- bootstrap.group(new NioEventLoopGroup());
- // 连接到本地的8000端口的服务端
- bootstrap.connect(new InetSocketAddress("127.0.0.1", 8000));
- }
- /**
- * 客户端的逻辑,自己对数据处理
- *
- * @author flm
- * 2017年11月10日
- */
- private static class HelloClientHandler extends ChannelInboundHandlerAdapter {
- /*
- * 监听 服务器 发送来的数据
- */
- @Override
- public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
- System.out.println("Server say : " + msg.toString());
- }
- /*
- * 启动客户端 时触发
- */
- @Override
- public void channelActive(ChannelHandlerContext ctx) throws Exception {
- System.out.println("Client active ");
- ctx.writeAndFlush("我是 client " + new Date() + "\n");
- super.channelActive(ctx);
- }
- /*
- * 关闭 客户端 触发
- */
- @Override
- public void channelInactive(ChannelHandlerContext ctx) throws Exception {
- System.out.println("Client close ");
- super.channelInactive(ctx);
- }
- }
- }
Netty——简单创建服务器、客户端通讯的更多相关文章
- 运用socket实现简单的服务器客户端交互
Socket解释: 网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket. Socket的英文原义是“孔”或“插座”.作为BSD UNIX的进程通信机制,取后一种意 ...
- 【Netty】Netty简介及服务器客户端简单开发流程
什么是Netty Netty是一个基于Java NIO的编写客服端服务器的框架,是一个异步事件框架. 官网https://netty.io/ 为什么选择Netty 由于JAVA NIO编写服务器的过程 ...
- 【Echo】实验 -- 实现 C/C++下TCP, 服务器/客户端 通讯
本次实验利用TCP/IP, 语言环境为 C/C++ 利用套接字Socket编程,实现Server/CLient 之间简单的通讯. 结果应为类似所示: 下面贴上代码(参考参考...) Server 部分 ...
- 【Echo】实验 -- 实现 C/C++下UDP, 服务器/客户端 通讯
本次实验利用UDP协议, 语言环境为 C/C++ 利用套接字Socket编程,实现Server/CLient 之间简单的通讯. 结果应为类似所示: 下面贴上代码(参考参考...) Server 部分: ...
- Windows Socket 编程_ 简单的服务器/客户端程序
转载自:http://blog.csdn.net/neicole/article/details/7459021 一.程序运行效果图 二.程序源代码 三.程序设计相关基础知识 1.计算机网络 2 ...
- 简单实现服务器/客户端的c代码
#include<stdio.h> #include<stdlib.h> #include<string.h> #include<sys/types.h> ...
- Java新AIO/NIO2:AsynchronousServerSocketChannel和AsynchronousSocketChannel简单服务器-客户端
Java新AIO/NIO2:AsynchronousServerSocketChannel和AsynchronousSocketChannel简单服务器-客户端用AsynchronousServerS ...
- Netty创建服务器与客户端
Netty 创建Server服务端 Netty创建全部都是实现自AbstractBootstrap.客户端的是Bootstrap,服务端的则是ServerBootstrap. 创建一个 HelloSe ...
- macos下简单的socket服务器+客户端
TCP客户端服务器编程模型: 服务器: 调用socket函数创建套接字 调用bind绑定本地IP和端口 调用listen启动监听(准备好接收客户端链接的队列) 调用accept从已连接队列中提取第一个 ...
随机推荐
- HDU 5976 数学
Detachment Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total ...
- S2_SQL_第三章
3.1:修改表 3.1.1:修改表 语法: Alter table <旧表名> rename [ TO] <新表名>; 例子:Alter table `demo01` rena ...
- Node.js学习之TCP/IP数据通讯
Node.js学习之TCP/IP数据通讯 1.使用net模块实现基于TCP的数据通讯 提供了一个net模块,专用于实现TCP服务器与TCP客户端之间的通信 1.1创建TCP服务器 在Node.js利用 ...
- C-图文上边对齐
1.效果 1.1 样式设置 2 效果 2.1 样式
- Ubuntu 14.04 安装 Sublime Text 3
1. 实验环境 Ubuntu 14.04 + Sublime text 3 2. sublime text介绍 ublime Text 是一款流行的文本编辑器软件,有点类似于TextMate,跨平台, ...
- 关于java的自动拆装箱若干细节问题
一.首先需要了解的几个前提: 1.自动装箱过程是通过调用valueOf方法实现的(如Integer.valueOf(10)),而拆箱过程是通过调用包装器的 xxxValue方法实现的(如Integer ...
- Charle抓包与wireshark使用
今天就来看一下Mac上如何进行抓包,之前有一篇文章介绍了使用Fidder进行抓包 http://blog.csdn.net/jiangwei0910410003/article/details/198 ...
- Android 性能优化概念(1)
http://www.open-open.com/lib/view/open1421723359718.html#_label0 阅读目录 0)Render Performance 1)Underst ...
- oracle导不出空表的解决办法
1.先进行表分析(一定要执行此步,否则查询空表可能不准确) select 'analyze table '||table_name||' compute statistics;' from user_ ...
- 【转】深入浅出:Linux设备驱动之字符设备驱动
深入浅出:Linux设备驱动之字符设备驱动 一.linux系统将设备分为3类:字符设备.块设备.网络设备.使用驱动程序: 字符设备:是指只能一个字节一个字节读写的设备,不能随机读取设备内存中的某一数据 ...