程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> 用java WebSocket做一個聊天室

用java WebSocket做一個聊天室

編輯:關於JAVA

用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>

以上就是本文的全體內容,願望對年夜家的進修有所贊助,也願望年夜家多多支撐。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved