2014-09-26 5 views
6

Мне нужно отправить сообщение с сервера ASP.NET на устройства Android для уведомления при изменении состояния записи. Поэтому я хотел бы использовать новый Java-клиент SignalR от GitHub, используя Eclipse с Android ADT Bundle и Java.Как получать широковещательное сообщение SignalR с помощью Microsoft Java-Client?

Я новичок в Java и SignalR. У меня есть клиент SignalR Hub и JavaScript, работающий в HTML, и он может отправлять и получать сообщения. Но я не могу перейти к следующему шагу и заставить Java-Client работать в Eclipse/Java/Android. Я не уверен, как зарегистрироваться для получения широковещательного сообщения. Когда я отправляю сообщение с помощью страницы HTML/JavaScript, я не получаю сообщение в приложении Android в эмуляторе в Eclipse. Я могу

У меня есть следующий ASP.NET SignalR Hub.cs файл настройка:

using System; 
    using System.Collections.Generic; 
    using System.Linq; 
    using System.Web; 
    using Microsoft.AspNet.SignalR; 
    using Microsoft.AspNet.SignalR.Hubs; 
    using System.Threading.Tasks; 

    public class PtThroughputHub : Hub 
    { 
     public void SendAll(string message) 
     { 
      Clients.All.broadcastMessage(message); 
     } 
     public void SendGroup(string groupName, string message) 
     { 
      Clients.Group(groupName).broadcastMessage(message); 
     } 
     public Task JoinGroup(string groupName) 
     { 
      return Groups.Add(Context.ConnectionId, groupName); 
     } 
     public Task LeaveGroup(string groupName) 
     { 
      return Groups.Remove(Context.ConnectionId, groupName); 
     } 
    } 

В JavaScript, я могу также использовать файл Hubs.js, который автоматически генерируется из ASP.NET Hub.cs для отправки и получения сообщений через концентратор.

<script src="Scripts/jquery-2.1.0.min.js"></script> 
<!--Reference the SignalR library. --> 
<script src="Scripts/jquery.signalR-2.0.3.min.js"></script> 
<!--Reference the autogenerated SignalR hub script. --> 
<script src="signalr/hubs"></script>  

$(function() { 
    $.connection.hub.logging = true; 

    // Declare a proxy to reference the hub. 
    var ptThroughput = $.connection.ptThroughputHub; 
    // Create a function that the hub can call to broadcast messages. 
    ptThroughput.client.broadcastMessage = function (message) { 
     alert(message); 
    }; 

    // Start the connection. 
    $.connection.hub.start() 
     .done(function() { 
        alert('Successfully connected as ' + $.connection.hub.id); 
        ptThroughput.server.joinGroup("Group1"); 
        $('#btnSend').click(function() { 
         // Call the Send method on the hub. 
         ptThroughput.server.sendGroup('Group1', 'My Message Test Here!');       
        }) 
       }) 
       .fail(function() { $("#connection").text('Can not connect to SignalR hub!'); }); 

}); 

Однако в Затмении/Java/Android Я не уверен, какой код нужно использовать для получения широковещательного сообщения. Я могу запустить соединение и получить идентификатор соединения в конце следующего примера кода, но я застрял там. Нужно ли мне как-то использовать .on() или .subscribe()? Когда я запускаю этот код, я вижу идентификатор соединения, но я не могу вызвать широковещательное сообщение со страницы html/JavaScript. Ничего не получено, и я ничего не получаю. Кто-нибудь знает, что мне здесь не хватает?

import microsoft.aspnet.signalr.client.SignalRFuture; 
import microsoft.aspnet.signalr.client.hubs.HubConnection; 
import microsoft.aspnet.signalr.client.hubs.HubProxy; 
import microsoft.aspnet.signalr.client.hubs.SubscriptionHandler; 

//Setup connection 
String server = "http://Servername/Applications/ThroughputMobile/"; 
HubConnection connection = new HubConnection(server); 
HubProxy proxy = connection.createHubProxy("ptThroughputHub"); 


//--HERE IS WHERE I AM NOT SURE HOW TO SET IT UP TO RECEIVE A NOTIFICATION--- 
//Setup to receive broadcast message 
proxy.on("broadcastMessage",new SubscriptionHandler() {   
    @Override 
    public void run() { 
     Log.i("Test Message", "broadcastMessage received..."); 
    } 
}); 
//--------------------------------------------------------------------------- 

//Start connection 
SignalRFuture<Void> awaitConnection = connection.start(); 
try { 
    awaitConnection.get(); 
} catch (InterruptedException e) { 

//Log Connection ID 
Log.i("Test Message", "Connection ID = " + connection.getConnectionId()); 

Итак, пользуюсь proxy.on(), чтобы настроить прием уведомлений о вещах или что-то еще? И какую строку я передаю методу? «broadcastMessage» или, возможно, «sendAll» в моем случае? Любая помощь будет принята с благодарностью.

+0

Посмотрите этот http://stackoverflow.com/ a/42527962/1770868 –

ответ

8

Я не вызывал метод JoinGroup() от концентратора SignalR, указанного в вопросе. Имеет смысл, что вам нужно присоединиться к концентратору, чтобы иметь возможность принимать трансляцию. Итак, в моей справочной службе onStart(), я звоню invoke("JoinGroup", "Group1"). Затем я вызываю метод on() для настройки обработчика полученного сообщения. Group1 - это конфигурируемое имя группы, которое хаб использует для разделения широковещательных передач, поэтому разные группы могут использовать один и тот же концентратор. См. Полный код и прокомментированный блок решений ниже. Надеюсь, это поможет кому-то!

Вот что помогло мне следует полный код Фоновая службы Android:

//Invoke JoinGroup to start receiving broadcast messages    
proxy.invoke("JoinGroup", "Group1"); 

//Then call on() to handle the messages when they are received.   
proxy.on("broadcastMessage", new SubscriptionHandler1<String>() 
{ 
    @Override 
    public void run(String msg) { 
     Log.d("result := ", msg);     
    } 
}, String.class); 

Вот полный Android код Фоновая служба:

import java.util.concurrent.ExecutionException; 
import android.app.Notification; 
import android.app.NotificationManager; 
import android.app.PendingIntent; 
import android.app.Service; 
import android.content.Context; 
import android.content.Intent; 
import android.os.IBinder; 
import android.widget.Toast; 
import microsoft.aspnet.signalr.client.*; 
import microsoft.aspnet.signalr.client.hubs.*; 

public class NotifyService extends Service { 

    @Override 
    public void onCreate() { 
     super.onCreate();  
    } 

    @SuppressWarnings("deprecation") 
    @Override 
    public void onStart(Intent intent, int startId) {  
      super.onStart(intent, startId);  
      Toast.makeText(this, "Service Start", Toast.LENGTH_LONG).show();  

     String server = "http://Servername/Applications/ThroughputMobile/"; 
      HubConnection connection = new HubConnection(server); 
      HubProxy proxy = connection.createHubProxy("ptThroughputHub"); 

      SignalRFuture<Void> awaitConnection = connection.start(); 
      try { 
       awaitConnection.get(); 
      } catch (InterruptedException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } catch (ExecutionException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      }   

     //--HERE IS MY SOLUTION----------------------------------------------------------- 
     //Invoke JoinGroup to start receiving broadcast messages    
     proxy.invoke("JoinGroup", "Group1"); 

     //Then call on() to handle the messages when they are received.   
      proxy.on("broadcastMessage", new SubscriptionHandler1<String>() { 
       @Override 
       public void run(String msg) { 
        Log.d("result := ", msg);     
       } 
      }, String.class); 

     //-------------------------------------------------------------------------------- 
    } 
    @Override 
    public void onDestroy() { 
     super.onDestroy();  
    } 
    @Override 
    public IBinder onBind(Intent arg0) { 
     return null; 
    } 
} 
+0

Красиво сделано. Я могу подключиться к серверу, но у меня такая же проблема. Невозможно получить ответ от вызова метода. – Muhammad

+0

Hi Andy & Muhammad: можете ли вы поделиться кодом для чата, потому что я не могу правильно подключиться. Ожидание вашего быстрого воспроизведения. –

+0

@TeraiyaMayur, пожалуйста, взгляните на [мой ответ здесь] (http: // stackoverflow.com/questions/32573823/how-to-use-signalr-in-android/32574829 # 32574829) – BNK

Смежные вопросы