SpringBoot+Websocket實現(xiàn)一個簡單的網(wǎng)頁聊天功能代碼
最近做了一個SpringBoot的項目,被SpringBoot那簡介的配置所迷住。剛好項目中,用到了websocket。于是,我就想著,做一個SpringBoot+websocket簡單的網(wǎng)頁聊天Demo。
效果展示:

當然,項目很簡單,沒什么代碼,一眼就能明白
導入websocket的包。
通過使用SpringBoot導入包的時候,我們可以發(fā)現(xiàn),很多包都是以 spring-boot-starter 開頭的,對于我這種強迫癥 ,簡直是福音
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-websocket</artifactId> </dependency>
配置websocket
服務端
首先新建一個WebSocketConfig的類,添加 @Component 注解 注入一個bean
@Component
public class WebSocketConfig {
@Bean
public ServerEndpointExporter serverEndpointExporter() {
return new ServerEndpointExporter();
}
}
新建一個service,本來覺得是新建一個控制器,但是我覺得這也不是控制器,但是也不太是service。最后還是選擇新建一個servece。這里你如果有更好的想法可以按照你的來。
這個service里面有4個方法,這些方法很簡單,通過名稱就可以看出是什么意思。
@Component
@ServerEndpoint("/webSocket")
@Slf4j
public class WebSocket {
private Session session;
private static CopyOnWriteArraySet<WebSocket> webSockets = new CopyOnWriteArraySet<>();
private MessageVO messageVO = new MessageVO();
@OnOpen
public void onOpen(Session session) {
this.session = session;
webSockets.add(this);
messageVO.setType(1);
messageVO.setUserNum(webSockets.size());
messageVO.setMessage("有新的連接");
ObjectMapper mapper = new ObjectMapper();
String Json = "";
try {
Json = mapper.writeValueAsString(messageVO);
} catch (Exception ex) {
log.error(ex.getMessage());
}
this.sendMessage(Json);
log.info("【websocket消息】有新的連接, 總數(shù):{}", webSockets.size());
}
@OnClose
public void onClose() {
webSockets.remove(this);
messageVO.setType(2);
messageVO.setUserNum(webSockets.size());
messageVO.setMessage("有用戶離開");
ObjectMapper mapper = new ObjectMapper();
String Json = "";
try {
Json = mapper.writeValueAsString(messageVO);
} catch (Exception ex) {
log.error(ex.getMessage());
}
this.sendMessage(Json);
log.info("【websocket消息】連接斷開, 總數(shù):{}", webSockets.size());
}
@OnMessage
public void onMessage(String message) {
messageVO.setType(3);
messageVO.setUserNum(webSockets.size());
messageVO.setMessage(message);
ObjectMapper mapper = new ObjectMapper();
String Json = "";
try {
Json = mapper.writeValueAsString(messageVO);
} catch (Exception ex) {
log.error(ex.getMessage());
}
this.sendMessage(Json);
log.info("【websocket消息】收到客戶端發(fā)來的消息:{}", message);
}
public void sendMessage(String message) {
for (WebSocket webSocket : webSockets) {
log.info("【websocket消息】廣播消息, message={}", message);
try {
webSocket.session.getBasicRemote().sendText(message);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
客戶端
客戶端也就是我們的html,我用的是原生html5的websocket ,不需要其他的js。直接在html中寫js就可以
<script type="application/javascript">
var websocket = null;
var cahtNum = $('.chat-num').text();
if ('WebSocket' in window) {
websocket = new WebSocket('ws://localhost:8080/chat/webSocket');
} else {
alert('該瀏覽器不支持websocket');
}
websocket.onopen = function (event) {
console.log('websocket建立連接');
}
websocket.onclose = function (event) {
console.log('websocket關閉連接');
}
websocket.onmessage = function (event) {
console.log('websocket收到消息' + event.data);
var result = $.parseJSON(event.data);
if (result.type == 3) {
var element = document.getElementById('message-template').innerHTML;
$('.message-container').append(element);
$(".message-content:last").html(result.message);
}
else {
$('.chat-num').text(result.userNum);
}
}
websocket.onerror = function (event) {
console.log('websocket通信發(fā)生錯誤');
}
window.onbeforeunload = function (event) {
websocket.close();
}
$('.send-message').click(function () {
var message = $('.chat-message').val();
if (message == "") {
mdui.alert('請輸入要發(fā)送的消息');
return;
}
sendmessage(message);
$('.chat-message').val("");
})
function sendmessage(message) {
websocket.send(message);
}
</script>
這個就是全都的功能,非常簡單,沒什么特別的功能和代碼。
最后附上Github的源代碼傳送門
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
Mybatis如何使用正則模糊匹配多個數(shù)據(jù)
這篇文章主要介紹了Mybatis如何使用正則模糊匹配多個數(shù)據(jù),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-01-01
SpringMvc3+extjs4實現(xiàn)上傳與下載功能
這篇文章主要為大家詳細介紹了SpringMvc3+extjs4實現(xiàn)上傳與下載功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-06-06
java Spring 5 新特性函數(shù)式Web框架詳細介紹
正如昨天Juergen博客中所提到的,Spring 5.0的第二個里程碑是引入了一個新的函數(shù)式web框架。在這篇文章中,我們將給出關于這個框架的更多信息,,需要的朋友可以參考下2016-12-12

