在这篇文章中,简单介绍了WebSocket的使用,客户端可以使用了JavaScript向服务发送请求,服务端也可以通过SimpMessagingTemplate 主动向客户端推送消息,实现服务器端与客户端的双向交互。
下面介绍客户端如何连接远程WebSocket Server并推送消息,参照gs-messaging-stomp-websocket中的TestCase,我们简单修改下代码
@Slf4j
public class StompClientTest {
public static void main(String[] args) throws Exception {
int port = 8898;
SockJsClient sockJsClient;
WebSocketStompClient stompClient;
final WebSocketHttpHeaders headers = new WebSocketHttpHeaders();
StompSession stompSession = null;
{
List<Transport> transports = new ArrayList<>();
transports.add(new WebSocketTransport(new StandardWebSocketClient()));
sockJsClient = new SockJsClient(transports);
stompClient = new WebSocketStompClient(sockJsClient);
stompClient.setMessageConverter(new MappingJackson2MessageConverter());
}
final CountDownLatch latch = new CountDownLatch(1);
final AtomicReference<Throwable> failure = new AtomicReference<>();
TestSessionHandler handler = new TestSessionHandler(failure) {
private StompSession stompSession;
@Override
public String getSomething() {
return "something in main";
}
@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 {
log.info("{}", greeting.getContent());
} catch (Throwable t) {
failure.set(t);
} finally {
session.disconnect();
latch.countDown();
}
}
});
try {
session.send("/app/hello", new HelloMessage("message forwarded from '/app/hello'"));
session.send("/topic/greetings", new Greeting("message directly from '/topic/greetings'"));
this.stompSession = session;
} catch (Throwable t) {
failure.set(t);
latch.countDown();
}
}
public StompSession getStompSession() {
return stompSession;
}
};
stompClient.connect("ws://localhost:{port}/gs-guide-websocket", headers, handler, port);
log.info("something is {}", handler.getSomething());
while (!stompClient.isRunning()) {
if ((stompSession = handler.getStompSession()) != null) {
break;
}
}
stompSession.send("/app/hello", new HelloMessage("message2 forwarded from '/app/hello'"));
stompSession.send("/topic/greetings", new Greeting("message2 directly from '/topic/greetings'"));
stompSession.send("/app/hello", new HelloMessage("message3 forwarded from '/app/hello'"));
stompSession.send("/topic/greetings", new Greeting("message3 directly from '/topic/greetings'"));
if (latch.await(30, TimeUnit.SECONDS)) {
if (failure.get() != null) {
throw new AssertionError("", failure.get());
}
} else {
fail("Greeting not received!");
}
}
}
代码修改部分
this.stompSession = session;
获取StompSession
while (!stompClient.isRunning()) {
if ((stompSession = handler.getStompSession()) != null) {
break;
}
}
WebSocket连接之后,我们将StompSession返回,之后便可以通过send方法向远程WebSocket Server发送消息。
"C:\Program Files\Java\jdk1.8.0_91\bin\java" "-javaagent:C:\Program Files\JetBrains\IntelliJ IDEA 2017.2.2\lib\idea_rt.jar=63920:C:\Program Files\JetBrains\IntelliJ IDEA 2017.2.2\bin" -Dfile.encoding=UTF-8 -classpath "C:\Program Files\Java\jdk1.8.0_91\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_91\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_91\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_91