《一个菜鸟游戏服务端的学习之路》第一章 IDEA中Netty框架的导入和简单使用

第一章,IDEA中Netty框架的导入和简单使用

1.IDEA导入Netty

Idea中导入netty有两种方式

一、在网上下载好Netty的jar包
https://netty.io/downloads.html
下载
在项目目录下创建lib目录,然后将netty的jar包放入其中。
jar包所在目录
这里我们需要的jar包路径在压缩包的all-in-one文件夹中。

在IDEA左侧目录下右键jar包,选择AddAsLibrary,即可将其导入项目。
add ad library

二、 使用Maven

进入项目设置(ctrl + shift + alt + S),选择Library,点击左上角的加号,选择From Maven,
在弹出的搜索框中输入netty-all,选择想要下载的版本后,勾选下面的DownLoad左边的勾,点击ok,即可导入成功。
maven下载netty

2.启动Netty

先写一个小demo,试试将netty启动

Main.java

public class Main {
    
    
    private static final String IP = "127.0.0.1";   // 写死IP
    private static final int PORT = 8088;           // 写死绑定的端口

    public static void main(String[] args) throws Exception {
    
    
        EventLoopGroup bossGroup = new NioEventLoopGroup();    // boss对象,用于监听socket连接
        EventLoopGroup workerGroup = new NioEventLoopGroup();  // worker对象,用于数据读写与处理逻辑
        ServerBootstrap bootstrap = new ServerBootstrap();  // 引导类,引导服务器的启动
        bootstrap
                .group(bossGroup, workerGroup)          // 双线程绑定
                .channel(NioServerSocketChannel.class)  // 指定IO模型为NIO
                .childHandler(new ChannelInitializer<SocketChannel>() {
    
         // 在这里面进行数据读写,业务处理逻辑
                    @Override
                    protected void initChannel(SocketChannel ch) throws Exception {
    
    
                        System.out.println("客户端连接:" + ch.remoteAddress()); // 打印客户端地址端口
                        ChannelPipeline pipeline = ch.pipeline();
                        pipeline.addLast("decoder", new StringDecoder());
                        pipeline.addLast("encoder", new StringEncoder());
                        pipeline.addLast(new SocketServerHandler());
                    }
                })
                .bind(IP, PORT).sync();
        System.out.println("服务器启动!");
    }
}
  • 其中,bootstrap是一个netty服务器启动引导类,首先绑定两个对象,boss和worker分别处理客户端连接与数据读写逻辑处理。
  • 接着调用channel(NioServerSocketChannel.class)设置IO模型为NIO。
  • 其次调用childHandler,设置一个用于引导channel初始化的类,重写initChannel,每当有新的客户端连接进来时,就会调用这里对channel进行初始化。

在initChannel方法中,pipline对象相当于一个流水线,在这里对pipline进行设置,也就意味着每当客户端传来新消息,都会顺着流水线对数据有序地进行处理,在这里我设置了string的解码和编码,经过打包后可以把客户端传来的数据还原成string类型。

  • 最下面加入了一个SocketServerHandler消息处理类,用于做具体的逻辑业务处理。

SocketServerHandler.java

public class SocketServerHandler extends SimpleChannelInboundHandler<String> {
    
    
    @Override
    protected void channelRead0(ChannelHandlerContext channelHandlerContext, String s) throws Exception {
    
    
        System.out.println(s);
    }
}

其中,SocketServerHandler是一个数据处理器,在里面实现的逻辑决定了连接创建以后和收到信息后该如何处理。
SocketServerHandler继承于SimpleChannelInboundHandler类,这里简单重写实现了channelRead0方法,对接收到的数据s进行输出。
码完后我们直接运行代码,可以得到如下结果:
服务器启动成功

3.运行测试

下面为了测试,我们简单撸一个测试用的客户端
Client.java

public class Client {
    
    
    public static void main(String[] args) {
    
    
        try {
    
    
            InetAddress addr;
            Socket socket = new Socket("127.0.0.1", 8088);
            addr = socket.getInetAddress();
            System.out.println("连接到" + addr);
            BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
            String lineString = "连接测试";
            writer.write(lineString);
            writer.flush();
            socket.close();
        } catch (IOException e) {
    
    
            System.out.println("无法连接");
            System.out.println(e);
        }
    }
}

这里撸的是一个简单的BIO程序,创建socket,连接到对应地址的对应端口,将测试数据发送到服务端,然后关闭socket。

直接运行,可以看到客户端控制台输出:
客户端输出
服务端控制台输出:
服务端输出

这里我们已经实现了由客户端向服务端发送信息。下一章我们学习如何用服务端向客户端发送信息。
https://blog.csdn.net/sinat_18538231/article/details/101565251

猜你喜欢

转载自blog.csdn.net/sinat_18538231/article/details/101175725
今日推荐