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

一. 接收端

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. 惊奇!用Java也能实现比特币系统

    最近区块链技术突然爆火,身边做技术的朋友茶余饭后不谈点区块链什么的都被认为是跟不上时代了,为啥会这样了? 这其实跟比特币价格去年的突飞猛进是分不开的,比特币价格从去年初不到一千美金到今年初最高接近两万 ...

  2. 浅谈Java中的锁:Synchronized、重入锁、读写锁

    Java开发必须要掌握的知识点就包括如何使用锁在多线程的环境下控制对资源的访问限制 ◆ Synchronized ◆ 首先我们来看一段简单的代码: 12345678910111213141516171 ...

  3. 智能压缩,摆脱用 Gzip 还是 Brotli 的纠结

    近日,又拍云上线了“智能压缩”功能,同时支持 Gzip 和 Brotli 压缩算法,在节约流量的同时,进一步减少用户的等待时间. CDN 流量问题一直以来是大家关注的重点,又拍云针对流量节约上线了一系 ...

  4. RabbitMQ学习笔记(四) Routing

    新的场景 在我们学习了RabbitMQ的发布与订阅之后,我们很容易就可以完成一个简单的消息群发器. 使用这个消息群发器,所有的消费者程序实例都会接收到相同的消息信息,从而实现广播的效果. 但是这种广播 ...

  5. asp.net core AuthenticationMiddleware 在WebApi中的的使用

    在.net framework 4.5架构下使用认证(Authentication)授权(Authorization). IIS使用HttpModule进行认证(Authentication),我们可 ...

  6. Solr04 - 在Jetty和Tomcat上部署Solr单机服务

    目录 1 准备安装环境 2 通过内部Jetty服务器启动 3 通过配置Tomcat服务器启动 3.1 删除不需要的应用 3.2 修改服务端口 3.3 部署solr.war 3.4 扩展: 虚拟目录发布 ...

  7. JAVA数组和集合谁是儿子

    Java有哪些数据存储方式? 基本数据类型(1byte3整2小数1字符1布尔)分别是byte,short,int long,flort,double,char,boolean(颜色好喜庆的样子O(∩_ ...

  8. Linux驱动模块编译模板

    hello.c文件: #include <linux/module.h> #include <linux/kernel.h> static int hello_init(voi ...

  9. Java开发知识之Java中的集合Set接口以及子类应用

    ---恢复内容开始--- Java开发知识之Java中的集合Set接口以及子类应用 一丶Set接口以及作用 在上一讲.我们熟悉了接口的实现图.以及自己各有的子类. List接口主要存储的数据是可以重复 ...

  10. ASP.NET Core 2.1 : 十三.httpClient.GetAsync 报SSL错误的问题

    不知什么时候 ,出现了这样的一个奇怪问题,简单的httpClient.GetAsync("xxxx")居然报错了.(ASP.NET Core 系列目录) 一.问题描述 把原来的程序 ...