Java NIO框架Netty教程(一) – Hello Netty

先啰嗦两句,如果你还不知道Netty是做什么的能做什么。那可以先简单的搜索了解一下。我只能说Netty是一个NIO的框架,可以用于开发分布式的Java程序。具体能做什么,各位可以尽量发挥想象。技术,是服务于人而不是局限住人的。

 
Netty的简介和下载可参考:《 开源Java高性能NIO框架推荐 – Netty》。注意,此时的最新版已经为3.5.2.Final。
 
如果你已经万事具备,那么我们先从一段代码开始。程序员们习惯的上手第一步,自然是"Hello world",不过Netty官网的例子却偏偏抛弃了"Hello world"。那我们就自己写一个最简单的"Hello world"的例子,作为上手。

?
HelloServer.java
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
/**
  * Netty 服务端代码
  *
  * @author lihzh
  * @alia OneCoder
  */
public class HelloServer {
 
     public static void main(String args[]) {
         // Server服务启动器
         ServerBootstrap bootstrap = new ServerBootstrap(
                 new NioServerSocketChannelFactory(
                         Executors.newCachedThreadPool(),
                         Executors.newCachedThreadPool()));
         // 设置一个处理客户端消息和各种消息事件的类(Handler)
         bootstrap
                 .setPipelineFactory( new ChannelPipelineFactory() {
                     @Override
                     public ChannelPipeline getPipeline()
                             throws Exception {
                         return Channels
                                 .pipeline( new HelloServerHandler());
                     }
                 });
         // 开放8000端口供客户端访问。
         bootstrap.bind( new InetSocketAddress( 8000 ));
     }
 
     private static class HelloServerHandler extends
             SimpleChannelHandler {
 
         /**
          * 当有客户端绑定到服务端的时候触发,打印"Hello world, I'm server."
          *
          * @alia OneCoder
          * @author lihzh
          */
         @Override
         public void channelConnected(
                 ChannelHandlerContext ctx,
                 ChannelStateEvent e) {
             System.out.println( "Hello world, I'm server." );
         }
     }
}
?
HelloClient.java
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
/**
  * Netty 客户端代码
  *
  * @author lihzh
  * @alia OneCoder
  */
public class HelloClient {
 
     public static void main(String args[]) {
         // Client服务启动器
         ClientBootstrap bootstrap = new ClientBootstrap(
                 new NioClientSocketChannelFactory(
                         Executors.newCachedThreadPool(),
                         Executors.newCachedThreadPool()));
         // 设置一个处理服务端消息和各种消息事件的类(Handler)
         bootstrap.setPipelineFactory( new ChannelPipelineFactory() {
             @Override
             public ChannelPipeline getPipeline() throws Exception {
                 return Channels.pipeline( new HelloClientHandler());
             }
         });
         // 连接到本地的8000端口的服务端
         bootstrap.connect( new InetSocketAddress(
                 "127.0.0.1" , 8000 ));
     }
 
     private static class HelloClientHandler extends SimpleChannelHandler {
 
 
         /**
          * 当绑定到服务端的时候触发,打印"Hello world, I'm client."
          *
          * @alia OneCoder
          * @author lihzh
          */
         @Override
         public void channelConnected(ChannelHandlerContext ctx,
                 ChannelStateEvent e) {
             System.out.println( "Hello world, I'm client." );
         }
     }
}
既然是分布式的,自然要分多个服务。Netty中,需要区分Server和Client服务。所有的Client都是绑定在Server上的,他们之间是不能通过Netty直接通信的。(自己采用的其他手段,不包括在内。)。白话一下这个通信过程,Server端开放端口,供Client连接,Client发起请求,连接到Server指定的端口,完成绑定。随后便可自由通信。其实就是普通Socket连接通信的过程。
 
Netty框架是基于事件机制的,简单说,就是发生什么事,就找相关处理方法。就跟着火了找119,抢劫了找110一个道理。所以,这里,我们处理的是当客户端和服务端完成连接以后的这个事件。什么时候完成的连接,Netty知道,他告诉我了,我就负责处理。这就是框架的作用。Netty,提供的事件还有很多,以后会慢慢的接触和介绍。
 
你应该已经可以上手了:)
  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是使用Netty搭建TCP服务器的示例代码(Hello World): ```java 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 HelloWorldServer { private final int port; public HelloWorldServer(int port) { this.port = port; } public void run() throws Exception { // 创建两个 EventLoopGroup,一个用于接收客户端连接,一个用于处理客户端请求 EventLoopGroup bossGroup = new NioEventLoopGroup(); EventLoopGroup workerGroup = new NioEventLoopGroup(); try { // 创建 ServerBootstrap 对象,用于配置服务器 ServerBootstrap b = new ServerBootstrap(); b.group(bossGroup, workerGroup) .channel(NioServerSocketChannel.class) .childHandler(new ChannelInitializer<SocketChannel>() { @Override public void initChannel(SocketChannel ch) throws Exception { // 添加消息处理器 ch.pipeline().addLast(new HelloWorldServerHandler()); } }); // 绑定端口,开始接收客户端请求 ChannelFuture f = b.bind(port).sync(); // 等待服务器 socket 关闭 f.channel().closeFuture().sync(); } finally { // 释放资源 workerGroup.shutdownGracefully(); bossGroup.shutdownGracefully(); } } public static void main(String[] args) throws Exception { int port = 8080; new HelloWorldServer(port).run(); } } ``` 其中,`HelloWorldServerHandler` 是自定义的消息处理器,可以根据需要进行处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值