2016-09-20 23 views
8

Tôi đã đọc những thông tin:
how to use SignalR in Android
Android Client doesn't get data but .net client getting data from SignalR serverứng dụng Android không nhận được dữ liệu từ SignalR hub

tôi viết một hệ thống trò chuyện đơn giản với Android hoạt động với SignalR.
Giả sử khách hàng gửi tin nhắn (bằng cách gọi SendMessage phương thức trên máy chủ) và máy chủ sẽ gọi phương thức NewMessage trên máy khách.

Đây là lớp của tôi ChatHub (được đơn giản hóa) được viết bằng C#.

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

Khi client android kết nối đến máy chủ, Trên phương pháp OnConnected, id kết nối sẽ được lưu trữ trong _connectedClients và nó hoạt động tốt.

Trong phương pháp SendMessage của lớp ChatHub, Chúng tôi có android id kết nối thiết bị, và tôi chắc chắn rằng thiết bị android nằm trong danh sách

Và đây là mã Andoird tôi:

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

    } 
} 

Trong mã số java ở trên, hãy gọi sendMessage trên máy chủ hoạt động tốt và máy chủ nhận được thư.
Nhưng vấn đề duy nhất là các sự kiện hub.on(...) hoặc hub.subscribe(...) không bao giờ được gọi bởi máy chủ.
Trong một mô tả đơn giản, Ứng dụng của tôi có thể gửi tin nhắn, nhưng không thể nhận tin nhắn từ những người khác.
Mọi đề xuất sẽ được đánh giá cao.

+0

Xem http://stackoverflow.com/a/42527962/1770868 –

Trả lời

6

Đối với tương lai đây là cách cuối cùng tôi đã đạt được những câu trả lời (trước tiên hãy đọc những câu hỏi mã android):

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

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

    } 
} 

lưu ý quan trọng:
Ưu tiên của các mã là quan trọng. đây là cách tôi khắc phục sự cố của mình trong chủ đề này.

+0

Xin chào! Cảm ơn câu trả lời của bạn Tôi đã phải đối mặt với cùng một vấn đề và nó đã giải quyết được vấn đề của tôi. Tôi nhận được phản hồi từ máy chủ trong "onMessageReceived" phương pháp .. mà tôi đã không mong đợi .. Dù sao tôi quan sát thấy rằng kết nối bị phá vỡ và tôi ngừng nhận tin nhắn sau một thời gian .. những gì có thể là lý do cho nó? –

+1

Trong máy chủ trong lớp 'khởi động' của chúng ta trong phương thức' Cấu hình', chúng ta viết: 'GlobalHost.Configuration.ConnectionTimeout = TimeSpan.FromMinutes (110); GlobalHost.Configuration.DisconnectTimeout = TimeSpan.FromMinutes (30); GlobalHost.Configuration.KeepAlive = TimeSpan.FromMinutes (10); '. Chúng tôi đang sử dụng WebApi bằng cách này. @UmarFarooque – rejnev

+0

Cảm ơn, tôi sẽ kiểm tra nó từ chương trình phụ trợ nếu thời gian chờ được đặt thành thời gian rất ngắn. –

2

Bạn không cung cấp thông số nhà cung cấp ở phía khách hàng của mình, cần phải là cùng một trang web bên cạnh bạn. Mã nên được dưới:

 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 
Các vấn đề liên quan