jetty是一个轻量级的可嵌入的web服务器,他对websocket的支持也是非常好的,下面就介绍如何通过jetty服务器的websocket实现聊天室功能:
一、后台实现
后台使用的springMVC,具体的搭建可以看
http://dwj147258.iteye.com/blog/2328962,在这里web.xml文件中需要加入servlet
<servlet> <servlet-name>websocket</servlet-name> <servlet-class>main.java.test.websocket.WebSocketInitServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>websocket</servlet-name> <url-pattern>/websocket.ws</url-pattern> </servlet-mapping> <servlet>
来拦截来自前端的websocket请求,这里的servlet类WebSocketInitServlet代码实现如下,
package main.java.test.websocket; import javax.servlet.http.HttpServletRequest; import org.eclipse.jetty.websocket.WebSocketServlet; public class WebSocketInitServlet extends WebSocketServlet { private static final long serialVersionUID = -7302427588920888589L; /** * websocket建立连接 */ @Override public WebSocket doWebSocketConnect(HttpServletRequest request, String arg1) { return new WebSocket(); } }
覆盖了一个dowebsocketconnect方法,返回的webSocket对象则是具体的websocket业务处理了,代码实现如下
package main.java.test.websocket; import java.util.List; import net.sf.json.JSONObject; import org.eclipse.jetty.websocket.WebSocket.OnTextMessage; import com.sun.istack.internal.logging.Logger; public class WebSocket implements OnTextMessage { private static final Logger log = Logger.getLogger(WebSocket.class); /** * websocket连接 */ private Connection conn = null; private String key ; /** * websocket关闭事件触发 */ @Override public void onClose(int arg0, String arg1) { log.info("onClose begin. arg0:"+arg0+" arg1:"+arg1+" conn:"+conn); WebSocketManager.getInstance().removeWebSocket(key); log.info("onClose end. arg0:"+arg0+" arg1:"+arg1+" conn:"+conn); } /** * websocket连接建立触发 */ @Override public void onOpen(Connection conn) { // 如果客户端在这个MaxIdleTime中都没有活动,则它会自动结束 log.info("WebSocket onOpen. conn:"+conn.toString()+""+ conn.getMaxIdleTime()+" class:"+conn.getClass()); conn.setMaxIdleTime(Integer.MAX_VALUE); String toStr = conn.toString(); String name = toStr.substring(toStr.indexOf("(")+1, toStr.indexOf(")")); this.key = name ; this.conn = conn; WebSocketManager.getInstance().addWebSocket(this); System.out.println("服务端websocket连接建立"+conn.getProtocol()+" "+conn.toString()); } /** * websocket收到消息触发 */ @Override public void onMessage(String data) { /*log.info("onMessage. receive a Messag:" + data); JSONObject jsonObject = JSONObject.fromObject(data); System.out.println("name="+jsonObject.getString("name")+" age="+jsonObject.getString("age")); WebSocketMessage webSocketMessage = (WebSocketMessage)JSONObject.toBean(jsonObject, WebSocketMessage.class); OnMessageThread onMessageThread =new OnMessageThread(this,webSocketMessage); new Thread(onMessageThread).start(); String jsonMsg = JSONObject.fromObject(jsonObject).toString(); sendMessage(jsonMsg) ;*/ WebSocketManager.getInstance().sendAllMessage(data); } /** * websocket发送消息接口 * @param message */ public void sendMessage(String message){ try{ log.info("sendMessage. message:"+message); conn.sendMessage(message); }catch(Exception e){ log.warning("sendMessage error,close the conn and clear the resource. msg:"+e.getMessage(),e); closeConnection(); } } /** * 关闭连接 */ private void closeConnection(){ conn.close(); } public String getKey(){ return key ; } }
在这里,还需用到一个管理websocket的类,WebSocketManager,代码如下
package main.java.test.websocket; import java.util.Map.Entry; import java.util.concurrent.ConcurrentHashMap; public class WebSocketManager { private ConcurrentHashMap<String , WebSocket> websockts = new ConcurrentHashMap<String , WebSocket>(); private static WebSocketManager instance ; public static WebSocketManager getInstance(){ if(instance == null ){ instance = new WebSocketManager(); } return instance ; } private WebSocketManager(){} public void addWebSocket(WebSocket ws){ websockts.put(ws.getKey(), ws); } public void removeWebSocket(String key ){ websockts.remove(key); } public void sendAllMessage(String message){ for(Entry<String, WebSocket> entry : websockts.entrySet()){ entry.getValue().sendMessage(message); } } }
到这里,来自前端的消息都会进入websocket的onmessage方法中,然后websocket会全部转发出去
二、前端实现
首先前端页面需要一个页面来显示接收的消息,并需要一个文本域来输入发送的消息,页面代码如下
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Home</title> <meta charset="utf-8"> <title>WebSocket简单实例</title> <style>body{text-align:center}</style> </head> <body> <textarea id="receive" cols="80" rows="20" readonly="true"></textarea><br> <textarea id="send" cols="80" rows="8"></textarea><br> <input style="height:36px;width:80px" type="button" id="loginng" value="发送" onclick="send()"><br> </body> <script type="text/javascript" src="/js/jquery.js"></script> <script type="text/javascript" src="/js/common.js"></script> <script type="text/javascript" src="/js/webchannel.js"></script> </html> 在这里,用到了webchannel.js,这个就是连接服务器websocket的js实现,如下,
var Webchannel = { wso: "", wsUrl: "ws://" + window.location.host + "/websocket.ws", busiTypes: {}, initWebsocket: function () { if ("WebSocket" in window) { wso = new WebSocket(Webchannel.wsUrl); } else if ("MozWebSocket" in window) { wso = new MozWebSocket(Webchannel.wsUrl); } else { console.log("The browser don't support the WebSocket"); } wso.onopen = function () { console.log("connect success"); }; wso.onclose = function () { try{ wso = new WebSocket(Webchannel.wsUrl); }catch(e){ console.log("disconnect error"+e); } console.log("disconnect success"); }; wso.onerror = function () { console.log("sorry,it get error"); }; wso.onmessage = function (receiveMsg) { var str = $("#receive").val(); var reMsg = receiveMsg.data.substring(1 ,receiveMsg.data.length-1); $("#receive").val(str+"\n"+reMsg); } }, sendMsg:function(data){ var jsonData= JSON.stringify(data); wso.send(jsonData); }, closeWebSocket: function () { if (1 == wso.readyState) { wso.close(); wso = ""; } }, regBusitype: function (busiType, backFunction) { Webchannel.busiTypes[busiType] = backFunction; } }; Webchannel.initWebsocket(); function send(){ var data = $("#send").val(); $("#send").val(""); Webchannel.sendMsg(data); }
在这个js中,打开页面就会进行一个websocket初始化,连接服务器,点击页面上的发送按钮就会调用js中的send方法,send方法获取页面中需要发送的内容,然后调用wensocket方法发送消息给服务器,
这样就实现了网页版的群聊功能
相关推荐
在使用Jetty实现WebSocket聊天程序时,我们需要创建一个继承自`org.eclipse.jetty.websocket.WebSocket.OnTextMessage`的类,重写`onOpen`、`onClose`、`onMessage`等方法。`onOpen`在连接建立时调用,`onClose`在...
WebSocket是一种在客户端和服务器之间建立持久连接的协议,它允许双方进行全双工通信,即数据可以在...理解这些技术可以帮助开发者选择最适合他们项目的解决方案,并且能够有效地利用WebSocket实现高效的实时通信功能。
首先,为了创建一个基于Spring MVC的WebSocket聊天应用,我们需要确保开发环境满足以下条件: 1. **JDK 1.7**:Java Development Kit 1.7或更高版本,是编写Java应用程序的基础。 2. **Tomcat**:一个流行的开源...
在本项目中,“Java WebSocket 实现公共聊天以及频道聊天”旨在创建一个实时通讯系统,用户可以通过公共聊天室进行交流,也可以选择加入特定频道进行私密讨论。 在WebSocket API中,服务器和客户端都拥有WebSocket...
在“Chat”这个压缩包中,可能包含了实现WebSocket聊天室的源代码、资源配置、样式文件以及可能的示例数据。解压后,开发者可以通过阅读代码和配置文件来理解整个系统的架构和工作原理,或者直接运行和测试聊天室...
这使得WebSocket特别适合于在线游戏、实时聊天、股票交易、协作编辑等需要频繁交互的应用。 首先,我们需要在HTML5页面中创建WebSocket实例。HTML代码中,可以使用`new WebSocket()`构造函数,传入WebSocket服务器...
总结来说,Java实现WebSocket提供了强大的功能,使得开发者可以轻松地在Web应用中构建实时通信功能。通过理解并应用上述概念,你可以创建自己的WebSocket服务并实现高效的数据交换。记得在实际开发中根据需求选择...
通过分析源代码和实验,你可以了解到如何自定义配置Jetty以适应特定的应用需求,例如调整线程池大小、添加自定义过滤器或者实现WebSocket端点。 总的来说,这个压缩包是一个极好的起点,无论是对Java Web开发初学者...
WebSocket协议的引入使得Web应用能够实现服务器向客户端推送数据,极大地提高了实时性,例如在线聊天、实时股票报价、游戏等应用场景。在这样的背景下,JMeter的WebSocket插件显得尤为重要,它帮助开发者和测试人员...
WebSocket协议在HTML5中被引入,目的是为了实现真正的实时交互性Web应用,比如在线游戏、股票交易、实时聊天等。与传统的HTTP协议不同,WebSocket允许数据在客户端和服务器之间双向流动,而无需反复发起请求。 ...
使用如Jetty、Tomcat等支持WebSocket的服务器,或者Spring框架的WebSocket模块可以方便地实现这一功能。 压缩包中的`websocket-demo.html`可能是包含WebSocket示例代码的HTML文件,用于演示如何在实际项目中实现...
- 在Java EE环境中,WebSocket应用通常部署在应用服务器如Tomcat、Jetty或WildFly上。 - 需要在web.xml中配置WebSocket的Servlet,或者在现代应用服务器中,可能可以直接通过注解配置。 8. **集成其他技术**: -...
1. **配置**:Spring Boot的配置文件(如application.yml或application.properties)中会配置WebSocket的相关设置,包括WebSocket的路径、使用的WebSocket服务器实现(如Tomcat或Jetty)等。 2. **WebSocket配置**:...
- **直接支持WebSocket**:Jetty 9.4.9 支持WebSocket协议,使得实时双向通信成为可能,这对于开发实时应用(如聊天室、游戏等)非常有用。 - **强大的Maven集成**:Jetty可以轻松地与Maven构建工具集成,方便开发...
这个技术在Spring框架中的实现,即Spring WebSocket,为构建实时的、双向通信的应用提供了强大的支持,尤其适用于实时推送通知、聊天应用或者股票交易等需要实时交互的场景。 在Spring框架中,WebSocket的集成主要...
7. JMeterWebSocketSampler-1.0.2-SNAPSHOT.jar:核心的JMeter WebSocket采样器实现,它整合了前面的Jetty库,提供了在JMeter中配置和执行WebSocket测试的能力。 使用JMeterWebSocketSampler时,你可以设置以下关键...
服务器端通常使用诸如Node.js、Java的WebSocket库(如Jetty或Tomcat)或者Python的Tornado框架等来处理WebSocket连接。在这个WebSocketDemo中,服务器端的代码会包含处理连接、断开连接、接收和发送数据的逻辑。 在...
2. websocket-common-9.1.1.v20140108.jar:这是Jetty Websocket的公共模块,包含了Websocket协议的实现,为服务器和客户端提供了一致的API。 3. jetty-http-9.1.2.v20140210.jar:Jetty HTTP服务器的核心模块,...
3. **WebSocket支持**:随着WebSocket协议的普及,Jetty 8.1.8.v20121106版本提供了完整的WebSocket API,使得开发者可以轻松地创建双向通信的应用,例如实时聊天、在线游戏和股票报价等。 4. **轻量级与高性能**:...
在Web开发中,WebSocket常用于实现即时通讯,例如在线聊天、股票实时推送、游戏同步等场景。当我们要监听数据库的变化并实时推送到客户端时,WebSocket就显得尤为重要。 首先,我们需要理解WebSocket的基本工作原理...