2016-09-20 4 views
8

ich bereits diese Themen lesen:
how to use SignalR in Android
Android Client doesn't get data but .net client getting data from SignalR serverAndroid App erhalten keine Daten von SignalR Nabe

Ich schreibe ein einfaches Chat-System mit Android, die mit SignalR arbeitet.
Es soll die Clients Nachrichten senden (durch Aufruf von SendMessage Methode auf dem Server) und der Server sollte die NewMessage Methode auf den Clients aufrufen.

Hier ist meine ChatHub Klasse (vereinfacht) in C# geschrieben.

public class ChatHub : Hub 
{ 
    // Store the clients connections Id 
    static readonly List<string> _connectedClients; 

    public override Task OnConnected() 
    { 
     // Keep connections id 
     // This section works fine and when the android device connects to the server, 
     // Its connection id will stored. 
     _connectedClients.Add(Context.ConnectionId) 

     //... other codes 
    } 

    public void SendMessage(string message) 
    { 
     foreach (var connectionId in _connectedClients) 
     { 
      // according to the logs 
      // android device connection id exists here 
      // and it works fine. 
      Clients.Client(connectionId).NewMessage(message); 
     } 
    } 
} 

Wenn der Android-Client mit dem Server verbindet, auf den OnConnected Verfahren wird die Verbindungs-ID in den _connectedClients gespeichert werden und es funktioniert gut.

Im SendMessage Verfahren der ChatHub Klasse, haben wir den Android-Geräteanschluss-ID, und ich bin sicher, dass das Android-Gerät in der Liste ist

Und hier mein Andoird Codes ist:

public class ChatActivity extends AppCompatActivity 
{ 
    // private fields 
    HubConnection connection; 
    HubProxy hub; 
    ClientTransport transport; 

    protected void onCreate(Bundle savedInstanceState) { 

     Logger logger = new Logger() { 
      @Override 
      public void log(String message, LogLevel logLevel) { 
       Log.e("SignalR", message); 
      } 
     }; 

     Platform.loadPlatformComponent(new AndroidPlatformComponent()); 
     connection = new HubConnection("192.168.1.100"); 
     hub = connection.createHubProxy("chatHub"); // case insensitivity 

     transport = new LongPollingTransport(connection.getLogger()); 

     // no difference when using this: 
     //transport = new ServerSentEventsTransport(connection.getLogger()); 

     // this event never fired! 
     hub.subscribe(new Object() { 
      public void NewMessage(String message) 
      { 
       Log.d("<Debug", "new message received in subscribe"); // won't work! 
      } 
     } 

     // this event never fired! 
     hub.on("NewMessage", new SubscriptionHandler() { 
      @Override 
      public void run() { 
       Log.d("<Debug", "new message received in `on`"); // won't work! 
      } 
     }); 

     // connect to the server that works fine. 
     SignalRFuture<Void> awaitConnection = connection.start(transport); 
     try { 
      awaitConnection.get(); // seems useless when using this or not! 
     } 
     catch (Exception ex) { 
     } 

     // this method works fine. 
     hub.invoke("sendMessage", "this is a test message to the server") 
     .done(new Action<Void>() { 
       @Override 
       public void run(Void aVoid) throws Exception { 
        Log.d("<Debug", "message sent."); // Works fine 
       } 
     }); 

    } 
} 

In dem oben genannten Java Code, das Aufrufen der sendMessage auf dem Server funktioniert gut und der Server erhält die Nachrichten.
Aber das einzige Problem ist, dass die hub.on(...) oder hub.subscribe(...) Ereignisse nie vom Server aufgerufen werden.
In einer einfachen Beschreibung kann Meine App eine Nachricht senden, aber keine Nachricht von den anderen empfangen.
Jeder Vorschlag wird geschätzt.

+0

Sehen Sie diese http://stackoverflow.com/a/42527962/1770868 –

Antwort

6

Für die Zukunft ist dies die Art und Weise habe ich endlich die Antwort erreicht (bitte die Frage android Codes zuerst lesen!):

public class ChatActivity extends AppCompatActivity 
{ 
    // private fields 
    HubConnection connection; 
    HubProxy hub; 
    ClientTransport transport; 

    protected void onCreate(Bundle savedInstanceState) { 

     Logger logger = new Logger() { 
      @Override 
      public void log(String message, LogLevel logLevel) { 
       Log.e("SignalR", message); 
      } 
     }; 

     Platform.loadPlatformComponent(new AndroidPlatformComponent()); 
     connection = new HubConnection("192.168.1.100"); 
     hub = connection.createHubProxy("chatHub"); // case insensitivity 

     /* ****new codes here**** */ 
     hub.subscribe(this); 

     transport = new LongPollingTransport(connection.getLogger()); 

     /* ****new codes here**** */ 
     connection.start(transport); 

     /* ****new codes here**** */ 
     /* ****seems useless but should be here!**** */ 
     hub.subscribe(new Object() { 
      @SuppressWarnings("unused") 
      public void newMessage(final String message, final String messageId, final String chatId, 
            final String senderUserId, final String fileUrl, final String replyToMessageId) { 


      } 
     }); 


     /* ********************** */ 
     /* ****new codes here**** */ 
     /* **** the main method that I fetch data from server**** */ 
     connection.received(new MessageReceivedHandler() { 
      @Override 
      public void onMessageReceived(final JsonElement json) { 
       runOnUiThread(new Runnable() { 
        public void run() { 
         JsonObject jsonObject = json.getAsJsonObject(); 
         Log.e("<Debug>", "response = " + jsonObject.toString()); 

        } 
       }); 
      } 
     }); 
     /* ********************** */ 

    } 
} 

Wichtiger Hinweis:
Die Priorität der Codes ist wichtig. So behebe ich mein Problem in diesem Thema.

+0

Hallo! Danke für deine Antwort. Ich hatte dasselbe Problem und es hat mein Problem gelöst. Ich bekomme die Antwort vom Server in "onMessageReceived" -Methode .. was ich nicht erwartet wurde .. Wie auch immer, ich beobachtete, dass die Verbindung zusammenbricht und ich höre auf, Nachrichten nach einer Weile zu empfangen. Was kann der Grund dafür sein? –

+1

Auf dem Server in unserer 'startup' Klasse in der' Configuration' Methode schreiben wir diese: 'GlobalHost.Configuration.ConnectionTimeout = TimeSpan.FromMinutes (110); GlobalHost.Configuration.DisconnectTimeout = TimeSpan.FromMinutes (30); GlobalHost.Configuration.KeepAlive = TimeSpan.FromMinutes (10); '. Wir benutzen WebApi übrigens. @UmarFarooque – rejnev

+0

Danke, ich werde es vom Backend überprüft bekommen, wenn das Timeout auf eine sehr kurze Zeit eingestellt ist. –

2

Sie haben keine Provider-Parameter in Ihrer Client-Seite, die gleiche als Ihre Seite sein sollte. Der Code sollte unten sein:

 hub.on("NewMessage", new SubscriptionHandler1<String>() { 
     @Override 
     public void run(String message) { 
      Log.d("<Debug", "new message received in `on`"); 
     } 
    },String.class); //do not forget say the String class in the end 
Verwandte Themen