Android为TV端助力 UDP协议
废话不多说。直接上代码!
一. 接收端
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协议的更多相关文章
- Android为TV端助力:UDP协议(接收组播和单播)
private static String MulticastHost="224.9.9.98";private static int POST=19999;private sta ...
- Android为TV端助力 deep link(深度链接)与自定义协议!
此自定义仅供参考! 首先打开androidManifest.xml 在MainActivity中添加如下内容: <activity android:name=".MainActivit ...
- Android为TV端助力 转载:RecyclerView分页加载
package com.android.ryane.pulltoloaddata_recyclerview; import android.os.Handler;import android.os.L ...
- Android为TV端助力(转载)
作者地址http://www.jianshu.com/u/63915ef020e2 针对Android Tv的自定义RecyclerView 作者 wenju_song 关注 2016.12.09 1 ...
- Android为TV端助力 不需要Socket的跨进程推送消息AIDL!
上篇介绍了跨进程实时通讯http://www.cnblogs.com/xiaoxiaing/p/5818161.html 但是他有个缺点就是服务端无法推送消息给客户端,今天这篇文章主要说的就是服务器推 ...
- Android为TV端助力之Webview与JS双向交互
package com.hhzt.iptv.adservice; import android.app.Activity;import android.graphics.Bitmap;import a ...
- Android为TV端助力之WebView开发踩坑一
在Android清单配置文件里面 自定义application时,在4.4系统上面不能加上一个属性,见下图 否则界面将不会显示任何数据,在更高或者更低的系统上面没有测试!
- Android为TV端助力:(转载)修改TextView字体样式
一.开篇 因为 Android 字体相关的内容还比较多的.有时候其实我们只需要调整一下属性就可以满足设计师的需求,或者是一个退后的方案(毕竟有发版的时间卡住了),有一些效果可以大概满足需求. 那么本文 ...
- Android为TV端助力:自定义view之太阳
先看效果图 package com.hhzt.iptv.lvb_w8.view; import android.content.Context;import android.graphics.Canv ...
随机推荐
- linux 完全关闭tomcat
由于直接调用tomcat的 shutdown.sh 有时无法完全关闭掉tomcat,使用 ps -ef | grep tomcat 查找发现tomcat依然还存在,并未完全关掉.在 catalina. ...
- 什么是shell和终端?
目录 什么是shell? 什么是终端? 什么是shell? 当谈到命令时,我们实际上指的是shell.shell是一个接收由键盘输入的命令,并将其传递给操作系统来执行的程序.几乎所有的Linux发行版 ...
- numpy.random 常用函数详解之排列乱序篇(Permutations)
1.numpy.random.shuffle(x) 参数:填入数组或列表. 返回值:无. 函数功能描述:对填入的数组或列表进行乱序处理,shape保持不变. 2.numpy.random.permut ...
- [Swift]LeetCode87. 扰乱字符串 | Scramble String
Given a string s1, we may represent it as a binary tree by partitioning it to two non-empty substrin ...
- [Swift]LeetCode198. 打家劫舍 | House Robber
You are a professional robber planning to rob houses along a street. Each house has a certain amount ...
- [Swift]LeetCode830. 较大分组的位置 | Positions of Large Groups
In a string S of lowercase letters, these letters form consecutive groups of the same character. For ...
- 在admui中怎样上传本地文件?
1.首先需要引入一些插件 css: <link rel="stylesheet" href="/vendor/blueimp-file-upload/jquery. ...
- 优化之Sequence Generator组件
优化Sequence Generator组件,需创建一个可重用的序列生成器,并同时在多个Mappings中使用它 关于Number of Cached Values Sequence Generato ...
- 记录eclipse安装SpringBoot插件及搭建SpringBoot项目
刚学习了下SpringBoot 插件安装 创建项目在此记录下 在spring官网上下载相关的插件,然后导入到eclipse中,以下是下载步骤: 1.首先查看自己eclipse版本号 help--> ...
- "人机"对战:电脑太简单了,我是射手 skr~skr~skr
9月17日,2018 世界人工智能大会在上海拉开帷幕.在 SAIL 榜单入围项目中,我看到了小爱同学.小马智行.微软小冰.腾讯觅影等等,这不仅让我大开了眼界,也不禁让我感慨 AI 的发展神速.犹记得去 ...