netty初步学习

在网上学了好几个netty入门,后来去bilibili学过来的入门。

学习链接:https://www.bilibili.com/video/av15277109/

个人理解:netty好多地方可以使用,是基于NIO技术的框架实现,我理解的NIO(new IO),是一种非阻塞式IO,使用单线程或多线程处理多并发业务,使用selector获取每条线程的信息。无需全部轮询线程后才知道那个线程空闲才去执行,而且使用的是ByteBuf这种缓存区类型,读到文章有说,本来本地数据是从硬盘到电脑缓存再到程序缓存的多次拷贝数据,导致数据传输缓慢,而使用NIO,可以在中间开辟空间,直接使用channel 读取到公共部分缓冲区,实现零拷贝,我理解的是ByteBuf这种东西,NIO还没去看,见谅。

附上netty代码:

下面是使用netty做的网络通讯,还没使用scanner做出聊天室效果,只是小demo

服务端类

package com.java.Olym.netty;

import io.netty.bootstrap.ServerBootstrap;
import io.netty.channel.ChannelFuture;
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.logging.LogLevel;
import io.netty.handler.logging.LoggingHandler;
import io.netty.handler.timeout.ReadTimeoutHandler;

public class NettyServer {
	
	public void bind(int port) throws Exception{
		EventLoopGroup bgroup = new NioEventLoopGroup();//在外等待连接的通道
		EventLoopGroup pgroup = new NioEventLoopGroup();//与client连接的通道
		try {
			ServerBootstrap b = new ServerBootstrap();
			b.group(bgroup,pgroup)
				.channel(NioServerSocketChannel.class)//server通道
				.option(ChannelOption.SO_BACKLOG, 1024)
				.handler(new LoggingHandler(LogLevel.INFO))//设置日志
				.childHandler(new ChannelInitializer<SocketChannel>() {
					@Override
					protected void initChannel(SocketChannel ch) throws Exception {
						ch.pipeline().addLast(new ServerHandler());//设置到业务处理的handler
						ch.pipeline().addLast(new ReadTimeoutHandler(5));//设置超时时间断开设置
					}
				});
			ChannelFuture cf = b.bind(port).sync();//绑定端口
			cf.channel().closeFuture().sync();
		}finally{
			//必须关闭的两个通道,会有数据在里面堆积
			bgroup.shutdownGracefully();
			pgroup.shutdownGracefully();
		}
	}
	public static void main(String[] args) throws Exception {
		int port = 8089;
		new NettyServer().bind(port);//启动server服务
	}
}

server的业务处理类 

package com.java.Olym.netty;

import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;

public class ServerHandler extends ChannelInboundHandlerAdapter{

	@Override
	public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
		ByteBuf buf = (ByteBuf)msg;//netty socket通信使用ByteBuf
		System.out.println("The server recive massage:"+buf.toString());
		ctx.writeAndFlush(buf);//写出消息并刷新出去消息 到客户端
	}

	@Override
	public void channelReadComplete(ChannelHandlerContext ctx) throws Exception {
//		ctx.flush();
	}

	@Override
	public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
		ctx.close();
	}
}

客户端类

package com.java.Olym.netty;

import java.net.InetSocketAddress;

import ch.qos.logback.core.util.TimeUtil;
import io.netty.bootstrap.Bootstrap;
import io.netty.channel.ChannelFuture;
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.NioSocketChannel;
import io.netty.handler.logging.LogLevel;
import io.netty.handler.logging.LoggingHandler;
import io.netty.handler.timeout.ReadTimeoutHandler;

public class NettyClient {
	
	
	private static class SingletonHolder{
		static final NettyClient instance = new NettyClient();
	}
	public static NettyClient getInstance(){
		return SingletonHolder.instance;
	}
	
	private EventLoopGroup group;
	private Bootstrap b;
	private ChannelFuture cf;
	public NettyClient(){
		group = new NioEventLoopGroup();//客户端只需一个与server连接的通道
		b = new Bootstrap();
		b.group(group)
		.channel(NioSocketChannel.class)//设置nio通道
		.handler(new LoggingHandler(LogLevel.INFO))		//设置日志
//		.option(ChannelOption.SO_BROADCAST,true)
//		.remoteAddress(new InetSocketAddress(host, port))
		.handler(new ChannelInitializer<SocketChannel>() {
			@Override
			protected void initChannel(SocketChannel ch) throws Exception {
				ch.pipeline().addLast(new ClientHandler());//设置客户端业务处理模块
				ch.pipeline().addLast(new ReadTimeoutHandler(5));//超时时间设置为5s
			}
		});
	}
	//连接
	public void connect(){
		try {
			this.cf = b.connect("127.0.0.1",8089).sync();
			System.out.println("服务连接,可数据交换");
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	//设置第一次连接或超时断开后使用重连
	public ChannelFuture getChannelFuture(){
		if(this.cf!=null){
			this.connect();
		}
		if(!this.cf.channel().isActive()){
			this.connect();
		}
		return this.cf;
	}
	public static void main(String[] args) throws Exception {
		final NettyClient c = NettyClient.getInstance();
		c.connect();
		ChannelFuture cf = c.getChannelFuture();
		for(int i=0;i<3;i++){
			cf.channel().writeAndFlush("在下");
			Thread.sleep(4000);//睡眠测试
		}
		cf.channel().closeFuture().sync();
	}
}

客户端业务处理类

package com.java.Olym.netty;

import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler;
import io.netty.util.CharsetUtil;

public class ClientHandler extends SimpleChannelInboundHandler<ByteBuf>{

	@Override
	protected void channelRead0(ChannelHandlerContext arg0, ByteBuf in) throws Exception {
		System.out.println("Client recived :"+in.toString(CharsetUtil.UTF_8));
	}

	@Override
	public void channelActive(ChannelHandlerContext ctx) throws Exception {
		ctx.writeAndFlush(Unpooled.copiedBuffer("Netty rock!",CharsetUtil.UTF_8));//写出刷新数据给服务器端
	}

	@Override
	public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
		cause.printStackTrace();
		ctx.close();
	}

}
就不测试了
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
4S店客户管理小程序-毕业设计,基于微信小程序+SSM+MySql开发,源码+数据库+论文答辩+毕业论文+视频演示 社会的发展和科学技术的进步,互联网技术越来越受欢迎。手机也逐渐受到广大人民群众的喜爱,也逐渐进入了每个用户的使用。手机具有便利性,速度快,效率高,成本低等优点。 因此,构建符合自己要求的操作系统是非常有意义的。 本文从管理员、用户的功能要求出发,4S店客户管理系统中的功能模块主要是实现管理员服务端;首页、个人中心、用户管理、门店管理、车展管理、汽车品牌管理、新闻头条管理、预约试驾管理、我的收藏管理、系统管理,用户客户端:首页、车展、新闻头条、我的。门店客户端:首页、车展、新闻头条、我的经过认真细致的研究,精心准备和规划,最后测试成功,系统可以正常使用。分析功能调整与4S店客户管理系统实现的实际需求相结合,讨论了微信开发者技术与后台结合java语言和MySQL数据库开发4S店客户管理系统的使用。 关键字:4S店客户管理系统小程序 微信开发者 Java技术 MySQL数据库 软件的功能: 1、开发实现4S店客户管理系统的整个系统程序; 2、管理员服务端;首页、个人中心、用户管理、门店管理、车展管理、汽车品牌管理、新闻头条管理、预约试驾管理、我的收藏管理、系统管理等。 3、用户客户端:首页、车展、新闻头条、我的 4、门店客户端:首页、车展、新闻头条、我的等相应操作; 5、基础数据管理:实现系统基本信息的添加、修改及删除等操作,并且根据需求进行交流信息的查看及回复相应操作。
现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本微信小程序医院挂号预约系统就是在这样的大环境下诞生,其可以帮助管理者在短时间内处理完毕庞大的数据信息,使用这种软件工具可以帮助管理人员提高事务处理效率,达到事半功倍的效果。此微信小程序医院挂号预约系统利用当下成熟完善的SSM框架,使用跨平台的可开发大型商业网站的Java语言,以及最受欢迎的RDBMS应用软件之一的MySQL数据库进行程序开发。微信小程序医院挂号预约系统有管理员,用户两个角色。管理员功能有个人中心,用户管理,医生信息管理,医院信息管理,科室信息管理,预约信息管理,预约取消管理,留言板,系统管理。微信小程序用户可以注册登录,查看医院信息,查看医生信息,查看公告资讯,在科室信息里面进行预约,也可以取消预约。微信小程序医院挂号预约系统的开发根据操作人员需要设计的界面简洁美观,在功能模块布局上跟同类型网站保持一致,程序在实现基本要求功能时,也为数据信息面临的安全问题提供了一些实用的解决方案。可以说该程序在帮助管理者高效率地处理工作事务的同时,也实现了数据信息的整体化,规范化与自动化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值