MQTT端
在Android前端,使用ActiveMQ会带来很多问题,所以一般的轻量级项目用的都是MQTT,为了保证兼容性,它将默认发送byte类型数据到服务器端,一般是数组也就是byte[],就像下面代码一样。
try {
MqttMessage message = new MqttMessage();//新建消息
message.setPayload(sendStr.getBytes());//sendStr是将要发送的字符串,这里被转成byte
mqttAndroidClient.publish(SEND_TOPIC_NAME, message);//发送
} catch (MqttException e) {
System.err.println("Error Publishing: " + e.getMessage());
e.printStackTrace();
}
ActiveMQ端
而在服务器端,要是在测试的时候需要显示byte对应的String字符串,需要这样做,看下面代码。
private void setGetMessage() throws JMSException {
//通过事件监听方式来消费接收消息,当有消息时被触发
this.messageConsumer.setMessageListener(new MessageListener() {
@Override
public void onMessage(Message message) {
//从安卓前端的MQTT发送过来的是byte[]类型,要转换
if (message instanceof BytesMessage) { //判断数据类型是否是BytesMessage
//强制类型转换,Message是接口或者父类,所以可以用其子类BytesMessage强制转换,ActiveMQ带有的ActiveMQBytesMessage也可以使用
BytesMessage bytesMessage = (BytesMessage) message;
try {
byte[] bytes = new byte[(int) bytesMessage.getBodyLength()]; //得到byte[]数据流
bytesMessage.readBytes(bytes); //读取byte
String getStr = new String(bytes); //根据byte创建字符串
System.out.println("接收到请求" + getStr);
} catch (JMSException e) {
e.printStackTrace();
}
}
}
});
}
注释已经写得比较清楚了,这是今天看了很多教程总结出来的,花了两三个小时,有所收获。