2014-09-26 3 views
6

레코드 상태가 변경 될 때마다 알림을 위해 ASP.NET 서버에서 Android 디바이스로 메시지를 푸시해야합니다. 그래서 안드로이드 ADT 번들과 자바로 Eclipse를 사용하여 GitHub의 새로운 Microsoft SignalR Java-Client를 사용하고 싶습니다. https://github.com/SignalR/java-client Microsoft Java 클라이언트를 사용하여 SignalR 브로드 캐스트 메시지를받는 방법은 무엇입니까?

  • http://whathecode.wordpress.com/2014/03/20/getting-started-with-the-java-signalr-sdk/
  • 나는 Java 및 SignalR 새로운 오전

    • . HTML로 작업하는 SignalR Hub 및 JavaScript 클라이언트가 있고 메시지를 보내고받을 수 있습니다. 그러나 나는 다음 단계로 가서 Java-Client가 Eclipse/Java/Android에서 작동하도록 할 수는 없다. 브로드 캐스트 메시지를 수신하기 위해 등록하는 방법을 모르겠습니다. HTML/JavaScript 페이지를 사용하여 메시지를 보낼 때 Eclipse의 에뮬레이터 인 Android 애플리케이션에서 메시지를받지 못합니다. 나는 내가 다음과 같은 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); 
           } 
          } 
      

      , 나는 또한에서 자동으로 생성되는 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!'); }); 
      
      }); 
      

      그러나 Eclipse/Java/Android에서 브로드 캐스트 메시지를 수신하려면 어떤 코드를 사용해야하는지 잘 모릅니다. 연결을 시작하고 다음 코드 예제의 끝에 connectionID를받을 수 있지만 거기에 머물러 있습니다. 어떻게 든 .on() 또는 .subscribe()를 사용해야합니까? 이 코드를 실행하면 연결 ID가 기록되지만 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

    질문에 표시된 SignalR 허브에서 JoinGroup() 메서드를 호출하지 않았습니다. 브로드 캐스트를 수신하려면 Hub에 가입해야합니다. 그래서 배경 서비스 onStart()에서 invoke("JoinGroup", "Group1")으로 전화합니다. 그런 다음 on() 메서드를 호출하여 수신 된 메시지의 처리기를 설정합니다. Group1은 허브가 브로드 캐스트를 분할하여 여러 그룹이 동일한 허브를 사용할 수 있도록 구성 할 수있는 그룹 이름입니다. 아래의 전체 코드 및 주석 처리 된 솔루션 블록을 참조하십시오. 희망이 누군가가 시간을 구하십시오! 여기

    //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); 
    

    전체 안드로이드 백그라운드 서비스 코드 :

    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

    안녕하세요 Andy & Muhammad : 채팅을 할 때 코드를 공유 할 수 있습니까? 제대로 연결할 수 없기 때문입니다. 빠른 재생을 기다리고 있습니다. –

    +0

    @TeraiyaMayur 제발 [내 대답은 여기에보세요] (http : // stackoverflow.com/questions/32573823/how-to-use-signalr-in-android/32574829 # 32574829) – BNK

    관련 문제