1

我在服务器和客户端之间有一个 WebSockets 连接。这使我可以向客户发送命令,他会用数据回应我。服务器也有网络服务。然后我可以说,“在那个客户端上执行这个命令”。所以我们有:

Client1 ---webservices--> 服务器 ---websockets---> Client2

问题是,从 Client2 接收数据的服务器上的方法是void

如何将数据发送回 Client1 ?

网页服务:

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

网络套接字

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

在此先感谢您的帮助

4

2 回答 2

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

请注意,如果远程端点连接不再处于打开状态(例如远程端点向您发送消息然后立即启动 CLOSE 握手控制消息的情况),则 session.getRemote() 调用将引发 WebSocketException .

// 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 使用,你有一个 Session 和一个 RemoteEndpoint 与即将到来的 JSR-356 标准(javax.websocket)一致。在标准 API 中,您将拥有javax.websocket.Sessionjavax.websocket.RemoteEndpoint使用它。

于 2013-06-18T12:57:20.543 回答
0

您的 websocket 处理程序应该有一个关联的 Connection 实例,您可以在其上调用sendMessage().

于 2013-06-18T11:56:44.817 回答