- 由于业务需要,在后台系统中需要添加消息推送功能,于是就去网上查阅相关资料,但是网上的资料都是前后端在一个项目中运行的,现在前后端分离,所以就自己折腾了一下,遇到了很多坑。
- 代码都是从网上的博客中拷贝过来的,首先是配置文件:
@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer, BaseLoggerService {
private Session session;
@Override
public void registerStompEndpoints(StompEndpointRegistry stompEndpointRegistry) {
stompEndpointRegistry.addEndpoint("/webSocketEndPoint").setAllowedOrigins("*").withSockJS();
}
@Override
public void configureMessageBroker(MessageBrokerRegistry registry) {
registry.enableSimpleBroker("/topic", "/user");
registry.setUserDestinationPrefix("/user");
registry.setApplicationDestinationPrefixes("/ws-push");
}
}
@Service
public class WebSocketMessageServiceImpl implements WebSocketMessageService {
@Autowired
private SimpMessagingTemplate simpMessagingTemplate;
public void sendMsg(WebSocketMessage msg) {
simpMessagingTemplate.convertAndSend("/topic/getResponse", msg);
}
private void send2Users(String users, final Object msg) {
simpMessagingTemplate.convertAndSendToUser(users, "/msg", msg);
}
@Override
public void sendAndFormatToUsers(Map param) {
String newUser = "webSocket";
send2Users(newUser, message);
logger.info(message);
}
}
<html>
<head>
<meta charset="UTF-8">
<title>Hello topic</title>
<script src="./sock.js"></script>
<script src="./stomp.js"></script>
<script src="./jquery.min.js"></script>
<script type="text/javascript">
var stompClient = null;
function setConnected(connected){
document.getElementById("connect").disabled = connected;
document.getElementById("disconnect").disabled = !connected;
$("#response").html();
}
function connect() {
console.log("111111111111");
var socket = new SockJS("http://localhost:7086/webSocketEndPoint");
stompClient = Stomp.over(socket);
stompClient.connect({}, function(frame) {
setConnected(true);
console.log('Connected: ' + frame);
stompClient.subscribe('/user/webSocket/msg', function(response){
var response1 = document.getElementById('response');
var p = document.createElement('p');
p.style.wordWrap = 'break-word';
p.appendChild(document.createTextNode(response.body));
response1.appendChild(p);
});
});
}
function disconnect() {
if (stompClient != null) {
stompClient.disconnect();
}
setConnected(false);
console.log("Disconnected");
}
function sendName() {
var name = document.getElementById('name').value;
console.info(1111111111);
stompClient.send("/subscribe", {}, JSON.stringify({ 'name': name }));
}
</script>
</head>
<body onload="disconnect()">
<noscript><h2 style="color: #ff0000">Seems your browser doesn't support Javascript! Websocket relies on Javascript being enabled. Please enable
Javascript and reload this page!</h2></noscript>
<div>
<div>
<button id="connect" onclick="connect();">Connect</button>
<button id="disconnect" disabled="disabled" onclick="disconnect();">Disconnect</button>
</div>
<div id="conversationDiv">
<labal>名字</labal><input type="text" id="name" />
<button id="sendName" onclick="sendName();">Send</button>
<p id="response"></p>
</div>
</div>
</body>
</html>
- 代码都已经准备好了,然后启动Springboot项目,再使用Nginx打开Html页面,我之前没有使用Nginx打开Html访问时,前端会报错,内容如下:
- 发送消息时,自己写个测试类,调用sendAndFormatToUsers方法即可。
- 之后我想测试websocket的最大连接数,就去网上找了一段java连接websocket的代码:
@ClientEndpoint
public class WebSocketTest {
private String deviceId;
private Session session;
public WebSocketTest () {
}
public WebSocketTest (String deviceId) {
this.deviceId = deviceId;
}
protected boolean start() {
WebSocketContainer container = ContainerProvider.getWebSocketContainer();
String uri = "ws://localhost:7086/webSocketEndPoint";
System.out.println("Connecting to " + uri);
try {
session = container.connectToServer(WebSocketTest.class, URI.create(uri));
System.out.println("count: " + deviceId);
} catch (Exception e) {
e.printStackTrace();
return false;
}
return true;
}
public static void main(String[] args) {
for (int i = 1; i< 50000; i++) {
WebSocketTest wSocketTest = new WebSocketTest(String.valueOf(i));
if (!wSocketTest.start()) {
System.out.println("测试结束!");
break;
}
}
}
}
- 经过测试,目前项目能支持的最大websocket连接数为10000,完全足够项目使用了,但是通过查阅资料知道,可以通过配置tomcat最大连接数来提高连接数,当将最大连接数配置为20000时可以将连接数提高到16000左右。