废话不多说。直接上代码!

一. 接收端

1.创建UDP连接

public void init() {
try {

//开关的作用
isRunning = true;
DatagramSocket mUdpSocket = new DatagramSocket(40000);
recivRequest();
} catch (Exception e) {
LogUtil.e(Constant.LOG_TAG, "Exception=" + e);
}
}

2.获取UDP协议的数据包

public void recivRequest() {

//这是一个线程池,用于处理耗时操作
ThreadPoolManager.getInstance().addTask(new Runnable() {

@Override
public void run() {
while (isRunning) {
try {
byte[] recvBuffer = new byte[1024];
DatagramPacket dataPacket = new DatagramPacket(recvBuffer, recvBuffer.length);
mUdpSocket.receive(dataPacket);

parsePackage(dataPacket);
} catch (IOException e) {
if (null != mUdpSocket && !mUdpSocket.isClosed()) {
mUdpSocket.close();
}
mUdpSocket = null;
e.printStackTrace();
}
}
}
});
}

3.开始准备解析UDP协议的数据包

private void parsePackage(final DatagramPacket dataPacket) {
ThreadPoolManager.getInstance().addTask(new Runnable() {
@Override
public void run() {
String [] datagramPacketSegment = getDatagramPacketSegment(dataPacket);

/*得到数据根据自己的业务需求来做*/

}
});
}

4.解析数据包的方法

private String[] getDatagramPacketSegment(DatagramPacket dataPacket) {
if (null == dataPacket) {
return null;
}

int length = 0;
byte[] bytes = dataPacket.getData();
for (int i = 0; i < bytes.length; i++) {
if (bytes[i] == 0) {
length = i;
break;
}
length = i + 1;
}
String recivContent = new String(bytes, 0, length);

//这个#是跟发送端商量好的间隔符,用于区分多条消息

String[] reciveString = recivContent.split("#");

return reciveString;
}

二.发送端

这个方法接收两个参数,一个是客户端IP,一个是你要发送的内容,如果有多条内容用#号区别

public void sendInteractiveRequest(String ipAddress, String contents) {
LogUtil.d(Constant.LOG_TAG, "sendInteractiveRequest--->sendContents=" + contents);
byte[] data = contents.getBytes();
byte[] recvBuffer = new byte[1024];
DatagramPacket dataPacket = new DatagramPacket(recvBuffer, recvBuffer.length);
dataPacket.setData(data);
dataPacket.setLength(data.length);
// 设置此数据包包的目标主机的端口号
dataPacket.setPort(40000);
InetAddress sendAddr = null;
try {
//根据给定的主机字符串名称返回主机的地址
sendAddr = InetAddress.getByName(ipAddress);
//设置接收端主机的地址
dataPacket.setAddress(sendAddr);
//发送数据
mUdpSocket.send(dataPacket);
} catch (Exception e) {
LogUtil.e(Constant.LOG_TAG, "Exception=" + e);
}
}
比如我是这样发的:参数是你要发送的遥控器的key值
private void sendKeycodeValue(final int keyCode) {
CommonUtil.setControllerVibrate(LVBXApp.getApp());
String pairedName = UserMgr.getUserName();
// 发送按键模拟操作指令
ThreadPoolManager.getInstance().addTask(new Runnable() {
@Override
public void run() {
String mainCmd = RemoteCMDType.PAD_CMD + "";
// 101#15754#99065918#10#78:F7:BE:52:61:2A(cmdType#accountName#interactivePasswd#macAddress#keyCodeValue)
String contents = mainCmd + "#" + UserMgr.getUserName() + "#" + UserMgr.getInteracPassword() + "#"
+ CommonUtil.getLocalMacAddress(LVBXApp.getApp()) + "#" + keyCode;
String ipAdress = UserMgr.getPairedIp();
InteractiveMgr.getInstance().sendInteractiveRequest(ipAdress, contents);
}
});
}
OK.UDP通讯解析到此为止,你可以结合我的上一篇文件(模拟发送遥控器指令),远程用手机端发送指令控制电视端!

Android为TV端助力 UDP协议的更多相关文章

  1. Android为TV端助力:UDP协议(接收组播和单播)

    private static String MulticastHost="224.9.9.98";private static int POST=19999;private sta ...

  2. Android为TV端助力 deep link(深度链接)与自定义协议!

    此自定义仅供参考! 首先打开androidManifest.xml 在MainActivity中添加如下内容: <activity android:name=".MainActivit ...

  3. Android为TV端助力 转载:RecyclerView分页加载

    package com.android.ryane.pulltoloaddata_recyclerview; import android.os.Handler;import android.os.L ...

  4. Android为TV端助力(转载)

    作者地址http://www.jianshu.com/u/63915ef020e2 针对Android Tv的自定义RecyclerView 作者 wenju_song 关注 2016.12.09 1 ...

  5. Android为TV端助力 不需要Socket的跨进程推送消息AIDL!

    上篇介绍了跨进程实时通讯http://www.cnblogs.com/xiaoxiaing/p/5818161.html 但是他有个缺点就是服务端无法推送消息给客户端,今天这篇文章主要说的就是服务器推 ...

  6. Android为TV端助力之Webview与JS双向交互

    package com.hhzt.iptv.adservice; import android.app.Activity;import android.graphics.Bitmap;import a ...

  7. Android为TV端助力之WebView开发踩坑一

    在Android清单配置文件里面 自定义application时,在4.4系统上面不能加上一个属性,见下图 否则界面将不会显示任何数据,在更高或者更低的系统上面没有测试!

  8. Android为TV端助力:(转载)修改TextView字体样式

    一.开篇 因为 Android 字体相关的内容还比较多的.有时候其实我们只需要调整一下属性就可以满足设计师的需求,或者是一个退后的方案(毕竟有发版的时间卡住了),有一些效果可以大概满足需求. 那么本文 ...

  9. Android为TV端助力:自定义view之太阳

    先看效果图 package com.hhzt.iptv.lvb_w8.view; import android.content.Context;import android.graphics.Canv ...

随机推荐

  1. linux 完全关闭tomcat

    由于直接调用tomcat的 shutdown.sh 有时无法完全关闭掉tomcat,使用 ps -ef | grep tomcat 查找发现tomcat依然还存在,并未完全关掉.在 catalina. ...

  2. 什么是shell和终端?

    目录 什么是shell? 什么是终端? 什么是shell? 当谈到命令时,我们实际上指的是shell.shell是一个接收由键盘输入的命令,并将其传递给操作系统来执行的程序.几乎所有的Linux发行版 ...

  3. numpy.random 常用函数详解之排列乱序篇(Permutations)

    1.numpy.random.shuffle(x) 参数:填入数组或列表. 返回值:无. 函数功能描述:对填入的数组或列表进行乱序处理,shape保持不变. 2.numpy.random.permut ...

  4. [Swift]LeetCode87. 扰乱字符串 | Scramble String

    Given a string s1, we may represent it as a binary tree by partitioning it to two non-empty substrin ...

  5. [Swift]LeetCode198. 打家劫舍 | House Robber

    You are a professional robber planning to rob houses along a street. Each house has a certain amount ...

  6. [Swift]LeetCode830. 较大分组的位置 | Positions of Large Groups

    In a string S of lowercase letters, these letters form consecutive groups of the same character. For ...

  7. 在admui中怎样上传本地文件?

    1.首先需要引入一些插件 css: <link rel="stylesheet" href="/vendor/blueimp-file-upload/jquery. ...

  8. 优化之Sequence Generator组件

    优化Sequence Generator组件,需创建一个可重用的序列生成器,并同时在多个Mappings中使用它 关于Number of Cached Values Sequence Generato ...

  9. 记录eclipse安装SpringBoot插件及搭建SpringBoot项目

    刚学习了下SpringBoot 插件安装 创建项目在此记录下 在spring官网上下载相关的插件,然后导入到eclipse中,以下是下载步骤: 1.首先查看自己eclipse版本号 help--> ...

  10. "人机"对战:电脑太简单了,我是射手 skr~skr~skr

    9月17日,2018 世界人工智能大会在上海拉开帷幕.在 SAIL 榜单入围项目中,我看到了小爱同学.小马智行.微软小冰.腾讯觅影等等,这不仅让我大开了眼界,也不禁让我感慨 AI 的发展神速.犹记得去 ...