2013-06-18 143 views
1

我在服務器和客戶端之間有WebSockets連接。這允許我發送命令給客戶,他用數據迴應我。該服務器也有Web服務。然後我可以說,「在該客戶端上執行此命令」。因此,我們有:如何通過WebSockets響應Web服務請求

客戶端1 --- Web服務 - >服務器的WebSockets --- --->客戶端2

的問題是,從客戶端2接收數據的服務器上的方法是無效

如何將數據發送回Client1?

的WebServices:

@Path("/ws") 
public class QOSResource { 
    public QOSResource(){} 

    @Produces(MediaType.TEXT_PLAIN) 
    @Path("/ping/{macAddr}") 
    @GET 
    public String getPing(@PathParam("macAddr") String macAddr){ 
    return"Mac adresse : "+macAddr; 
    //WebSocketsCentralisation.getInstance().ping(macAddr); 
    } 
} 

的WebSockets提前

@OnWebSocketMessage 
    public **void** onText(Session session, String message) { 
     if (session.isOpen()) { 
      if(firstConnection){ 
       firstConnection = false; 
       this.macAddr = message; 
       WebSocketsCentralisation.getInstance().join(this); 
      } 
      ObjectMapper mapper = new ObjectMapper(); 
       Object o; 
       try { 
        o = mapper.readValue(message, Object.class); 
        if(o instanceof PingResult){ 
         **// TODO return result to ws** 

         } 
       } catch (JsonParseException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } catch (JsonMappingException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } catch (IOException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 
     } 
    } 

感謝您的幫助

回答

0

你的WebSocket處理程序應該有一個相關的連接實例上,您可以撥打sendMessage()

+0

對不起,我真的不知道你在說什麼。我的websockets和我的客戶端2之間的通信是好的。客戶端1使用web服務時出現問題。如何在我告訴「執行ping」(getPing)和接收之間進行同步。 – brunettia

+0

@brunettia - 你的代碼指出_websockets_調用的void方法,但你的問題似乎指的是_webservices_調用。這是什麼? – jtahlborn

+0

兩者其實。 websocket服務器將收到數據,但是以無效的方式。那麼如何將數據發送回web服務,並讓它等待響應呢! – brunettia

1

您在方法參數中獲得的對象Session包含與遠程端點的對話範圍。

您需要使用Session.getRemote()爲了發送消息而返回的RemoteEndpoint

例子:

// Send BINARY websocket message (async) 
byte data[] = mapper.toBytes(obj); 
session.getRemote().sendBytesByFuture(data); 

// Send TEXT websocket message (async) 
String text = mapper.toString(obj); 
session.getRemote().sendStringByFuture(text); 

要知道,雖然在session.getRemote()調用將拋出WebSocketException如果遠程端點連接不再處於打開狀態(如情況下遠程端點發送你一條消息,然後立即發起一個CLOSE握手控制消息)。

// How to handle send message if remote isn't there 
try { 
    // Send message to remote 
    session.getRemote().sendString(text); 
} catch(WebSocketException e) { 
    // WebSocket remote isn't available. 
    // The connection is likely closed or in the process of closing. 
} 

注:這種風格的WebSocket的使用,在這裏你有一個會話和RemoteEndpoint是與即將推出的JSR-356標準(javax.websocket)一致。在標準API中,您需要使用javax.websocket.Sessionjavax.websocket.RemoteEndpoint

+0

對不起,我認爲我無法用英語正確解釋自己(我會說法語)。你在這裏解釋的是正確的,我使用它。我的問題在哪裏:我的服務器有websockets和webservices。 Web服務允許我通過websocket訪問客戶端。在我的例子中,我想獲得遠程設備的ping。所以我使用API​​/ws/ping/macAddr。在這裏,我可以訪問正確的會話併發送我的命令(ping)。我不能做的是得到答案,因爲通過websockets接收數據的服務器上的方法是無效的。 – brunettia

+0

這是正確的,WebSocket @onMessage調用的Jetty API是返回類型'void'。這是因爲Jetty內部WebSocket解析器最終會調用此消息並且不期望返回類型。即將到來的Jetty 9.1將支持JSR-356(javax.websocket),它具有@OnMessage調用的返回類型的概念,但請注意,這也由WebSocket實現管理,您無法掛接到此JSR-356返回在websocket外部輸入。 –

+0

所以這裏是我的問題:)如果「onText」方法是無效的,我怎樣才能將響應發送回我的webservices ... – brunettia