Netty4.0 简单服务器应用

        Netty是JBOSS提供的一套异步的、事件驱动的网络应用程序开源框架。可以用来快速开发高性能的服务器程序或者客户端程序。本文简单介绍服务端编写,主要程序基本上都是官网上的例子,查阅网上的资料和文档写了一些的注释,测试的客户端就简单使用socket,没有使用netty框架了。

        声明一下,程序依赖的netty是4.0版本。

首先要对网络编程有一定的了解,先看看服务端的代码,就不多做解释了,里面有注释。

server 端:

package server;

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;

public class SocketServer {

	private int port;
	
	
	public SocketServer(int port) {
		this.port = port;
	}
	
	public void run() throws Exception {
		//NioEventLoopGroup是一个多线程的I/O操作事件循环池(参数是线程数量)
		//bossGroup主要用于接受所有客户端对服务端的连接
		EventLoopGroup bossGroup = new NioEventLoopGroup(1);
		
		//当有新的连接进来时将会被注册到workerGroup(不提供参数,会使用默认的线程数)
		EventLoopGroup workerGroup = new NioEventLoopGroup();

		try {
			//ServerBootstrap是设置服务器的辅助类
			ServerBootstrap bs = new ServerBootstrap();
			
			//group方法是将上面创建的两个EventLoopGroup实例指定到ServerBootstrap实例中去
			bs.group(bossGroup, workerGroup)
					//channel方法用来创建通道实例(NioServerSocketChannel类来实例化一个进来的连接)
					.channel(NioServerSocketChannel.class)
					//为新连接到服务器的handler分配一个新的channel。ChannelInitializer用来配置新生成的channel。(如需其他的处理,继续ch.pipeline().addLast(新匿名handler对象)即可)
					.childHandler(new ChannelInitializer<SocketChannel>() {
						@Override
						public void initChannel(SocketChannel ch) throws Exception {
							//处理逻辑放到SocketHandler类中去
							ch.pipeline().addLast(new SocketHandler());
						}
 					})
 					//option()方法用于设置监听套接字
 					.option(ChannelOption.SO_BACKLOG, 128)
 					//childOption()方法用于设置和客户端连接的套接字
 					.childOption(ChannelOption.SO_KEEPALIVE, true);
			
			// Bind and start to accept incoming connections
			ChannelFuture cf = bs.bind(this.port).sync();
			
            // Wait until the session socket is closed.
            // shut down your session.
            cf.channel().closeFuture().sync();
		} finally {
			//关闭相关资源
			workerGroup.shutdownGracefully();
			bossGroup.shutdownGracefully();	
		}
	}
	
	
	public static void main(String[] args) throws Exception {
		
		new SocketServer(8080).run();
	}

}
server逻辑处理:
package server;

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


public class SocketHandler extends ChannelInboundHandlerAdapter {
	
	@Override
	public void channelRead(ChannelHandlerContext ctx, Object msg) {
		
		ByteBuf in = (ByteBuf)msg;
		
		byte[] b = new byte[50];
		int i = 0;
		try {
			while (in.isReadable()) {
				b[i++] = in.readByte();
				System.out.flush();
			}
		} finally {
			in.release();
		}

		String s = new String(b);
		System.out.println(s);
		
		//若要将数据发回客户端只需要这样修改
		//根据msg做相应的逻辑处理
		//ctx.write(msg);
		//ctx.flush();		
	}
	
	@Override
	public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {
		//close the connection when an exception is raise
		cause.printStackTrace();
		ctx.close();
	}
}

客户端就非常简单了,只是创建了一个tcp的socket,带了一些字符串信息,测试服务端是否完整收发送的内容。

client代码:

package server;

import java.io.OutputStream;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.net.SocketAddress;


public class TestClient {

	public static void main(String[] args) {
		
		try {
			Socket socket = new Socket();
			SocketAddress sa = new InetSocketAddress("127.0.0.1", 8080);
			socket.connect(sa, 10000);
			
			String msg = "hello, this is client";
			byte[] byteMsg = msg.getBytes();
			
			OutputStream os = socket.getOutputStream();
			os.write(byteMsg);
			
			os.close();
			socket.close();
			
		} catch (Exception e) {
			e.printStackTrace();
		}
		

	}

}
控制台打印信息:

hello, this is client

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Netty 4.0Netty 3.0 的区别有以下几点: 1. 支持的 Java 版本:Netty 4.0 支持的 Java 版本是 Java 7 及以上,而 Netty 3.0 只支持 Java 6 及以上。 2. 架构改变:Netty 4.0 在架构上做了很大的改变,使用了与 3.0 不同的组件和 API。 3. 性能提升:Netty 4.0 在性能上有了很大的提升,比 3.0 快得多。 4. 异步改进:Netty 4.0 对异步操作进行了改进,使用了更加高效的方式来处理异步任务。 5. 新的编解码器:Netty 4.0 新增了一些编解码器,支持更多的协议。 6. 更多的优化:Netty 4.0 还进行了更多的优化,比如支持堆外内存、增强的零拷贝等。 ### 回答2: Netty 4.0Netty 3.0是Java网络编程框架Netty的两个版本。它们之间存在以下区别: 1. 性能提升:Netty 4.0相较于Netty 3.0在性能方面有显著提升。Netty 4.0经过了全面的优化和重构,引入了许多新的特性和改进,使其在处理网络通信时更加高效。 2. API的变化:Netty 4.0对API进行了重构和简化,使得编程接口更加易用和灵活。比如,Netty 4.0引入了ChannelPipelineHandler的概念,可以更加方便地添加和管理多个处理器。 3. 事件处理模型:Netty 4.0采用了新的事件处理模型,即Reactor模型,使得在高并发场景下的事件处理更加高效。而Netty 3.0采用的是NIO Selector模型。 4. 内存管理:Netty 4.0引入了更高级的内存管理机制,即ByteBuf和Recycler。ByteBuf提供了更加灵活的内存分配和回收方式,减少了内存的创建和销毁开销。Recycler可以对对象进行重用,减少了频繁的对象创建和垃圾回收开销。 5. 异常处理:Netty 4.0对异常处理进行了优化,提供了更加丰富的异常类型和处理方式。Netty 3.0在异常处理方面相对简单。 总的来说,Netty 4.0相较于Netty 3.0在性能、API设计、事件处理模型、内存管理和异常处理方面都有较大的改进和优化。因此,Netty 4.0更加适合开发高性能、高并发的网络应用程序。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值