本章节 比较简单
直接上code了
首先创建一个UDP class 构造方法如下
通过newFixedThreadPool 创建一个线程池
public UdpSocket(Context mContent) {
this.mContent = mContent;
int cpuNumbers = Runtime.getRuntime().availableProcessors();
// 根据CPU数目初始化线程池
mThreadPool = Executors.newFixedThreadPool(cpuNumbers * POOL_SIZE);
// 记录创建对象时的时间
}
然后
一个startUdp scoket 重要步骤
public void startUDPSocket() {
if (client != null) return;
try {
client = new DatagramSocket(CLIENT_PORT);
if (receivePacket == null) {
// 创建接受数据的 packet
receivePacket = new DatagramPacket(receiveByte, BUFFER_LENGTH);
}
startSocketThread();
} catch (SocketException e) {
e.printStackTrace();
}
}
startSocketThread是一个 接收消息的子线程
内部是一个接收消息的循环
BROADCAST_IP 是通信对方的地址
private void startSocketThread() {
clientThread = new Thread(new Runnable() {
@Override
public void run() {
printMessage("clientThread is running...");
receiveMessage();
}
});
isThreadRunning = true;
clientThread.start();
}
private void receiveMessage() {
while (isThreadRunning) {
try {
if (client != null) {
client.receive(receivePacket);
}
printMessage("message success...");
} catch (IOException e) {
Log.e(TAG, "UDP数据包接收失败!stopUDPSocket");
stopUDPSocket();
e.printStackTrace();
return;
}
if (receivePacket == null || receivePacket.getLength() == 0) {
Log.e(TAG, "无法接收UDP数据或者接收到的UDP数据为空");
continue;
}
String strReceive = new String(receivePacket.getData(), 0, receivePacket.getLength());
printMessage(" data: " + strReceive + " from " + receivePacket.getAddress().getHostAddress() + ":" + receivePacket.getPort());
//解析接收到的 json 信息
// 每次接收完UDP数据后,重置长度。否则可能会导致下次收到数据包被截断。
if (receivePacket != null) {
receivePacket.setLength(BUFFER_LENGTH);
}
}
}
利用广播 把接收到的消息打印到前台
public void printMessage(String s) {
Log.d(TAG, s);
Intent intent = new Intent();
intent.setAction(MainActivity.REFRESH_ACTION);
intent.putExtra("Message", s);
mContent.sendBroadcast(intent);
}
再然后创建一个发送message的方法
public void sendMessage(final byte[] message) {
mThreadPool.execute(new Runnable() {
@Override
public void run() {
try {
DatagramPacket sendPacket = new DatagramPacket(message, message.length,
InetAddress.getByName(BROADCAST_IP), CLIENT_PORT);
client.send(sendPacket);
// 数据发送事件
printMessage("数据发送成功");
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
});
}
文章所有code 地址---> github
https://github.com/hanjole/Udpscoket_demo