### 前言

在之前的文章我已经讲过了利用`Netty`实现`UDP`客户端,大家有兴趣的话,可以参看下面文章:

[Netty实现UDP客户端](https://www.jianshu.com/p/5dbc6b3c9d94)

今天就让我们来学习下利用`Netty`实现`UDP`服务端吧,这里我经过整合封装,主要涉及到两个类:`UnServerHandler`和`UnServer`,下面就来讲讲它们的使用吧。

今天涉及内容:

1. `netty` jar 包导入

2. `UnServerHandler`和`UnServer`简介

3. `UnServer`服务端在主函数中的使用

4. 需要注意的问题

5. 效果图和项目结构图

先来波效果图

![效果图.gif](/contentImages/image/20200612/MBRkLRd34CgjqsYIDV5.gif)

![客户端日志.png](/contentImages/image/20200612/OMnaDqqHbDZ5IjM3HPP.png)

![服务端日志.png](/contentImages/image/20200612/KGZ5HgUSrB9tyEHidkG.png)

#### 一. netty jar 包导入

`UnServer`是利用`Netty`实现的`UDP服务端`,所以需要用到`netty` jar 包。我用的版本是`netty-all-5.0.0.Alpha2.jar`。首先我们要在你项目的 `项目/app/`下建`lib`文件夹,建成后路径为:`项目/app/lib/`,然后将`netty-all-5.0.0.Alpha2.jar` 复制 到 `项目/app/lib/` 文件夹下。选中`netty-all-5.0.0.Alpha2.jar` 右键,选择 `add As Library...`,然后打开你`app_module`对应的`build.gradle`,看到以下代码:

```
implementation files('libs/netty-all-5.0.0.Alpha2.jar')
```

则表示你`jar包`导入成功。

`netty` jar 包你可以在`Netty`官网下,当然这里我也提供下`netty-all-5.0.0.Alpha2.jar`下载地址:

[netty-all-5.0.0.Alpha2.jar下载]()

#### 二. UnServerHandler 和 UnServer 简介

`UnServerHandler`是`UnServer`类的一个辅助类,主要是在`UnServer`中使用,大家只做了解,而真正要使用的类是`UnServer`服务端类。下面主要介绍下`UnServer`类中的一些常用方法:

```
/***
* 初始化对象,设置端口,字符集
*
* @param port 端口范围:0-65535
* @param charsetName 字符编码集:如 TcpConfig.UTF_8 或 TcpConfig.GBK
*/
public UnServer(int port,String charsetName)
/***
* 建立udp服务端
*
* @param listener 接收和返回数据给udp客户端的监听
*/
public void start(UnServerHandler.OnChannelListener listener)
```
####

三. UnServer 服务端在主函数中的使用

下面贴出`UnServer`服务端在主函数中使用的代码:

```
/**
* Title:
* description:
* autor:pei
* created on 2020/3/6
*/
public class TestJava {
public static void main(String[] args) {
LogUtil.setDebug(true);
UnServer unServer=new UnServer(1112,"UTF-8");
unServer.start(new UnServerHandler.OnChannelListener() {
@Override
public String receiveData(ChannelHandlerContext ctx, String result) {
//接收客户端数据
System.out.println("=========接收客户端的数据=====result=" + result);
//给客户端的回复,若返回null,表示不给客户端回复
return "我真的是服务端啊";
}
});
}
}
```

这里需要注意的是,若要对客户端发送过来的数据做不同的处理,可以在接收的客户端的数据上标记不同`tag`,然后,根据不同`tag`,给客户端回复不同的数据,类似下面这样:

```
unServer.start(new UnServerHandler.OnChannelListener() {
@Override
public String receiveData(ChannelHandlerContext ctx, String result) {
//接收客户端数据
int type=Integer.valueOf(result.substring(0,1));
String message=result.substring(1,result.length());
System.out.println("===========我是接收结果=====result="+message);
//返回值为返回给客户端的结果
String response = null;
switch (type) {
case 1:
response = "服务端已经收到第一条数据";
break;
case 2:
response = "服务端已经收到第二条数据";
break;
default:
break;
}
System.out.println("===========我是回复信息=====response="+response);
return response;
}
});
```

#### 四. 需要注意的问题

主要问题在于,若服务端接收数据乱码,那么请保证客户端与服务端使用相同的字符集。

#### 五. 效果图和项目结构图

![效果图.gif](/contentImages/image/20200612/MBRkLRd34CgjqsYIDV5.gif)

![客户端日志.png](/contentImages/image/20200612/OMnaDqqHbDZ5IjM3HPP.png)

![服务端日志.png](/contentImages/image/20200612/KGZ5HgUSrB9tyEHidkG.png)

![项目结构图.png](/contentImages/image/20200612/R7Hgb9dlpJRj3IKK1kI.png)

ok,今天的内容就介绍到这里了,谢谢大家。