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

该博客介绍了如何使用Java WebSocket实现聊天消息的推送功能,包括环境配置、ChatAnnotation类的详细代码解析,以及HTMLFilter工具类的作用。通过示例展示了如何向所有用户或特定用户发送消息,并提醒在部署时注意删除特定的jar包。
摘要由CSDN通过智能技术生成

本文实例为大家分享了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 connections = new HashMap();

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());

}

}

页面:

String path = request.getContextPath();

String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";

%>

测试

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;

}

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 -

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);

Seems your browser doesn't support Javascript! Websockets rely on Javascript being enabled. Please enable

Javascript and reload this page!

可指定发送给某个用户,也可全部发送,详情见ChatAnnotation类的broadcast方法。

程序发布时记得删除tomcat-coyote.jar、tomcat-juli.jar、websocket-api.jar这三个jar包在启动Tomcat。

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

91f4cdc4661f67b07fe8b527b8e4f6fb.png

Guest1:

6c98b39fec7561a984c864c7648456af.png

Guest2:

6d2821deb17371df824c7bdbad808469.png

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值