android UDP協議,androidudp協議
廢話不多說。直接上代碼!
一. 接收端
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通訊解析到此為止,你可以結合我的上一篇檔案(類比發送遙控器指令),遠程用手機端發送指令控制電視端!