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

网友投稿 204 2023-07-26

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

本文实例为大家分享了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 Ahttp://tomicInteger(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 < contehttp://nt.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 basePahttp://th = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";

%>

Javascript and reload this page!

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

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

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

Guest1:

Guest2:

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:vue中element 上传功能的实现思路
下一篇:微信小程序使用wxParse解析html的方法教程
相关文章

 发表评论

暂时没有评论,来抢沙发吧~