Skip to content

Commit 8024a70

Browse files
author
Frank Oh
committed
added more files for websocket
1 parent c94f807 commit 8024a70

10 files changed

Lines changed: 262 additions & 1 deletion

File tree

spring-messaging-websocket/pom.xml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,11 @@
7272
<artifactId>spring-test</artifactId>
7373
<version>${org.springframework-version}</version>
7474
</dependency>
75+
<dependency>
76+
<groupId>com.google.code.gson</groupId>
77+
<artifactId>gson</artifactId>
78+
<version>2.8.5</version>
79+
</dependency>
7580
</dependencies>
7681

7782
<build>
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package com.advenoh.config;
2+
3+
import org.springframework.context.annotation.Configuration;
4+
import org.springframework.messaging.simp.config.MessageBrokerRegistry;
5+
import org.springframework.web.socket.config.annotation.AbstractWebSocketMessageBrokerConfigurer;
6+
import org.springframework.web.socket.config.annotation.EnableWebSocketMessageBroker;
7+
import org.springframework.web.socket.config.annotation.StompEndpointRegistry;
8+
9+
@Configuration
10+
@EnableWebSocketMessageBroker
11+
public class WebSocketChatConfig extends AbstractWebSocketMessageBrokerConfigurer {
12+
13+
@Override
14+
public void configureMessageBroker(final MessageBrokerRegistry config) {
15+
config.enableSimpleBroker("/topic");
16+
config.setApplicationDestinationPrefixes("/app");
17+
}
18+
19+
@Override
20+
public void registerStompEndpoints(final StompEndpointRegistry registry) {
21+
registry.addEndpoint("/chat");
22+
registry.addEndpoint("/chat").withSockJS();
23+
}
24+
25+
}
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
package com.advenoh.config;
2+
3+
import org.springframework.context.annotation.Configuration;
4+
import org.springframework.http.server.ServerHttpRequest;
5+
import org.springframework.http.server.ServerHttpResponse;
6+
import org.springframework.http.server.ServletServerHttpRequest;
7+
import org.springframework.messaging.simp.config.MessageBrokerRegistry;
8+
import org.springframework.web.socket.WebSocketHandler;
9+
import org.springframework.web.socket.config.annotation.AbstractWebSocketMessageBrokerConfigurer;
10+
import org.springframework.web.socket.config.annotation.EnableWebSocketMessageBroker;
11+
import org.springframework.web.socket.config.annotation.StompEndpointRegistry;
12+
import org.springframework.web.socket.server.support.DefaultHandshakeHandler;
13+
14+
import javax.servlet.http.HttpSession;
15+
import java.util.Map;
16+
17+
@Configuration
18+
@EnableWebSocketMessageBroker
19+
public class WebSocketSendToUserConfig extends AbstractWebSocketMessageBrokerConfigurer {
20+
21+
@Override
22+
public void configureMessageBroker(MessageBrokerRegistry config) {
23+
config.enableSimpleBroker("/topic/", "/queue/");
24+
config.setApplicationDestinationPrefixes("/app");
25+
}
26+
27+
@Override
28+
public void registerStompEndpoints(StompEndpointRegistry registry) {
29+
registry.addEndpoint("/greeting").setHandshakeHandler(new DefaultHandshakeHandler() {
30+
31+
//Get sessionId from request and set it in Map attributes
32+
public boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler,
33+
Map attributes) throws Exception {
34+
if (request instanceof ServletServerHttpRequest) {
35+
ServletServerHttpRequest servletRequest = (ServletServerHttpRequest) request;
36+
HttpSession session = servletRequest.getServletRequest().getSession();
37+
attributes.put("sessionId", session.getId());
38+
}
39+
return true;
40+
}
41+
}).withSockJS();
42+
}
43+
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package com.advenoh.controller;
2+
3+
import com.advenoh.model.Message;
4+
import com.advenoh.model.OutputMessage;
5+
import org.springframework.messaging.handler.annotation.MessageMapping;
6+
import org.springframework.messaging.handler.annotation.SendTo;
7+
import org.springframework.stereotype.Controller;
8+
9+
import java.text.SimpleDateFormat;
10+
import java.util.Date;
11+
12+
@Controller
13+
public class ChatController {
14+
15+
@MessageMapping("/chat")
16+
@SendTo("/topic/messages")
17+
public OutputMessage send(final Message message) throws Exception {
18+
19+
final String time = new SimpleDateFormat("HH:mm").format(new Date());
20+
return new OutputMessage(message.getFrom(), message.getText(), time);
21+
}
22+
23+
}
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
package com.advenoh.controller;
2+
3+
import com.google.gson.Gson;
4+
import org.springframework.messaging.handler.annotation.MessageExceptionHandler;
5+
import org.springframework.messaging.handler.annotation.MessageMapping;
6+
import org.springframework.messaging.handler.annotation.Payload;
7+
import org.springframework.messaging.simp.annotation.SendToUser;
8+
import org.springframework.stereotype.Controller;
9+
10+
import java.security.Principal;
11+
import java.util.Map;
12+
13+
@Controller
14+
public class WebsocketSendToUserController {
15+
16+
private Gson gson = new Gson();
17+
18+
@MessageMapping("/message")
19+
@SendToUser("/queue/reply")
20+
public String processMessageFromClient(@Payload String message, Principal principal) throws Exception {
21+
return gson.fromJson(message, Map.class).get("name").toString();
22+
}
23+
24+
@MessageExceptionHandler
25+
@SendToUser("/queue/errors")
26+
public String handleException(Throwable exception) {
27+
return exception.getMessage();
28+
}
29+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package com.advenoh.model;
2+
3+
import lombok.Data;
4+
5+
@Data
6+
public class Message {
7+
8+
private String from;
9+
private String text;
10+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package com.advenoh.model;
2+
3+
import lombok.AllArgsConstructor;
4+
import lombok.Data;
5+
6+
@Data
7+
@AllArgsConstructor
8+
public class OutputMessage {
9+
10+
private String from;
11+
private String text;
12+
private String time;
13+
14+
}
Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
<html>
2+
<head>
3+
<title>Chat WebSocket</title>
4+
5+
<script src="//cdnjs.cloudflare.com/ajax/libs/sockjs-client/1.3.0/sockjs.min.js"></script>
6+
<script src="//cdnjs.cloudflare.com/ajax/libs/stomp.js/2.3.3/stomp.min.js"></script>
7+
8+
<script type="text/javascript">
9+
10+
var stompClient = null;
11+
12+
function setConnected(connected) {
13+
14+
document.getElementById('connect').disabled = connected;
15+
document.getElementById('disconnect').disabled = !connected;
16+
document.getElementById('conversationDiv').style.visibility = connected ? 'visible' : 'hidden';
17+
document.getElementById('response').innerHTML = '';
18+
}
19+
20+
function connect() {
21+
22+
var socket = new SockJS('/chat');
23+
stompClient = Stomp.over(socket);
24+
25+
stompClient.connect({}, function(frame) {
26+
27+
setConnected(true);
28+
console.log('Connected: ' + frame);
29+
stompClient.subscribe('/topic/messages', function(messageOutput) {
30+
31+
showMessageOutput(JSON.parse(messageOutput.body));
32+
});
33+
});
34+
}
35+
36+
function disconnect() {
37+
38+
if(stompClient != null) {
39+
stompClient.disconnect();
40+
}
41+
42+
setConnected(false);
43+
console.log("Disconnected");
44+
}
45+
46+
function sendMessage() {
47+
48+
var from = document.getElementById('from').value;
49+
var text = document.getElementById('text').value;
50+
stompClient.send("/app/chat", {}, JSON.stringify({'from':from, 'text':text}));
51+
}
52+
53+
function showMessageOutput(messageOutput) {
54+
55+
var response = document.getElementById('response');
56+
var p = document.createElement('p');
57+
p.style.wordWrap = 'break-word';
58+
p.appendChild(document.createTextNode(messageOutput.from + ": " + messageOutput.text + " (" + messageOutput.time + ")"));
59+
response.appendChild(p);
60+
}
61+
62+
</script>
63+
64+
</head>
65+
66+
<body onload="disconnect()">
67+
68+
<div>
69+
70+
71+
<div>
72+
<input type="text" id="from" placeholder="Choose a nickname"/>
73+
</div>
74+
<br />
75+
<div>
76+
<button id="connect" onclick="connect();">Connect</button>
77+
<button id="disconnect" disabled="disabled" onclick="disconnect();">Disconnect</button>
78+
</div>
79+
<br />
80+
<div id="conversationDiv">
81+
<input type="text" id="text" placeholder="Write a message..."/>
82+
<button id="sendMessage" onclick="sendMessage();">Send</button>
83+
<p id="response"></p>
84+
</div>
85+
</div>
86+
87+
</body>
88+
</html>

spring-messaging-websocket/src/main/webapp/resources/index.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
<head>
44
<title>Hello WebSocket</title>
55
<link href="//cdnjs.cloudflare.com/ajax/libs/bootswatch/4.3.1/cerulean/bootstrap.min.css" rel="stylesheet">
6-
<link href="/resources/main.csss/main.css" rel="stylesheet">
6+
<link href="/resources/main.css" rel="stylesheet">
77

88
<script src="//code.jquery.com/jquery-3.2.1.min.js"></script>
99
<script src="//cdnjs.cloudflare.com/ajax/libs/sockjs-client/1.3.0/sockjs.min.js"></script>
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
function connect() {
2+
var socket = new WebSocket('ws://localhost:8080/greeting');
3+
ws = Stomp.over(socket);
4+
5+
ws.connect({}, function(frame) {
6+
ws.subscribe("/user/queue/errors", function(message) {
7+
alert("Error " + message.body);
8+
});
9+
10+
ws.subscribe("/user/queue/reply", function(message) {
11+
alert("Message " + message.body);
12+
});
13+
}, function(error) {
14+
alert("STOMP error " + error);
15+
});
16+
}
17+
18+
function disconnect() {
19+
if (ws != null) {
20+
ws.close();
21+
}
22+
setConnected(false);
23+
console.log("Disconnected");
24+
}

0 commit comments

Comments
 (0)