質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Azure

Azureは、マイクロソフトのクラウド プラットフォームで、旧称は Windows Azureです。PaaSとIaaSを組み合わせることで、 コンピューティング・ストレージ・データ・ネットワーキング・アプリケーションなど多くの機能を持ちます。

Q&A

解決済

1回答

2500閲覧

Azure上のSignalRを、WindowsとAndroidから利用したい

mzks3254

総合スコア12

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Azure

Azureは、マイクロソフトのクラウド プラットフォームで、旧称は Windows Azureです。PaaSとIaaSを組み合わせることで、 コンピューティング・ストレージ・データ・ネットワーキング・アプリケーションなど多くの機能を持ちます。

0グッド

0クリップ

投稿2018/10/23 08:10

編集2018/10/23 08:19

初めて質問させていただきます。

現在、Azure上にSignalRサーバを配置して、WindowsアプリとAndroidアプリから利用しようとしています。
各種サンプルがwebにあるので、Windowsアプリ側はやりとりできるようになりました。
しかし、Androidアプリからは、1回~数回だけInvokeでSignalRサーバにメッセージが飛ぶだけで、その後は飛ばず、コールバックも呼ばれない状況です。
Androidアプリ初心者のため、根本的にAndroidからのSignalRの実装方法が誤っているのかもしれません。

試験端末はAndroid 6です。
開発環境はAndroid Studio3で、ライブラリに「gson-2.8.5.jar」と「signalr-claient-sdk.jar」を追加しています。

少なからずともアドバイスいただけたら幸甚です。
初めての質問でぶしつけなところがありましたらご容赦ください。

少し抽象的で申し訳ありませんが、以下のような実装をしています。

Andridアプリの実装

private HubConnection hubConnection; private HubProxy proxy; SignalRFuture<Void> awaitConnection; @Override protected void onCreate(Bundle savedInstanceState) { hubConnection = new HubConnection("https://xxxxxxxxxx.azurewebsites.net/"); proxy = hubConnection.createHubProxy("MyHub1"); //proxy.subscribe(MainActivity.this); // ハブらからの呼び出し(コールバックの登録) ←このコールバックが呼ばれない proxy.on("addNewMessageToPage", new SubscriptionHandler2<String, byte[]>() { @Override public void run(final String name, final byte[] data) { // 受け取ったデータの処理 } }, String.class, byte[].class); awaitConnection = hubConnection.start(); try{ awaitConnection.get(); }catch(Exception e){ e.printStackTrace(); return; } } あるメソッド(){ リスナ(new リスナ() { // フレームごとの処理 @Override public void コールバックメソッド(myName, Buffer) { try{ // クライアントからハブのメソッド呼び出し proxy.invoke("Send", myName, Buffer); ↑数回はSignalRサーバに届く } catch (Exception e) { e.printStackTrace(); } } }); }

SignalRサーバの実装

Startup1.cs

using System; using System.Threading.Tasks; using Microsoft.Owin; using Owin; [assembly: OwinStartup(typeof(WebApplication2.Controllers.Startup1))] namespace WebApplication2.Controllers { public class Startup1 { public void Configuration(IAppBuilder app) { // アプリケーションの構成方法の詳細については、https://go.microsoft.com/fwlink/?LinkID=316888 を参照してください app.MapSignalR(); } } }

MyHub1.cs

using System; using System.Collections.Generic; using System.Linq; using System.Web; using Microsoft.AspNet.SignalR; using Microsoft.AspNet.SignalR.Hubs; namespace WebApplication2.Controllers { [HubName("MyHub1")] public class MyHub1 : Hub { public void Send(string name, byte[] data) { //Clients.Caller.addNewMessageToPage(name, data); IHubContext hubContext = GlobalHost.ConnectionManager.GetHubContext<MyHub1>(); hubContext.Clients.All.addNewMessageToPage(name, data); } } }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

自己解決しました。

まずInvokeで数回で送信が途切れてしまったのは、送信サイズが大きかったせいのようです。
ひとまず3kByte以下にすることで連続して送信できるようになりました。

コールバックで受信できていなかった個所に関しては、送信時にBase64にエンコードしてから送信し、コールバックの受信側でデコードする処理にしたところ、正常に動作しました。

上記が妥当な解決策かはまだ不明ですが、AndroidでもSignalRの送受信が確認できました。

投稿2018/10/24 02:29

mzks3254

総合スコア12

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問