Настройка Signal R в Android: проблема с зависанием / зависанием

1

Я выполнил ЭТОТ учебник, чтобы настроить .NET Backend для моего Android-приложения для реализации Signal R. Я создал SignalR Self- Хостинг.

Здесь мой код Backend в проекте консоли:

namespace SignalRSelfHost
{
    class Program
    {
        static void Main(string[] args)
        {
            // This will *ONLY* bind to localhost, if you want to bind to all addresses
            // use http://*:8080 to bind to all addresses. 
            // See http://msdn.microsoft.com/en-us/library/system.net.httplistener.aspx 
            // for more information.
            string url = "http://localhost:8080";
            using (WebApp.Start(url))
            {
                Console.WriteLine("Server running on {0}", url);
                Console.ReadLine();
            }
        }
    }
    class Startup
    {
        public void Configuration(IAppBuilder app)
        {
            app.UseCors(CorsOptions.AllowAll);
            app.MapSignalR();
        }
    }
    public class MessageHub : Hub
    {
        public static event Action<string, string> MessageReceived = delegate { };

        public void SendMessage(string name, string message)
        {
            MessageReceived(name, message);
        }

    }

    public class CustomType
    {
        public string Name;
        public int Id;
    }
}

Мой Android-код:

    Handler handler;
    TextView statusField;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main2);

        handler = new Handler();
        statusField = (TextView) findViewById(R.id.statusField);

        Platform.loadPlatformComponent(new AndroidPlatformComponent());
        // Change to the IP address and matching port of your SignalR server.
        String host = "http://192.168.1.5:8080/";
        HubConnection connection = new HubConnection( host );
        HubProxy hub = connection.createHubProxy( "MessageHub" );
        ClientTransport transport = new ServerSentEventsTransport(connection.getLogger());

        SignalRFuture<Void> awaitConnection = connection.start(transport);
        try {
            awaitConnection.get();
        }
        catch (InterruptedException e) {
            Log.d("CHECK", e.toString());
            e.printStackTrace();
        } catch (ExecutionException e) {
            Log.d("CHECK", e.toString());
            e.printStackTrace();
        }

        hub.subscribe(this);

        try {
            hub.invoke( "SendMessage", "Client", "Hello world!" ).get();
            hub.invoke( "SendCustomType",
                    new CustomType() {{ Name = "Universe"; Id = 42; }} ).get();
        } catch (InterruptedException e) {
            // Handle ...
        } catch (ExecutionException e) {
            // Handle ...
        }

    }

    public void UpdateStatus(String status) {
        final String fStatus = status;
        handler.post(new Runnable() {
            @Override
            public void run() {
                statusField.setText(fStatus);
            }
        });
    }

    public class CustomType
    {
        public String Name;
        public int Id;
    }

Однако в итоге я вижу экран, который висит, и он ничего не отображает, и приложение перестает отвечать. В журнале регистрации Android отображается следующая ошибка:

java.util.concurrent.ExecutionException: java.net.ConnectException: не удалось подключиться к localhost/127.0.0.1 (порт 80) после 15000ms: isConnected failed: ECONNREFUSED (соединение отклонено)

Правильно ли мой код и правильно ли я выполнил руководство? Это очень прямой справочник, но эта проблема возникает. Может кто-нибудь помочь?

ИЗМЕНИТЬ

Это - очень похожий вопрос, на самом деле он описывает ту же проблему. Однако это не принесло мне никакой пользы. Если вы заметили мой код Android, я уже внес эти изменения в этот вопрос. Тем не менее проблема не устранена.

StackTrace

 java.util.concurrent.ExecutionException: java.net.SocketTimeoutException: failed to connect to / 192.168.1.5(port 8080) after 15000ms
 at microsoft.aspnet.signalr.client.SignalRFuture.get(SignalRFuture.java: 112)
 at microsoft.aspnet.signalr.client.SignalRFuture.get(SignalRFuture.java: 102)
 at com.example.dinuka.signalrtest.Main2Activity.onCreate(Main2Activity.java: 40)
 at android.app.Activity.performCreate(Activity.java: 6289)
 at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java: 1119)
 at android.app.ActivityThread.performLaunchActivity(ActivityThread.java: 2655)
 at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java: 2767)
 at android.app.ActivityThread.access$900(ActivityThread.java: 177)
 at android.app.ActivityThread$H.handleMessage(ActivityThread.java: 1449)
 at android.os.Handler.dispatchMessage(Handler.java: 102)
 at android.os.Looper.loop(Looper.java: 145)
 at android.app.ActivityThread.main(ActivityThread.java: 5951)
 at java.lang.reflect.Method.invoke(Native Method)
 at java.lang.reflect.Method.invoke(Method.java: 372)
 at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java: 1400)
 at com.android.internal.os.ZygoteInit.main(ZygoteInit.java: 1195)
 Caused by: java.net.SocketTimeoutException: failed to connect to / 192.168.1.5(port 8080) after 15000ms
 at libcore.io.IoBridge.connectErrno(IoBridge.java: 169)
 at libcore.io.IoBridge.connect(IoBridge.java: 122)
 at java.net.PlainSocketImpl.connect(PlainSocketImpl.java: 183)
 at java.net.PlainSocketImpl.connect(PlainSocketImpl.java: 456)
 at java.net.Socket.connect(Socket.java: 882)
 at com.android.okhttp.internal.Platform.connectSocket(Platform.java: 139)
 at com.android.okhttp.Connection.connect(Connection.java: 1194)
 at com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java: 392)
 at com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java: 295)
 at com.android.okhttp.internal.http.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java: 373)
 at com.android.okhttp.internal.http.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java: 323)
 at com.android.okhttp.internal.http.HttpURLConnectionImpl.getResponseCode(HttpURLConnectionImpl.java: 491)
 at microsoft.aspnet.signalr.client.http.java.NetworkRunnable.run(NetworkRunnable.java: 72)
 at java.lang.Thread.run(Thread.java: 818)
  • 0
    показать полный журнал.
  • 0
    Держись @MurtazaKhursheedHussain
Показать ещё 11 комментариев
Теги:
signalr
azure-mobile-services
signalr-hub
signalr.client

1 ответ

1
Лучший ответ

У меня была аналогичная проблема несколько дней назад, и эта проблема Github помогла: https://github.com/SignalR/java-client/issues/63

В основном то, что я сделал, это изменить файл WebsocketTransport.java в проекте signalr-client-sdk. Заменить:

uri = new URI(url);

с

uri = new URI(url.replace("http://", "ws://"));

вокруг строки 86 в исходном коде.

Теперь я могу подключать и отправлять сообщения и получать необработанные данные, но не могу подписаться на события...

Надеюсь, это поможет вам решить вашу проблему.

  • 0
    Я обязательно попробую это завтра. Не могу дождаться! Спасибо. Я вернусь к тебе завтра. Жаль, что хороших учебников там нет. Так сложно настроить это правильно
  • 0
    Хорошо, держите нас в курсе.
Показать ещё 6 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню