Java 如何通过WebSocket响应Web服务请求
我在服务器和客户端之间有一个WebSocket连接。这允许我向客户机发送命令,客户机用数据响应我。服务器也有web服务。然后我可以告诉你,“在那个客户机上执行这个命令”。因此,我们: Client1---webservices-->服务器---websockets-->Client2 问题是,从Client2接收数据的服务器上的方法是void 如何将数据发送回Client1 网络服务: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
@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实现要使用的方法。由于会话参数需要为