用java WebSocket做一個聊天室。本站提示廣大學習愛好者:(用java WebSocket做一個聊天室)文章只能為提供參考,不一定能成為您想要的結果。以下是用java WebSocket做一個聊天室正文
比來一個項目中,須要用到Java的websocket新特征,因而就學了一下,感到這技巧還挺好玩的,剎時曉得網頁下面的那些在線客服是怎樣做的了。
先看圖:
完成了多客戶機停止及時通信。
上面看代碼項目構造圖:很簡略,就1個類,1個頁面
然後看詳細代碼
先看後端代碼
package com.main;
import java.io.IOException;
import java.util.concurrent.CopyOnWriteArraySet;
import javax.websocket.*;
import javax.websocket.server.ServerEndpoint;
/**
* @ServerEndpoint 注解是一個類條理的注解,它的功效重要是將今朝的類界說成一個websocket辦事器端,
* 注解的值將被用於監聽用戶銜接的終端拜訪URL地址,客戶端可以經由過程這個URL來銜接到WebSocket辦事器端
*/
@ServerEndpoint("/websocket")
public class H5ServletServerSocket {
// 靜態變量,用來記載以後在線銜接數。應當把它設計成線程平安的。
private static int onlineCount = 0;
// concurrent包的線程平安Set,用來寄存每一個客戶端對應的MyWebSocket對象。若要完成辦事端與單一客戶端通訊的話,可使用Map來寄存,個中Key可認為用戶標識
private static CopyOnWriteArraySet<H5ServletServerSocket> webSocketSet = new CopyOnWriteArraySet<H5ServletServerSocket>();
// 與某個客戶真個銜接會話,須要經由過程它來給客戶端發送數據
private Session session;
/**
* 銜接樹立勝利挪用的辦法
*
* @param session
* 可選的參數。session為與某個客戶真個銜接會話,須要經由過程它來給客戶端發送數據
*/
@OnOpen
public void onOpen(Session session) {
this.session = session;
webSocketSet.add(this); // 參加set中
addOnlineCount(); // 在線數加1
System.out.println("有新銜接參加!以後在耳目數為" + getOnlineCount());
}
/**
* 銜接封閉挪用的辦法
*/
@OnClose
public void onClose() {
webSocketSet.remove(this); // 從set中刪除
subOnlineCount(); // 在線數減1
System.out.println("有連續接封閉!以後在耳目數為" + getOnlineCount());
}
/**
* 收到客戶端新聞後挪用的辦法
*
* @param message
* 客戶端發送過去的新聞
* @param session
* 可選的參數
*/
@OnMessage
public void onMessage(String message, Session session) {
System.out.println("來自客戶真個新聞:" + message);
// 群發新聞
for (H5ServletServerSocket item : webSocketSet) {
try {
item.sendMessage(message);
} catch (IOException e) {
e.printStackTrace();
continue;
}
}
}
/**
* 產生毛病時挪用
*
* @param session
* @param error
*/
@OnError
public void onError(Session session, Throwable error) {
System.out.println("產生毛病");
error.printStackTrace();
}
/**
* 這個辦法與下面幾個辦法紛歧樣。沒有效注解,是依據本身須要添加的辦法。
*
* @param message
* @throws IOException
*/
public void sendMessage(String message) throws IOException {
this.session.getBasicRemote().sendText(message);
// this.session.getAsyncRemote().sendText(message);
}
public static synchronized int getOnlineCount() {
return onlineCount;
}
public static synchronized void addOnlineCount() {
H5ServletServerSocket.onlineCount++;
}
public static synchronized void subOnlineCount() {
H5ServletServerSocket.onlineCount--;
}
}
接上去是前端頁面代碼:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort()
+ path + "/";
%>
<!DOCTYPE HTML>
<html>
<head>
<base href="<%=basePath%>">
<title>My WebSocket</title>
</head>
<body>
迎接進入聊天室
<div id="message" >【狀況】</div>
<br /> 昵稱
<input id="username" type="text" required="required"/>
<br> 內容
<input id="text" type="text" />
<br />
<button onclick="send()">發送</button>
<button onclick="closeWebSocket()">封閉</button>
</body>
<script type="text/javascript">
var websocket = null;
//斷定以後閱讀器能否支撐WebSocket
if ('WebSocket' in window) {
websocket = new WebSocket("ws://10.1.1.106:8080/Socket/websocket");
} else {
alert('不支撐WebSocket!')
}
//銜接產生毛病的回調辦法
websocket.onerror = function() {
setMessageInnerHTML("error");
};
//銜接勝利樹立的回調辦法
websocket.onopen = function(event) {
setMessageInnerHTML("聊天室開啟");
}
//吸收到新聞的回調辦法
websocket.onmessage = function() {
setMessageInnerHTML(event.data);
}
//銜接封閉的回調辦法
websocket.onclose = function() {
setMessageInnerHTML("聊天室封閉");
}
//監聽窗口封閉事宜,當窗口封閉時,自動去封閉websocket銜接,避免銜接還沒斷開就封閉窗口,server端會拋異常。
window.onbeforeunload = function() {
websocket.close();
}
//將新聞顯示在網頁上
function setMessageInnerHTML(innerHTML) {
document.getElementById('message').innerHTML += innerHTML + '<br/>';
}
//封閉銜接
function closeWebSocket() {
websocket.close();
}
//發送新聞
function send() {
var username = document.getElementById('username').value;
var message = document.getElementById('text').value;
var msg = "【" + username + "】談話:" + message
websocket.send(msg);
}
</script>
</html>
以上就是本文的全體內容,願望對年夜家的進修有所贊助,也願望年夜家多多支撐。