本章節(jié) 比較簡單
直接上code了
首先創(chuàng)建一個UDP class 構(gòu)造方法如下
通過newFixedThreadPool 創(chuàng)建一個線程池
public UdpSocket(Context mContent) {
this.mContent = mContent;
int cpuNumbers = Runtime.getRuntime().availableProcessors();
// 根據(jù)CPU數(shù)目初始化線程池
mThreadPool = Executors.newFixedThreadPool(cpuNumbers * POOL_SIZE);
// 記錄創(chuàng)建對象時的時間
}
然后
一個startUdp scoket 重要步驟
public void startUDPSocket() {
if (client != null) return;
try {
client = new DatagramSocket(CLIENT_PORT);
if (receivePacket == null) {
// 創(chuàng)建接受數(shù)據(jù)的 packet
receivePacket = new DatagramPacket(receiveByte, BUFFER_LENGTH);
}
startSocketThread();
} catch (SocketException e) {
e.printStackTrace();
}
}
startSocketThread是一個 接收消息的子線程
內(nèi)部是一個接收消息的循環(huán)
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數(shù)據(jù)包接收失敗!stopUDPSocket");
stopUDPSocket();
e.printStackTrace();
return;
}
if (receivePacket == null || receivePacket.getLength() == 0) {
Log.e(TAG, "無法接收UDP數(shù)據(jù)或者接收到的UDP數(shù)據(jù)為空");
continue;
}
String strReceive = new String(receivePacket.getData(), 0, receivePacket.getLength());
printMessage(" data: " + strReceive + " from " + receivePacket.getAddress().getHostAddress() + ":" + receivePacket.getPort());
//解析接收到的 json 信息
// 每次接收完UDP數(shù)據(jù)后,重置長度。否則可能會導(dǎo)致下次收到數(shù)據(jù)包被截斷。
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);
}
再然后創(chuàng)建一個發(fā)送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);
// 數(shù)據(jù)發(fā)送事件
printMessage("數(shù)據(jù)發(fā)送成功");
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
});
}
文章所有code 地址---> github
https://github.com/hanjole/Udpscoket_demo