UdpPostSender.java
3.57 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
package com.xgimi.gimicinema.service;
import android.os.Handler;
import android.os.Message;
import android.text.TextUtils;
import android.util.Log;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.UnknownHostException;
/**
* UDP通信接口类,采用单例模式,用ip和通信端口初始化
*/
public class UdpPostSender extends Thread {
protected static final int MSG_PARSE_DATA = 0x100;
private static final String TAG = "UdpPostSender";
private boolean isThreadDisable = false;// 指示监听线程是否终止
private Handler mHandler;
private DatagramSocket udpSocket = null;
private DatagramPacket dataPacket = null;
private InetAddress broadcastAddr = null;
private int defaultPort;
private int remotePort;
private String ip;
private String remoteIp;
public UdpPostSender(String iP, int defaultPort, int remotePort,
Handler handler) {
this.ip = iP;
this.defaultPort = defaultPort;
this.remotePort = remotePort;
this.mHandler = handler;
initData();
if (handler != null) {// 不需要接收恢复信息的udp
this.start();
}
}
public String getRemoteIp() {
return remoteIp;
}
@Override
public void run() {
startListen();
}
private void initData() {
try {
if (udpSocket == null) {
udpSocket = new DatagramSocket(null);
udpSocket.setReuseAddress(true);
// udpSocket.setSoTimeout(5000);
udpSocket.bind(new InetSocketAddress(defaultPort));
}
Log.i("info", "ip----" + ip);
broadcastAddr = InetAddress.getByName(ip);
} catch (Exception e) {
Log.i("info", e.getMessage());
}
}
public void sendUDPmsg(final String command) {
byte out[] = command.getBytes();
dataPacket = new DatagramPacket(out, out.length);
dataPacket.setPort(remotePort);
try {
dataPacket.setAddress(InetAddress.getByName(remoteIp));
} catch (UnknownHostException e) {
Log.i("info", e.getMessage());
e.printStackTrace();
}
Log.e(TAG, "cmd" + command + broadcastAddr.toString());
new Thread() {
public void run() {
try {
udpSocket.send(dataPacket);
} catch (Exception e) {
e.printStackTrace();
}
}
}.start();
}
public void startListen() {
while (!isThreadDisable) {
try {
// 准备接收数据
byte[] buf = new byte[4 * 1024];
DatagramPacket packet = new DatagramPacket(buf, buf.length);
initData();
// udpSocket.setSoTimeout(2 * 1000);
udpSocket.receive(packet);
// String ip = packet.getAddress().getHostAddress();
String cmd = new String(packet.getData(), 0, packet.getLength());
if (!TextUtils.isEmpty(cmd)) {
remoteIp = packet.getAddress().toString().replace("/", "");
}
Message m = Message.obtain();
m.what = MSG_PARSE_DATA;
m.obj = cmd;
mHandler.sendMessage(m);
} catch (Exception e) {
e.printStackTrace();
}
}
}
public void stopListen() {
isThreadDisable = true;
}
}