Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/390.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何通过WebSocket响应Web服务请求_Java_Web Services_Websocket_Jersey_Jetty - Fatal编程技术网

Java 如何通过WebSocket响应Web服务请求

Java 如何通过WebSocket响应Web服务请求,java,web-services,websocket,jersey,jetty,Java,Web Services,Websocket,Jersey,Jetty,我在服务器和客户端之间有一个WebSocket连接。这允许我向客户机发送命令,客户机用数据响应我。服务器也有web服务。然后我可以告诉你,“在那个客户机上执行这个命令”。因此,我们: Client1---webservices-->服务器---websockets-->Client2 问题是,从Client2接收数据的服务器上的方法是void 如何将数据发送回Client1 网络服务: @Path("/ws") public class QOSResource { public QOSR

我在服务器和客户端之间有一个WebSocket连接。这允许我向客户机发送命令,客户机用数据响应我。服务器也有web服务。然后我可以告诉你,“在那个客户机上执行这个命令”。因此,我们:

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

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

提前感谢您的帮助

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

方法参数中的对象包含与远程端点对话的范围

您将希望使用返回的来发送消息

示例:

//发送二进制websocket消息(异步)
字节数据[]=映射器.toBytes(obj);
session.getRemote().sendBytesByFuture(数据);
//发送文本websocket消息(异步)
字符串text=mapper.toString(obj);
session.getRemote().sendStringByFuture(文本);
请注意,如果远程端点连接不再处于打开状态(例如远程端点向您发送消息,然后立即启动关闭握手控制消息),则session.getRemote()调用将引发WebSocketException

//如果没有远程设备,如何处理发送消息
试一试{
//向远程发送消息
session.getRemote().sendString(文本);
}捕获(WebSocketException e){
//WebSocket remote不可用。
//连接可能已关闭或正在关闭过程中。
}
注意:这种类型的websocket使用,其中您有一个会话和一个RemoteEndpoint,与即将推出的JSR-356标准(
javax.websocket
)一致。在标准API中,您将使用
javax.websocket.Session
javax.websocket.RemoteEndpoint

方法参数中的对象包含您与远程端点的对话范围

您将希望使用返回的来发送消息

示例:

//发送二进制websocket消息(异步)
字节数据[]=映射器.toBytes(obj);
session.getRemote().sendBytesByFuture(数据);
//发送文本websocket消息(异步)
字符串text=mapper.toString(obj);
session.getRemote().sendStringByFuture(文本);
请注意,如果远程端点连接不再处于打开状态(例如远程端点向您发送消息,然后立即启动关闭握手控制消息),则session.getRemote()调用将引发WebSocketException

//如果没有远程设备,如何处理发送消息
试一试{
//向远程发送消息
session.getRemote().sendString(文本);
}捕获(WebSocketException e){
//WebSocket remote不可用。
//连接可能已关闭或正在关闭过程中。
}

注意:这种类型的websocket使用,其中您有一个会话和一个RemoteEndpoint,与即将推出的JSR-356标准(
javax.websocket
)一致。在标准API中,您将使用
javax.websocket.Session
javax.websocket.RemoteEndpoint

很抱歉,我没有真正理解您的意思。我的WebSocket和我的客户2之间的通信正常。当client1使用webservice时,问题就出现了。如何在我告诉“执行ping”(getPing)和接收之间同步。@brunettia-您的代码表示websockets调用的方法无效,但您的问题似乎涉及webservices调用。是哪一个?实际上都是。websocket服务器将接收数据,但采用void方法。那么,我如何才能将数据发送回webservices,并让它等待响应呢!对不起,我真的不明白你在说什么。我的WebSocket和我的客户2之间的通信正常。当client1使用webservice时,问题就出现了。如何在我告诉“执行ping”(getPing)和接收之间同步。@brunettia-您的代码表示websockets调用的方法无效,但您的问题似乎涉及webservices调用。是哪一个?实际上都是。websocket服务器将接收数据,但采用void方法。那么,我如何才能将数据发送回webservices,并让它等待响应呢!对不起,我想我不能用英语(我说法语)正确地解释我自己。你在这里解释的是对的,我用它。我的问题是:我的服务器既有websockets又有webservices。webservices允许我通过websockets访问客户机。在我的示例中,我希望获得远程设备的ping。所以我使用API/ws/ping/macAddr。在这里,我可以访问正确的会话并发送命令(ping)。我不能做的是得到答案,因为服务器上通过WebSocket接收数据的方法是void。这是正确的,WebSocket@onMessage调用的Jetty API的返回类型是
void
。这是因为Jetty内部WebSocket解析器最终会调用此消息,并且不希望返回类型。即将发布的Jetty 9.1将支持JSR-356(javax.websocket),并且它具有@OnMessage调用的返回类型的概念,但是请注意,这也是由websocket实现管理的,您不能在websockets之外连接到这个JSR-356返回类型。因此,我的问题是:)如果“onText”方法无效。
onText
是WebSocket实现要使用的方法。由于会话参数需要为