东莞网站建设规范,河南省招生网站服务平台,班级优化大师app下载,开家给别人做网站公司cometd聊天就像吃一块蛋糕或喝一杯热咖啡一样容易。 您是否曾经考虑过自己开发聊天程序#xff1f; 您知道#xff0c;聊天不容易。 但是#xff0c;如果您是开发人员#xff0c;并且阅读了本文的最后部分#xff0c;则可以尝试自行开发一个聊天应用程序#xff0c;并允许… cometd 聊天就像吃一块蛋糕或喝一杯热咖啡一样容易。 您是否曾经考虑过自己开发聊天程序 您知道聊天不容易。 但是如果您是开发人员并且阅读了本文的最后部分则可以尝试自行开发一个聊天应用程序并允许您的用户通过您的Web应用程序进行聊天。我的网络应用程序。 就像每个人一样我开始在互联网上搜索。 我找到了IRC。 当我阅读并搜索有关IRC的更多信息时我了解到很难为IRC找到基于Web的客户端。 我想拥有更多可定制的Web客户端其工作方式类似于Facebook。 最后幸运的是我找到了CometD。 最后我能够使用CometD和在浏览器中打开的与Facebook完全相似的可自定义的聊天窗口来实现聊天应用程序。 这几乎适用于所有现代浏览器。 本文分步说明了如何从头开始实现聊天应用程序以及如何将聊天应用程序集成到您现有的Java基础Web应用程序。 请记住您的Web应用程序应该是基于Java的应用程序。 您需要从他们的官方网站下载cometD 。 它具有实现聊天应用程序所需的所有依赖关系除了两个Java脚本库。 我编写了两个Javascript库一个用于创建动态聊天窗口如Facebook另一个用于以通用方式处理CometD聊天功能。 如果您可以自行管理这些内容则无需使用这些Javascript库。 实际上CometD文档提供了很多详细信息。 但是我将通过使用这些拖曳库继续进行本教程。 无论如何我建议先使用这些拖曳库然后根据需要自定义它。 我希望与您共享该示例应用程序您可以将其部署在本地主机中并测试其工作方式。 1.添加所需的jar文件。 如果您使用maven来构建项目则将以下依赖项添加到pom.xml文件中 dependenciesdependencygroupIdorg.cometd.java/groupIdartifactIdbayeux-api/artifactIdversion2.5.0/version/dependencydependencygroupIdorg.cometd.java/groupIdartifactIdcometd-java-server/artifactIdversion2.5.0/version/dependencydependencygroupIdorg.cometd.java/groupIdartifactIdcometd-websocket-jetty/artifactIdversion2.5.0/versionexclusionsexclusiongroupIdorg.cometd.java/groupIdartifactIdcometd-java-client/artifactId/exclusion/exclusions/dependencydependencygroupIdorg.slf4j/groupIdartifactIdslf4j-simple/artifactIdversion1.6.6/version/dependencydependencygroupIdorg.cometd.java/groupIdartifactIdcometd-java-annotations/artifactIdversion2.5.0/version/dependency
/dependencies 如果您不使用maven来构建项目则只需将以下.jar文件从CometD下载包中复制到/ WEB-INF / lib文件夹中即可。 您可以从/cometd-demo/target/cometd-demo-2.5.0.war文件中找到这些.jar文件。 bayeux-api-2.5.0.jar cometd-java-annotations-2.5.0.jar cometd-java-common-2.5.0.jar cometd-java-server-2.5.0.jar cometd-websocket-jetty-2.5.0.jar javax.inject-1.jar jetty-continuation-7.6.7.v20120910.jar jetty-http-7.6.7.v20120910.jar jetty-io-7.6.7.v20120910.jar jetty-jmx-7.6.7.v20120910.jar jetty-util-7.6.7.v20120910.jar jetty-websocket-7.6.7.v20120910.jar jsr250-api-1.0.jar slf4j-api-1.6.6.jar slf4j-simple-1.6.6.jar 2.添加所需的Javascript文件。 您需要链接以下Javascript文件。 cometd.js AckExtension.js ReloadExtension.js jQuery的1.8.2.js jquery.cookie.js jquery.cometd.js jquery.cometd-reload.js chat.window.js comet.chat.js “ chat.window.js ”和“ comet.chat.js ”是我自己的两个Javascript库但不包含CometD发行版。 如果您完全遵循本教程则还必须链接这些拖曳库。 提供的示例应用程序具有以下两个Javascript库。 3.编写聊天服务类。 /*** author Semika siriwardana* CometD chat service.*/
package com.semika.cometd;import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;import javax.inject.Inject;import org.cometd.annotation.Configure;
import org.cometd.annotation.Listener;
import org.cometd.annotation.Service;
import org.cometd.annotation.Session;
import org.cometd.bayeux.client.ClientSessionChannel;
import org.cometd.bayeux.server.BayeuxServer;
import org.cometd.bayeux.server.ConfigurableServerChannel;
import org.cometd.bayeux.server.ServerMessage;
import org.cometd.bayeux.server.ServerSession;
import org.cometd.server.authorizer.GrantAuthorizer;
import org.cometd.server.filter.DataFilter;
import org.cometd.server.filter.DataFilterMessageListener;
import org.cometd.server.filter.JSONDataFilter;
import org.cometd.server.filter.NoMarkupFilter;Service(chat)
public class ChatService {private final ConcurrentMapString, MapString, String _members new ConcurrentHashMapString, MapString, String();Injectprivate BayeuxServer _bayeux;Sessionprivate ServerSession _session;Configure ({/chat/**,/members/**})protected void configureChatStarStar(ConfigurableServerChannel channel) {DataFilterMessageListener noMarkup new DataFilterMessageListener(new NoMarkupFilter(),new BadWordFilter());channel.addListener(noMarkup);channel.addAuthorizer(GrantAuthorizer.GRANT_ALL);}Configure (/service/members)protected void configureMembers(ConfigurableServerChannel channel) {channel.addAuthorizer(GrantAuthorizer.GRANT_PUBLISH);channel.setPersistent(true);}Listener(/service/members)public void handleMembership(ServerSession client, ServerMessage message) {MapString, Object data message.getDataAsMap();final String room ((String)data.get(room)).substring(/chat/.length());MapString, String roomMembers _members.get(room);if (roomMembers null) {MapString, String new_room new ConcurrentHashMapString, String();roomMembers _members.putIfAbsent(room, new_room);if (roomMembers null) roomMembers new_room;}final MapString, String members roomMembers;String userName (String)data.get(user);members.put(userName, client.getId());client.addListener(new ServerSession.RemoveListener() {public void removed(ServerSession session, boolean timeout) {members.values().remove(session.getId());broadcastMembers(room, members.keySet());}});broadcastMembers(room, members.keySet());}private void broadcastMembers(String room, SetString members) {// Broadcast the new members listClientSessionChannel channel _session.getLocalSession().getChannel(/members/room);channel.publish(members);}Configure (/service/privatechat)protected void configurePrivateChat(ConfigurableServerChannel channel) {DataFilterMessageListener noMarkup new DataFilterMessageListener(new NoMarkupFilter(),new BadWordFilter());channel.setPersistent(true);channel.addListener(noMarkup);channel.addAuthorizer(GrantAuthorizer.GRANT_PUBLISH);}Listener(/service/privatechat)protected void privateChat(ServerSession client, ServerMessage message) {MapString,Object data message.getDataAsMap();String room ((String)data.get(room)).substring(/chat/.length());MapString, String membersMap _members.get(room);if (membersMap null) {MapString,Stringnew_roomnew ConcurrentHashMapString, String();membersMap_members.putIfAbsent(room,new_room);if (membersMapnull)membersMapnew_room;}String peerName (String)data.get(peer);String peerId membersMap.get(peerName);if (peerId ! null) {ServerSession peer _bayeux.getSession(peerId);if (peer ! null) {MapString, Object chat new HashMapString, Object();String text (String)data.get(chat);chat.put(chat, text);chat.put(user, data.get(user));chat.put(scope, private);chat.put(peer, peerName);ServerMessage.Mutable forward _bayeux.newMessage();forward.setChannel(/chat/ room);forward.setId(message.getId());forward.setData(chat);if (text.lastIndexOf(lazy) 0) {forward.setLazy(true);}if (peer ! client) {peer.deliver(_session, forward);}client.deliver(_session, forward);}}}class BadWordFilter extends JSONDataFilter {Overrideprotected Object filterString(String string) {if (string.indexOf(dang) 0) {throw new DataFilter.Abort();}return string;}}
} 4.更改web.xml文件。 您应该将以下过滤器添加到web.xml文件中。 filterfilter-namecontinuation/filter-namefilter-classorg.eclipse.jetty.continuation.ContinuationFilter/filter-class
/filter
filter-mappingfilter-namecontinuation/filter-nameurl-pattern/cometd/*/url-pattern
/filter-mapping 还有以下servlet。 servletservlet-namecometd/servlet-nameservlet-classorg.cometd.annotation.AnnotationCometdServlet/servlet-classinit-paramparam-nametimeout/param-nameparam-value20000/param-value/init-paraminit-paramparam-nameinterval/param-nameparam-value0/param-value/init-paraminit-paramparam-namemaxInterval/param-nameparam-value10000/param-value/init-paraminit-paramparam-namemaxLazyTimeout/param-nameparam-value5000/param-value/init-paraminit-paramparam-namelong-polling.multiSessionInterval/param-nameparam-value2000/param-value/init-paraminit-paramparam-namelogLevel/param-nameparam-value0/param-value/init-paraminit-paramparam-nametransports/param-nameparam-valueorg.cometd.websocket.server.WebSocketTransport/param-value/init-paraminit-paramparam-nameservices/param-nameparam-valuecom.semika.cometd.ChatService/param-value/init-paramload-on-startup1/load-on-startup
/servlet
servlet-mappingservlet-namecometd/servlet-nameurl-pattern/cometd/*/url-pattern
/servlet-mapping 5.实现客户端功能。 我认为这部分应该是描述性的。 如果允许用户与其他用户聊天则需要在网页中显示在线用户列表就像Facebook在右侧栏中显示在线用户一样。 为此您可以在页面内放置一个简单的span或div标记。 我做了如下。 div idmembers/div 所有的在线用户将显示在上述容器中。 单击特定的用户名后它将打开一个类似于Facebook的新聊天窗口。 对于每对用户它将打开一个新的聊天窗口。 要获得这种行为您应该使用我之前提到的“ chat.window.js ”。 特定用户对之间的聊天将通过专用的聊天窗口继续进行。 在用户以通常的方式登录到您的Web应用程序之后我们应该为该用户订阅聊天频道。 您可以使用以下方式进行操作。 $(document).ready(function(){ $.cometChat.onLoad({memberListContainerID:members});
}); 请注意我已将在线用户列表容器的“ id”作为配置参数传递。 然后用户应按以下方式加入频道。您可以使用用户名调用波纹管方法。 function join(userName){$.cometChat.join(userName);
} 由于对于每个聊天都有一个像Facebook一样的专用聊天窗口因此我们应该维护全局Javascript数组来存储那些创建的聊天窗口对象。 您需要在页面内放置以下Javascript代码。 function getChatWindowByUserPair(loginUserName, peerUserName) {var chatWindow; for(var i 0; i chatWindowArray.length; i) {var windowInfo chatWindowArray[i];if (windowInfo.loginUserName loginUserName windowInfo.peerUserName peerUserName) {chatWindow windowInfo.windowObj;}}return chatWindow;
}function createWindow(loginUserName, peerUserName) { var chatWindow getChatWindowByUserPair(loginUserName, peerUserName);if (chatWindow null) { //Not chat window created before for this user pair.chatWindow new ChatWindow(); //Create new chat window.chatWindow.initWindow({loginUserName:loginUserName, peerUserName:peerUserName,windowArray:chatWindowArray});//collect all chat windows opended so far.var chatWindowInfo { peerUserName:peerUserName, loginUserName:loginUserName,windowObj:chatWindow };chatWindowArray.push(chatWindowInfo);}chatWindow.show(); return chatWindow;
} 如上所述声明以下全局Javascript变量。 var chatWindowArray [];
var config {contextPath: ${pageContext.request.contextPath}
}; 由于我使用的是JSP页面因此必须通过“ pageContext ”变量获取上下文路径。 如果您使用的是HTML页面请自行进行管理以声明“ config” Javascript全局变量。 现在您几乎到达了教程的最后一部分。 5.示例应用程序如何工作 您可以下载comet.war文件并将其部署在服务器中。 将浏览器指向以下URL。 http// localhost8080 / comet 这将带您进入一个包含文本字段和名为“ Join”的按钮的页面。 根据需要插入一些用户名然后单击“加入”按钮。 然后您将被转到另一个包含在线用户列表的页面。 您的姓名以红色突出显示。 要在本地计算机上聊天您可以打开另一个浏览器IE和FF并加入聊天频道。 对等用户在联机用户列表中以蓝色显示。 单击对等用户后它将打开一个新的聊天窗口以便您可以与他聊天。 此功能与Facebook聊天非常相似。 我已经在IEFF和Crome中测试了此聊天应用程序并且工作正常。 如果您需要将其与Java基本Web应用程序集成的任何帮助请给我发送邮件。 参考 适用于Java Web应用程序的Facebook类似聊天。 从我们的JCG合作伙伴 Semika loku kaluge在Code Box博客上获得。 翻译自: https://www.javacodegeeks.com/2012/10/cometd-facebook-similar-chat-for-your.htmlcometd