2014-09-26 42 views
6

Tôi cần phải đẩy tin nhắn từ máy chủ ASP.NET tới thiết bị Android để nhận thông báo bất cứ khi nào trạng thái của bản ghi được thay đổi. Vì vậy, tôi muốn sử dụng Trình khách Java SignalR mới của Microsoft từ GitHub sử dụng Eclipse với Gói ADT của Android và Java.Làm cách nào để nhận tin nhắn phát sóng SignalR bằng Microsoft Java-Client?

Tôi mới vào Java và SignalR. Tôi có SignalR Hub và JavaScript client làm việc trong HTML và nó có thể gửi và nhận tin nhắn. Nhưng tôi không thể chuyển sang bước tiếp theo và làm cho Java-Client hoạt động trong Eclipse/Java/Android. Tôi không chắc cách đăng ký để nhận tin nhắn quảng bá. Khi tôi gửi thư bằng trang HTML/JavaScript, tôi không nhận được thông báo trong ứng dụng Android, trong trình mô phỏng, trong Eclipse. Tôi có thể

Tôi đã sau tập ASP.NET SignalR Hub.cs thiết lập:

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

Trong JavaScript, tôi cũng có thể sử dụng các tập tin Hubs.js đó là tính năng tự động tạo ra từ ASP.NET Hub.cs để gửi và nhận tin nhắn thông qua Hub.

<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!'); }); 

}); 

Tuy nhiên, trong Eclipse/Java/Android Tôi không chắc chắn những gì mã tôi cần phải sử dụng để nhận được một thông điệp quảng bá. Tôi có thể bắt đầu kết nối và nhận được một connectionID ở phần cuối của ví dụ mã sau đây nhưng tôi bị mắc kẹt ở đó. Tôi có cần sử dụng .on() hoặc .subscribe() bằng cách nào đó không? Khi tôi chạy mã này, tôi thấy một ID kết nối được ghi lại nhưng tôi không thể kích hoạt thông báo phát sóng từ trang html/JavaScript. Không có gì được nhận và tôi không nhận được lỗi ở bất cứ đâu. Có ai biết những gì tôi có thể bị thiếu ở đây không?

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

Vì vậy, một lần nữa, tôi có sử dụng proxy.on() để thiết lập để nhận thông báo phát sóng hoặc nội dung khác không? Và những gì chuỗi để tôi vượt qua phương pháp? "broadcastMessage" hoặc có thể "sendAll" trong trường hợp của tôi? Mọi sự trợ giúp sẽ rất được trân trọng.

+0

Xem này http://stackoverflow.com/ a) 42527962/1770868 –

Trả lời

8

Tôi đã không gọi phương thức JoinGroup() từ Trung tâm SignalR được hiển thị trong Câu hỏi. Nó có ý nghĩa rằng bạn cần phải tham gia Hub để có thể nhận được một phát sóng. Vì vậy, trong Dịch vụ nền của tôi onStart(), tôi gọi invoke("JoinGroup", "Group1"). Sau đó, tôi gọi phương thức on() để thiết lập trình xử lý của thông báo nhận được. Group1 là tên nhóm có thể định cấu hình mà trung tâm sử dụng để tách các chương trình phát sóng để các nhóm khác nhau có thể sử dụng cùng một Hub. Xem mã đầy đủ và nhận xét khối giải pháp bên dưới. Hy vọng điều này tiết kiệm một ai đó một thời gian!

Dưới đây là những gì đã giúp tôi tiếp theo là Android mã dịch vụ nền đầy đủ:

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

Đây là Android mã dịch vụ nền đầy đủ:

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

Thực hiện tốt. Tôi có thể kết nối với máy chủ nhưng bị kẹt ở cùng một vấn đề. Không thể nhận được bất kỳ phản hồi nào từ cuộc gọi phương thức. – Muhammad

+0

Xin chào Andy & Muhammad: bạn có thể chia sẻ mã để trò chuyện vì tôi không thể có kết nối đúng cách như vậy. Đang chờ phát lại nhanh chóng của bạn. –

+0

@TeraiyaMayur hãy xem [câu trả lời của tôi ở đây] (http: // stackoverflow.com/questions/32573823/how-to-use-signalr-in-android/32574829 # 32574829) – BNK

Các vấn đề liên quan