2017-04-13 29 views
0

私はSpringブートに基づいてWebSocketサーバーにアンドロイドで接続する際に助けが必要です。 == falseをhttps://spring.io/guides/gs/messaging-stomp-websocket/StompClientに接続している間に私は間違っていますか?

すべてをとっている私、このサーバーのソースコードは、このサンプル、 にサーバとブラウザクライアント上で正常に動作しますが、私はStompClientを使用する場合(https://github.com/NaikSoftware/StompProtocolAndroidは)私はmStompClient.isConnected()を取得しています私のソケットに接続するにはconand mStompClient.send(...)は何も送信しません(?)。

数分後にsocketwebサーバーが接続を終了し、私のログに「~~ Stomp connection closed」というメッセージが表示されます。 WebサーバーはHerokuクラウドシステム上に配置されます。 アンドロイド活動からの私の接続コードがあります:

private StompClient mStompClient; 

    private void connectStomp(){ 
     mStompClient = Stomp.over(WebSocket.class, "wss://myserver/gs-guide-websocket"); 

     mStompClient.topic("/topic/greetings").subscribe(new Action1<StompMessage>() { 
      @Override 
      public void call(StompMessage stompMessage) { 
       Log.w(TAG, "== "+stompMessage.getPayload()); 
      } 
     }); 


     mStompClient.connect(); 

     mStompClient.lifecycle().subscribe(new Action1<LifecycleEvent>() { 
      @Override 
      public void call(LifecycleEvent lifecycleEvent) { 
       switch (lifecycleEvent.getType()) { 

        case OPENED: 
         Log.w(TAG, "~~ Stomp connection opened"); 
         break; 

        case ERROR: 
         Log.e(TAG, "~~ Error", lifecycleEvent.getException()); 
         break; 

        case CLOSED: 
         Log.w(TAG, "~~ Stomp connection closed "+lifecycleEvent.getMessage()); 
         break; 
       } 
      } 
     }); 
    } 

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

    // Send test request to server 
    public void onSend(View view){ 
     Log.w(TAG,"onSend: click"); 
     mStompClient.send("/app/hello","Test").subscribe(new Observer<Void>() { 
      @Override 
      public void onCompleted() { 
       Log.w(TAG, "~~~~ onCompleted"); 
      } 

      @Override 
      public void onError(Throwable e) { 
       Log.w(TAG, "~~~~ onCompleted "+e.getMessage()); 
      } 

      @Override 
      public void onNext(Void aVoid) { 
       Log.w(TAG, "~~~~ onNext "); 
      } 
     }); 
     if (mStompClient.isConnected()){ 
      mStompClient.send("/app/hello","test msg").subscribe(); 
      Log.w("aaaa : ","onCreate: connected"); 
     } 
    } 

それは私のミスであってもよいが、私は春のブートWebSocketStompClientのeverithingと私のサーバーソケットに接続する場合は正常に動作します:

private SockJsClient sockJsClient; 

    private WebSocketStompClient stompClient; 

    private final WebSocketHttpHeaders headers = new WebSocketHttpHeaders(); 

    @Before 
    public void setup() { 
     List<Transport> transports = new ArrayList<>(); 
     transports.add(new WebSocketTransport(new StandardWebSocketClient())); 
     this.sockJsClient = new SockJsClient(transports); 

     this.stompClient = new WebSocketStompClient(sockJsClient); 
     this.stompClient.setMessageConverter(new MappingJackson2MessageConverter()); 
    } 

    @Test 
    public void getGreeting() throws Exception { 

     final CountDownLatch latch = new CountDownLatch(1); 
     final AtomicReference<Throwable> failure = new AtomicReference<>(); 

     StompSessionHandler handler = new TestSessionHandler(failure) { 

      @Override 
      public void afterConnected(final StompSession session, StompHeaders connectedHeaders) { 
       session.subscribe("/topic/greetings", new StompFrameHandler() { 
        @Override 
        public Type getPayloadType(StompHeaders headers) { 
         return Greeting.class; 
        } 

        @Override 
        public void handleFrame(StompHeaders headers, Object payload) { 
         Greeting greeting = (Greeting) payload; 

         try { 
          System.out.println(greeting.getContent()); 
          assertEquals("Hello, Spring!", greeting.getContent()); 
         } catch (Throwable t) { 
          System.out.println(t.getMessage()); 
          failure.set(t); 
         } finally { 
          session.disconnect(); 
          latch.countDown(); 
         } 
        } 
       }); 
       try { 
        session.send("/app/hello", "Test"); 
       } catch (Throwable t) { 
        failure.set(t); 
        latch.countDown(); 
       } 
      } 
     }; 

     this.stompClient.connect("wss://myserver/gs-guide-websocket", this.headers, handler, 443); 

     if (latch.await(10, TimeUnit.SECONDS)) { 
      if (failure.get() != null) { 
       throw new AssertionError("", failure.get()); 
      } 
     } 
     else { 
      fail("Greeting not received"); 
     } 

    } 

    private class TestSessionHandler extends StompSessionHandlerAdapter { 

     private final AtomicReference<Throwable> failure; 


     public TestSessionHandler(AtomicReference<Throwable> failure) { 
      this.failure = failure; 
     } 

     @Override 
     public void handleFrame(StompHeaders headers, Object payload) { 
      this.failure.set(new Exception(headers.toString())); 
     } 

     @Override 
     public void handleException(StompSession s, StompCommand c, StompHeaders h, byte[] p, Throwable ex) { 
      this.failure.set(ex); 
     } 

任意のアイデア?どうもありがとう!

+0

私はストンプベースのWebソケットに接続するために、同じライブラリを使用しました。サーバー側にはいくつかの設定がありました。アンドロイド側では、 "ws://"で始まり、 "ws://" + SERVER_URL + "/ websocket"のように "websocket"で終わるURLを使用していました。サーバー側のこの回答を参照してください:http://stackoverflow.com/a/41751897/5392825 –

+0

あなたは絶対に正しいです! 問題が解決しました。 –

+0

あなたの問題を解決したら、私の答えを受け入れて、投票してください。 –

答えて

1

Stompベースのウェブソケットに接続するために同じライブラリを使用しました。サーバー側にはいくつかの設定がありました。アンドロイド側では、「ws://」で始まり、「websocket」で終わるURLを「ws://」+「SERVER_URL +」/ websocket「」のように使用していました。

は、サーバ側のためにこの回答を参照してください。stackoverflow.com/a/41751897/5392825

関連する問題