首页 > 编程 > Java > 正文

java WebSocket实现聊天消息推送功能

2019-11-26 09:51:19
字体:
来源:转载
供稿:网友

本文实例为大家分享了java WebSocket实现聊天消息推送功能的具体代码,供大家参考,具体内容如下

环境:

JDK.1.7.0_51

apache-tomcat-7.0.53

java jar包:tomcat-coyote.jar、tomcat-juli.jar、websocket-api.jar

ChatAnnotation消息发送类:

import java.io.IOException;import java.util.HashMap;import java.util.Map;import java.util.concurrent.atomic.AtomicInteger; import javax.websocket.OnClose;import javax.websocket.OnError;import javax.websocket.OnMessage;import javax.websocket.OnOpen;import javax.websocket.Session;import javax.websocket.server.ServerEndpoint; import org.apache.juli.logging.Log;import org.apache.juli.logging.LogFactory; import com.util.HTMLFilter;  /** * WebSocket 消息推送服务类 * @author 胡汉三 * * 2014-11-18 下午7:53:13 */@ServerEndpoint(value = "/websocket/chat")public class ChatAnnotation {   private static final Log log = LogFactory.getLog(ChatAnnotation.class);   private static final String GUEST_PREFIX = "Guest";  private static final AtomicInteger connectionIds = new AtomicInteger(0);  private static final Map<String,Object> connections = new HashMap<String,Object>();   private final String nickname;  private Session session;   public ChatAnnotation() {    nickname = GUEST_PREFIX + connectionIds.getAndIncrement();  }    @OnOpen  public void start(Session session) {    this.session = session;    connections.put(nickname, this);     String message = String.format("* %s %s", nickname, "has joined.");    broadcast(message);  }    @OnClose  public void end() {    connections.remove(this);    String message = String.format("* %s %s",        nickname, "has disconnected.");    broadcast(message);  }    /**   * 消息发送触发方法   * @param message   */  @OnMessage  public void incoming(String message) {    // Never trust the client    String filteredMessage = String.format("%s: %s",        nickname, HTMLFilter.filter(message.toString()));    broadcast(filteredMessage);  }   @OnError  public void onError(Throwable t) throws Throwable {    log.error("Chat Error: " + t.toString(), t);  }   /**   * 消息发送方法   * @param msg   */  private static void broadcast(String msg) {   if(msg.indexOf("Guest0")!=-1){   sendUser(msg);   } else{   sendAll(msg);   }  }     /**   * 向所有用户发送   * @param msg   */  public static void sendAll(String msg){   for (String key : connections.keySet()) {     ChatAnnotation client = null ;      try {       client = (ChatAnnotation) connections.get(key);        synchronized (client) {          client.session.getBasicRemote().sendText(msg);        }      } catch (IOException e) {         log.debug("Chat Error: Failed to send message to client", e);        connections.remove(client);        try {          client.session.close();        } catch (IOException e1) {          // Ignore        }        String message = String.format("* %s %s",            client.nickname, "has been disconnected.");        broadcast(message);      }    }  }    /**   * 向指定用户发送消息    * @param msg   */  public static void sendUser(String msg){   ChatAnnotation c = (ChatAnnotation)connections.get("Guest0"); try {  c.session.getBasicRemote().sendText(msg); } catch (IOException e) {  log.debug("Chat Error: Failed to send message to client", e);      connections.remove(c);      try {        c.session.close();      } catch (IOException e1) {        // Ignore      }      String message = String.format("* %s %s",          c.nickname, "has been disconnected.");      broadcast(message);  }   }}

HTMLFilter工具类:

/** * HTML 工具类  * * @author 胡汉三 */public final class HTMLFilter {  public static String filter(String message) {    if (message == null)      return (null);    char content[] = new char[message.length()];    message.getChars(0, message.length(), content, 0);    StringBuilder result = new StringBuilder(content.length + 50);    for (int i = 0; i < content.length; i++) {      switch (content[i]) {      case '<':        result.append("<");        break;      case '>':        result.append(">");        break;      case '&':        result.append("&");        break;      case '"':        result.append(""");        break;      default:        result.append(content[i]);      }    }    return (result.toString());  }}

页面:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%><%String path = request.getContextPath();String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";%> <?xml version="1.0" encoding="UTF-8"?><html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"><head>  <title>测试</title>  <style type="text/css">    input#chat {      width: 410px    }     #console-container {      width: 400px;    }     #console {      border: 1px solid #CCCCCC;      border-right-color: #999999;      border-bottom-color: #999999;      height: 170px;      overflow-y: scroll;      padding: 5px;      width: 100%;    }     #console p {      padding: 0;      margin: 0;    } </style>  <script type="text/javascript">     var Chat = {};     Chat.socket = null;     Chat.connect = (function(host) {      if ('WebSocket' in window) {        Chat.socket = new WebSocket(host);      } else if ('MozWebSocket' in window) {        Chat.socket = new MozWebSocket(host);      } else {        Console.log('Error: WebSocket is not supported by this browser.');        return;      }       Chat.socket.onopen = function () {        Console.log('Info: WebSocket connection opened.');        document.getElementById('chat').onkeydown = function(event) {          if (event.keyCode == 13) {            Chat.sendMessage();          }        };      };       Chat.socket.onclose = function () {        document.getElementById('chat').onkeydown = null;        Console.log('Info: WebSocket closed.');      };       Chat.socket.onmessage = function (message) {        Console.log(message.data);      };    });     Chat.initialize = function() {      if (window.location.protocol == 'http:') {        Chat.connect('ws://' + window.location.host + '/socket2/websocket/chat');      } else {        Chat.connect('wss://' + window.location.host + '/socket2/websocket/chat');      }    };     Chat.sendMessage = (function() {      var message = document.getElementById('chat').value;      if (message != '') {        Chat.socket.send(message);        document.getElementById('chat').value = '';      }    });     var Console = {};     Console.log = (function(message) {      var console = document.getElementById('console');      var p = document.createElement('p');      p.style.wordWrap = 'break-word';      p.innerHTML = message;      console.appendChild(p);      while (console.childNodes.length > 25) {         console.removeChild(console.firstChild);      }      console.scrollTop = console.scrollHeight;    });     Chat.initialize();      document.addEventListener("DOMContentLoaded", function() {      // Remove elements with "noscript" class - <noscript> is not allowed in XHTML      var noscripts = document.getElementsByClassName("noscript");      for (var i = 0; i < noscripts.length; i++) {        noscripts[i].parentNode.removeChild(noscripts[i]);      }    }, false);   </script></head><body><div class="noscript"><h2 style="color: #ff0000">Seems your browser doesn't support Javascript! Websockets rely on Javascript being enabled. Please enable  Javascript and reload this page!</h2></div><div>  <p>    <input type="text" placeholder="请输入内容" id="chat" />  </p>  <div id="console-container">    <div id="console"/>  </div></div></body></html>

可指定发送给某个用户,也可全部发送,详情见ChatAnnotation类的broadcast方法。
程序发布时记得删除tomcat-coyote.jar、tomcat-juli.jar、websocket-api.jar这三个jar包在启动Tomcat。

程序截图,Guest0用户发送信息的信息,在后台进行了判断只发送给自己:

Guest1:

Guest2:

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持武林网。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表