美文网首页Android
Netty实现UDP客户端

Netty实现UDP客户端

作者: 奔跑的佩恩 | 来源:发表于2021-11-12 08:42 被阅读0次

    前言

    之前已经讲过了Netty实现的TCP客户端,大家有兴趣的话,可以参考以下文章:
    Netty实现TCP客户端
    然后,今天就给大家讲讲Netty实现UDP客户端吧,这里我封装了两个工具类:UnClientHandlerUnClient,下面就来讲讲它们的具体使用吧。

    今天涉及以下内容:

    1. netty jar 包导入
    2. UnClientHandlerUnClient简介
    3. UnClient客户端在Activity中的使用
    4. 需要注意的问题
      4.1 Android上使用注意的点
      4.2 问题排查参考
    5. 效果图和项目结构图
    6. UnClientHandlerUnClient源码

    先来波效果图


    效果图.gif
    客户端日志.png
    服务端日志.png

    一. netty jar 包导入

    UnClient是利用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下载

    二. UnClientHandler 和 UnClient 简介

    UnClientHandlerUnClient类的一个辅助类,主要是在UnClient中使用,大家只做了解,而真正要使用的类是UnClient客户端类。下面主要介绍下UnClient类中的一些常用方法:

        /**
         * 初始化对象
         *
         * @param port 端口:0-65535
         */
        public UnClient(int port)
    
        /***
         * 设置连接超时时间,未设置的话,默认时间为15000毫秒,即15秒。
         *
         * @param timeOut 超时时间
         * @return
         */
        public UnClient setTimeOut(long timeOut)
    
        /***
         *
         *
         * @param message 要发送的消息字符串
         * @param charsetName 字符集,如 TcpConfig.UTF_8 或 TcpConfig.GBK等
         * @param listener 接收服务端返回数据的监听
         */
        public void sendMessage(String message,String charsetName,UnClientHandler.OnChannelListener listener)
    
    

    三. UnClient 客户端在 Activity 中的使用

    接下来讲讲UnClient 客户端Activity中使用的代码:

    /**
     * Title:测试界面
     * description:
     * autor:pei
     * created on 2020/6/2
     */
    public class TempActivity extends AppCompatActivity implements View.OnClickListener{
    
        private TextView mTv;
        private Button mBtn1;
    
        private UnClient mUnClient;
    
        @Override
        protected void onCreate(@Nullable Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_temp);
    
            //初始化控件
            initView();
            //初始化数据
            initData();
            //设置监听
            setListener();
        }
    
        /**初始化控件**/
        private void initView(){
            mTv=findViewById(R.id.tv);
            mBtn1=findViewById(R.id.btn1);
        }
    
        /**初始化数据**/
        private void initData(){
            mUnClient=new UnClient(1112)
                    //设置连接超时时间,未设置的话,默认时间为15000毫秒,即15秒。
                    .setTimeOut(15000);
        }
    
        /**设置监听**/
        private void setListener(){
            mBtn1.setOnClickListener(this);
        }
    
        @Override
        public void onClick(View v) {
           switch (v.getId()) {
               case R.id.btn1://测试1
                   LogUtil.i("=======测试=======");
    
                   test1();
                   break;
               default:
                   break;
           }
        }
    
        /**测试**/
        private void test1(){
            ToastUtil.shortShow("我是第一条测试");
    
            mUnClient.sendMessage("我是王者啊", "UTF-8", new UnClientHandler.OnChannelListener() {
                @Override
                public void success(ChannelHandlerContext ctx, String result) {
                    LogUtil.i("=======接收服务端返回数据成功===result="+result);
    
                    //显示数据
                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            mTv.setText(result);
                        }
                    });
                }
    
                @Override
                public void failed(ChannelHandlerContext ctx, Throwable cause) {
                    LogUtil.i("=======接收服务端返回数据失败failed=========");
                }
            });
        }
    
    }
    

    四.需要注意的问题

    4.1 Android上使用注意的点

    使用需要注意网络权限问题。你需要在AndroidManifast.xml中加入以下网络权限:

     <uses-permission android:name="android.permission.INTERNET" />
    

    若有必要,你还需要在你Android项目中加入android 6.0+手动权限。

    4.2 问题排查参考
    • 通讯逻辑要放到子线程中执行,不可放到UI线程中执行
    • UnClient客户端发出消息后未收到消息,可从以下方面着手排查问题:
    1.udp客户端与服务端链接端口(port)不一致
    2.udp服务端未开启
    3.udp客户端未联网或未开联网权限
    4.udp客户端与服务端不在一个网段
    
    • 若出现数据接收乱码,请保持UnClient客户端和服务端字符集编码一致

    五. 效果图和项目结构图

    效果图.gif
    客户端日志.png
    服务端日志.png
    项目结构图.png

    六. UnClientHandler 和 UnClient 源码

    先贴netty实现UDP客户端的封装类UnClient 源码:

    相关文章

      网友评论

        本文标题:Netty实现UDP客户端

        本文链接:https://www.haomeiwen.com/subject/hgpnzltx.html