2017-10-17 7 views
1

J'ai utilisé eclipse MQTT pour me connecter au serveur MQTT.Connexion perdue (32109) - java.io.EOFException

je peux connecter au serveur avec succès mais quand je publie un message, j'ai obtenu cette erreur

Connexion perdue
msg: Connexion perdue
loc: Connexion perdue Cause: java.io.EOFException
exception: Connexion perdue (32109) - java.io.EOFException

J'ai recherché ce problème. mais je ne trouve pas de vraie réponse! un lien ici i {fondé here, here, here, ...}

Mon code:

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(); 
      } 
     } 
    }); 



} 

et publier la méthode:

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------------------"); 
} 

sortie:

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 log:

============== Connection options ============== 
CleanSession    : true 
SocketFactory    : [email protected] 
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

Avez-vous accès aux journaux du courtier pour voir pourquoi il a fermé la connexion? Ma première supposition serait que vous n'êtes pas autorisé à publier sur le sujet que vous utilisez. – hardillb

+0

@hardillb non je ne vérifie pas le journal. pouvez-vous me tél où est le journal? et comment puis-je vérifier cela? – b4hr4m

+0

Non sans connaître beaucoup plus d'informations telles que le courtier que vous utilisez et comment vous l'avez installé. (Editer la question pour ajouter ces détails) – hardillb

Répondre

1

Le javadoc pour connectWithResult recommande d'appeler setCallback(MqttCallback) avant de connecter afin que les messages destinés au client peuvent être acceptées dès que le client est connecté. Essayez de déplacer l'appel mqttClient.setCallback dans votre code source.

également essayer de lancer votre programme avec java -Djavax.net.debug=all

+0

ce n'est pas la vraie réponse. je fais ça. mais le problème n'est pas résolu – b4hr4m