2015-04-07 2 views
9

Wir haben einen SignalR-Hub. Der folgende jQuery-Code verbindet und verarbeitet SignalClient- "Call" -Ereignisse erfolgreich auf cordova.jquery signalr Client funktioniert - aber in Java kann nicht zur Arbeit

 var connectionURL = "https://SOMEURL.azurewebsites.net/message"; 
     connection = $.connection(connectionURL); 

     connection.start().done(function() { 
      console.log("Connected to hub again"); 
     }); 

     connection.disconnected(function() { 
      setTimeout(function() { 
       connection.start().done(function() { 
        console.log("Disconnected and Connected to hub again"); 
       }); 
      }, 5000); 
     }); 

     connection.stateChanged(function (change) { 
      if (change.newState == $.signalR.connectionState.reconnecting) { 
      } 
      else if (change.newState == $.signalR.connectionState.connected) { 
      } 
      else if (change.newState == $.signalR.connectionState.disconnected) { 
      }// else if 
     }); 

     connection.received(function (data) { 
      connectId = connection.id + ""; 
      console.log("onDeviceReady run"); 

      // call the function to parse the data 
      if (data.PayloadType == "Dispatch") { 
       dataDispatch(data); 
      } 
      if (data.PayloadType == "ConnectionAcknowledge") { 
       sendConnectionAcknowledge(data); 
      } 
     }); 

aber wenn ich versuche, diesen Code in Java Android zu emulieren die SignalR Java Client verwenden, erhalte ich eine Menge Log-Ausgabe (in Tonnen), und keine Verbindung jemals beendet. es kommt so weit wie das debug in Zeile awaitConnection.get(); und druckt nie die zweite Zeile von debug, stattdessen druckt es endlose (Tausende) Zeilen von Semi Kauderwelsch (es ist nicht Rohrleitungen, es ist wie es ist eine Art von "SSL Handshake" aber es tut nicht alles andere als die gleiche Sache immer wieder, sehr seltsam Anmeldung) sowieso es läuft nie die 2. Zeile von „mein“ debug

package com.some.thing; 

import android.util.Log; 

import java.util.concurrent.ExecutionException; 

import microsoft.aspnet.signalr.client.Platform; 
import microsoft.aspnet.signalr.client.SignalRFuture; 
import microsoft.aspnet.signalr.client.http.android.AndroidPlatformComponent; 
import microsoft.aspnet.signalr.client.hubs.HubConnection; 
import microsoft.aspnet.signalr.client.hubs.HubProxy; 
import microsoft.aspnet.signalr.client.hubs.SubscriptionHandler1; 

public class SignalRClient { 

    public static void startConnection() { 

     Platform.loadPlatformComponent(new AndroidPlatformComponent()); 
     String host = "https://SOMEURL.azurewebsites.net/message"; 
     HubConnection connection = new HubConnection(host); 
     HubProxy hub = connection.createHubProxy("IDoNoHaveThisNorKnowIt"); 

     SignalRFuture<Void> awaitConnection = connection.start(); 
     try { 
      Log.v("CONANSignalR :=", "CONNECTING"); 
      awaitConnection.get(); 
      Log.v("CONANSignalR :=", "CONNECTED"); 
     } catch (InterruptedException e) { 
      // Handle ... 
     } catch (ExecutionException e) { 
      // Handle ... 
     } 

     hub.on("IDoNotKnowThisEither", new SubscriptionHandler1<String>(){ 
      @Override 
      public void run(String status){ 
       Log.v("CONANDispatch :=", status); 
      } 
     }, String.class); 
    } 
} 

Kann mir jemand helfen, die arbeiten, jQuery SignalR Client-Code in nutzbare Java-Client-Code zu übersetzen? Ich habe keine Informationen über den Hub, so dass ich den Proxy oder die Funktionsnamen nicht kennen kann, ich möchte alles sehen (wie die jQuery).

EDIT

Dinge zu testen, habe ich meinen ursprünglichen jQuery-Code es

console.log("onDeviceReady run"); 

jetzt sagt, es

console.log("SignalR Raw Data:" + JSON.stringify(data)); 

, wenn ich das dies tun, um zu sagen, verwendet verändert ist, was die jquery gibt

SignalR Raw Data:{"ConnectionId":"9c4b4ba5-cb6e-4dcb-8df9-069cbf749873","OrderId":null,"SenderId":null,"PayloadType":"ConnectionAck","Message":"Welcome, you are connected to the Hub!","Payload":null,"Initiator":"HUB","Version":null} 
zurück

jedoch nichts davon innerhalb des Java dh der Text

connection.received(new MessageReceivedHandler() { 
    @Override 
    public void onMessageReceived(JsonElement json) { 
     System.out.println("RAW received message: " + json.toString()); 

     // ADD HANDLING OF RECEIVED IN HERE 
    } 
}); 

Äquivalent erscheint „RAW-Nachricht empfangen:“ bei allen

+0

Ich hätte gerne gewusst, dass die Antwort von @drax sehr hilfreich war, aber er war NICHT in der Lage, die Frage zu beantworten und gab dies zu und basierte auf einem Link, auf den ich bereits Zugriff hatte der Hub ist seinem Rat folgend aufgetreten), aber es scheint, dass das Kopfgeld automatisch an ihn gesendet wird – user26676

Antwort

3

nicht angezeigt Da Sie Hub Namen nicht kennen, müssen Sie Verwenden Sie Handle-Ereignisse auf Verbindungsobjekt direkt (wie Sie in js-Client tun).

Hier Beispielcode, mit dem Sie (beachten Sie, ist dies nicht getestet, geschrieben von oben auf den Kopf) beginnen konnte:

public static void startConnection() { 

    Platform.loadPlatformComponent(new AndroidPlatformComponent()); 
    String host = "https://SOMEURL.azurewebsites.net/message"; 
    HubConnection connection = new HubConnection(host); 

    // subscribe to received - equal to `connection.received(function (data)` from javascript 
    connection.received(new MessageReceivedHandler() { 

     @Override 
     public void onMessageReceived(JsonElement json) { 
      System.out.println("RAW received message: " + json.toString()); 

      // ADD HANDLING OF RECEIVED IN HERE 
     } 
    }); 

    // equal to `connection.disconnected(function()` from javascript 
    connection.closed(new Runnable() { 

     @Override 
     public void run() { 
      // ADD CODE TO HANDLE DISCONNECTED EVENT 
     } 
    }); 

    // equal to `connection.stateChanged(function (change)` 
    connection.stateChanged(new StateChangedCallback() { 

     @Override 
     public void stateChanged(ConnectionState oldState, ConnectionState newState) { 
      // ADD CODE TO HANDLE STATE CHANGES 
     } 
    }); 

    // start the connection 
    connection.start() 
     .done(new Action<Void>() { 

      @Override 
      public void run(Void obj) throws Exception { 
       System.out.println("Connected"); 
      } 
     }); 
} 

Auch empfehle ich Ihnen Probe-Chat-Client für Java zu prüfen, welche finden Sie hier: https://github.com/SignalR/java-samples/blob/master/signalr-sample-chat/src/microsoft/aspnet/signalr/samples/chat/Program.java

Die meisten Code, den ich gepostet habe, basiert auf diesem.

+0

danke @drax Ich habe die Änderungen gemacht, es gibt meine Ergebnisse in der Bearbeitung, das ist definitiv eine Verbesserung re 'connecting', aber "receive" feuert nicht – user26676

+0

eine Sache, die mir in den Sinn kommt, ist, dass 'Verbindung' Objekt in Ihrem Java-Beispiel außerhalb des Bereichs (und möglicherweise Müll gesammelt) am Ende der' startConnection'-Funktion. Sie sollten es wahrscheinlich einer programmweiten (statischen oder ähnlichen) Variable zuweisen. – drax

+0

danke @drax, yeah, ich habe die globalen Scope/GC-Probleme während meines enormen Tüftelns untersucht, es war fruchtlos, ich wäre bereit, dich für deine Zeit zu entlohnen, wenn du dir das ansehen würdest?Meine Email ist conanman _at_ live _dotco_dotuk es hat 6 Tage meiner Zeit gedauert, aber ich bin mir sicher, dass es ein kleines Problem ist, etwas, das ich übersehen habe. Ich kann Ihnen die Quelle meines Projekts senden, wenn Sie (Android Studio) – user26676

Verwandte Themen