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 ...
随机推荐
- [Swift]LeetCode11. 盛最多水的容器 | Container With Most Water
Given n non-negative integers a1, a2, ..., an , where each represents a point at coordinate (i, ai). ...
- [Swift]LeetCode114. 二叉树展开为链表 | Flatten Binary Tree to Linked List
Given a binary tree, flatten it to a linked list in-place. For example, given the following tree: 1 ...
- [Swift]LeetCode234. 回文链表 | Palindrome Linked List
Given a singly linked list, determine if it is a palindrome. Example 1: Input: 1->2 Output: false ...
- javascript时间戳与日期格式之间的互转
1. 将时间戳转换成日期格式 // 简单的一句代码 var date = new Date(时间戳); //获取一个时间对象 /** 1. 下面是获取时间日期的方法,需要什么样的格式自己拼接起来就好了 ...
- 纽约工作日志流水账 Day 2
今天本来想一觉睡到早上7点,结果凌晨2点30就行了,然后就各种睡不着了. 挣扎到5点,饿的不行,就起来找东西吃,发现冰箱里东西真不少. 8点半,开始和亢爷做早饭,自制俩汉堡,样子略丑, 味道还不错.这 ...
- jar文件和aar文件的区别
1. *.jar,JAR 文件就是 JavaArchive File,顾名思意,它的应用是与 Java 息息相关的,是 Java 的一种文档格式.只包含了class文件与清单文件 ,不包含资源文件 ...
- 基于Spring cloud Ribbon和Eureka实现客户端负载均衡
前言 本案例将基于Spring cloud Ribbon和Eureka实现客户端负载均衡,其中Ribbon用于实现客户端负载均衡,Eureka主要是用于服务注册及发现: 传统的服务端负载均衡 常见的服 ...
- Chapter 5 Blood Type——20
"Just let me sit for a minute, please?" I begged. “就让我坐一会可以吗?” 我乞求道. He helped me sit on t ...
- .Net高并发解决思路(附源码)
本文如有不对之处,欢迎各位拍砖扶正.另源码在文章最下面,大家下载过后先还原一下nuget包,需要改一下redis的配置,rabbitmq的配置以及Ef的连接字符串.另外使用的是CodeFirst,先u ...
- Typora中的Markdown教程
Tutorial of markdown in Typora 工欲善其事,必先利其器 如上所说,这里给大家安利一款高BIG的利器Typora,这是一款文艺青年(装逼)必备的用于编写markdown的打 ...