我使用eclipse MQTT连接到MQTT服务器。
我可以成功连接到服务器,但是当我发布消息时,我收到了此错误
连接丢失了 msg:连接丢失了 loc:连接丢失 原因:java.io.EOFException
excep:连接丢失(32109) - java.io.EOFException
我搜索了这个问题。但我找不到任何真正的答案!我在此处创建的一些链接{here,here,here,...}
我的代码:
private final String DEFAULT_HOST = "edge-mqtt.facebook.com";
private final int DEFAULT_PORT = 443;
public void connect(String protogle) throws Exception {
this.broker = protogle + "://"+ DEFAULT_HOST + ":" + DEFAULT_PORT;
this.mqttClient = new MqttClient(broker,getMqttClientId() ,new MemoryPersistence() );
MqttConnectOptions connOpts = new MqttConnectOptions();
connOpts.setCleanSession(true);
connOpts.setKeepAliveInterval( MQTT_KEEPALIVE);
connOpts.setUserName( getMqttUsername() );
connOpts.setPassword( getMqttPassword().toCharArray() );
//connOpts.setMqttVersion( 3 );//some times it have an error
//connOpts.setSocketFactory(SSLTunnelSocketFactory.getInstance());
Logger.w("Connecting to broker: "+broker);
Logger.w("isConnected:"+mqttClient.isConnected());
try {
IMqttToken cn = mqttClient.connectWithResult(connOpts);
Logger.w("connected");
}catch (MqttException me){
System.out.println("reason "+me.getReasonCode());
System.out.println("msg "+me.getMessage());
System.out.println("loc "+me.getLocalizedMessage());
System.out.println("cause "+me.getCause());
System.out.println("excep "+me);
return;
}
this.mqttClient.setCallback(new MqttCallback() {
@Override
public void connectionLost(Throwable me) {
Logger.w("Connection lost");
System.out.println("msg "+me.getMessage());
System.out.println("loc "+me.getLocalizedMessage());
System.out.println("cause "+me.getCause());
System.out.println("excep "+me);
}
@Override
public void messageArrived(String s, MqttMessage mqttMessage) throws Exception {
Logger.w("message Arrived");
}
@Override
public void deliveryComplete(IMqttDeliveryToken iMqttDeliveryToken) {
Logger.w("deliverd--------");
try {
MqttDeliveryToken token = (MqttDeliveryToken) iMqttDeliveryToken;
String h = token.getMessage().toString();
Logger.w("deliverd message :"+h);
} catch (MqttException me) {
System.out.println("reason "+me.getReasonCode());
System.out.println("msg "+me.getMessage());
System.out.println("loc "+me.getLocalizedMessage());
System.out.println("cause "+me.getCause());
System.out.println("excep "+me);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
并发布方法:
private void publish(String topic , String payload , int qosLevel) throws Exception {
Logger.w("start publishing :");
//payload = Helper.zlib_encode(payload);
topic = mapTopic(topic);
MqttMessage message = new MqttMessage();
message.setPayload(payload.getBytes("UTF-8") );
message.setQos(0);
mqttClient.publish(topic , message);
Logger.w("publised------------------");
}
输出:
Connecting to broker: ssl://edge-mqtt.facebook.com:443
isConnected:false
connected
start publishing :
deliverd--------
publised------------------
deliverd message : //my message
Connection lost
msg : Connection lost
loc : Connection lost
cause : java.io.EOFException
excep : Connection lost (32109) - java.io.EOFException
Eclipse paho日志:
============== Connection options ==============
CleanSession : true
SocketFactory : sun.security.ssl.SSLSocketFactoryImpl@6c010ee9
MqttVersion : 3
KeepAliveInterval : 60
ConTimeout : 30
UserName : . . .
SSLProperties : null
WillDestination : null
==========================================
2017-10-19 09:42:02,182 INFO [MQTT Call: Bahram091547759 ] [MqttConnectionResultHandler ] - insta connected
2017-10-19 09:42:02,187 INFO [JavaFX Application Thread ] [MqttEventHandler ] - About to resubscribe to all requested topics
2017-10-19 09:42:08,559 INFO [JavaFX Application Thread ] [MqttAsyncConnection ] - Publishing message on topic "k.,". Payload size = "3"
2017-10-19 09:42:08,739 ERROR [MQTT Rec: Bahram091547759 ] [MqttCallbackHandler ] - Connection insta lost
Connection lost (32109) - java.io.EOFException
at org.eclipse.paho.client.mqttv3.internal.CommsReceiver.run(CommsReceiver.java: 146)
at java.lang.Thread.run(Unknown Source)
Caused by: java.io.EOFException
at java.io.DataInputStream.readByte(Unknown Source)
at org.eclipse.paho.client.mqttv3.internal.wire.MqttInputStream.readMqttWireMess age(MqttInputStream.java:65)
at org.eclipse.paho.client.mqttv3.internal.CommsReceiver.run(CommsReceiver.java:107)
... 1 more
答案 0 :(得分:4)
如果这有助于任何人......
我有相同的例外并通过确保生成唯一的客户端ID(使用MqttAsyncClient.generateClientId()
)来修复它,如下所述:
https://github.com/eclipse/paho.mqtt.java/issues/207#issuecomment-338246879
答案 1 :(得分:1)
connectWithResult的javadoc建议在连接之前调用setCallback(MqttCallback)
,以便在客户端连接后立即接受发往客户端的邮件。
尝试在源代码中移动mqttClient.setCallback
调用。
还可以尝试使用java -Djavax.net.debug=all
运行程序答案 2 :(得分:0)
尝试将保持活动时间减少到15秒,并将ConnectionTimeout设置为30
connOpts.setKeepAliveInterval(15);
connOpts.setConnectionTimeout(30);
答案 3 :(得分:0)
我修复了错误 在此处查看更多详细信息:https://github.com/eclipse/paho.mqtt.java/issues/207
答案 4 :(得分:0)
最近我在处理这个。我遇到了同样的问题:成功连接后出现 32109 错误。
这是 Paho 存储库上报告的 issue。
我更新了我的库:
implementation 'org.eclipse.paho:org.eclipse.paho.client.mqttv3:1.2.1'
到:
implementation 'org.eclipse.paho:org.eclipse.paho.client.mqttv3:1.2.2'
然后就解决了。