优秀的编程知识分享平台

网站首页 > 技术文章 正文

在javaee项目中使用WebSocket(java websocket onclose)

nanyue 2024-10-13 04:01:15 技术文章 9 ℃

首先,什么是WebSocket,有兴趣的朋友可以看看这里:http://zh.wikipedia.org/zh-cn/WebSocket

对WebSocket有了基本认识后,我们可以着手开发WebSocket应用程序,推荐使用Maven搭建项目。我使用的服务器是Tomcat 7.0.56(Tomcat 7或者更高版本才能使用WebSocket,而且至少是7.0.47以上版本才支持, LZ一开始用7.0.41部署没有成功...)。WebSocket 还需要javaee7的支持,所以在pom.xml中需要引用一下jar:

<span style="white-space:pre">	</span><dependency>
 <groupId>javax</groupId>
 <artifactId>javaee-api</artifactId>
 <version>7.0</version>
 </dependency>
 
 <dependency>
 <groupId>javax.websocket</groupId>
 <artifactId>javax.websocket-api</artifactId>
 <version>1.0</version>
 <scope>provided</scope>
 </dependency>
 
 <!-- 增加fastjson-1.1.34.jar -->
 <dependency>
 <groupId>com.alibaba</groupId>
 <artifactId>fastjson</artifactId>
 <version>1.1.34</version>
 </dependency>

因为Tomcat自带了websocket-api,所以项目中的websocket-api是provided,方便编译。

接着可以编写服务端的WebSocket程序,示例代码:

package com.jiepu.visuallab.web.servlet;
 
import com.alibaba.fastjson.JSON;
import com.jiepu.visuallab.common.C;
import com.jiepu.visuallab.common.bean.SocketReply;
import com.jiepu.visuallab.common.tools.HostTools;
 
import javax.websocket.*;
import javax.websocket.server.ServerEndpoint;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
 
/**
 *
 * Created by zengxm on 2014/11/4.
 */
@ServerEndpoint("/websocket/test")
public class HostWebSocketServlet {
 
 private static Map<String, Session> sessions = new HashMap<String, Session>();
 
 public HostWebSocketServlet(){
 System.out.println("--------------------------------------");
 }
 
 /**
 * 向客户端群发信息
 * @param category
 * @param data
 */
 public synchronized static void sendAll(String category, Object data){
 SocketReply re = new SocketReply(category, data);
 String replyStr = JSON.toJSONString(re);
 System.out.println("开始群发信息!");
 Set<String> keys = sessions.keySet();
 for(String k:keys){
 Session s = sessions.get(k);
 if(s.isOpen()){
 try{
 s.getBasicRemote().sendText(replyStr);
 
 System.out.println("发送成功, id="+k);
 }catch(Exception e){
 System.err.println("发送出错:"+e.getMessage());
 }
 }
 }
 }
 
 @OnMessage
 public void onMessage(Session session, String msg){
 System.out.println("收到信息");
 try {
 session.getBasicRemote().sendText("get");
 }catch (Exception e){
 e.printStackTrace();
 }
 }
 
 @OnOpen
 public void onOpen(Session session, EndpointConfig config){
 try {
 sessions.put(session.getId(), session);
 
 SocketReply re = new SocketReply(C.HOST_DATA, HostTools.getHostList());
 String replyStr = JSON.toJSONString(re);
 
 session.getBasicRemote().sendText(replyStr);
 }catch (Exception e){
 e.printStackTrace();
 }
 }
 
 @OnError
 public void onError(Session session, Throwable throwable){
 
 }
 
 @OnClose
 public void onClose(Session session, CloseReason reason){
 try {
 System.out.println("断开连接, id="+session.getId());
 synchronized (sessions){
 sessions.remove(session.getId());
 }
 }catch (Exception e){
 e.printStackTrace();
 }
 }
}

在html页面中可以这样连接到上面定义好的WebSocket:

 var url = "ws://"+document.location.host+"${base}/websocket/test";
 var ws = new WebSocket(url);
 
 ws.onopen = function(e){
 console.log("ws connect Success!");
 HostUtil.start();
 
 HostConsole.init();
 listeners.push(HostConsole);
 }
 
 ws.onmessage = function(evt){
 console.log("ws get:"+evt.data);
 }

上面代码中的${base}就是项目名称,替换成实际的路径即可。

将项目部署到tomcat,运行之,在console可以看到连接信息:

总结:

1. 如果环境都搭建好了,运行项目也没报错,但是连接不了WebSocket(js端报404错误),可以看看是不是jar冲突了。就是项目lib里面是不是有websocket-api相关的jar,有的话要删除,不然会跟tomcat自带的websocket冲突,导致服务端程序没有执行。

Tags:

最近发表
标签列表