WebSocket 的使用

说明:WebSocket的通信时每个链接都会在onOpen方法里面建立一个WebSocketSession,当多个session连接的时候,我们就需要对每个session进行唯一性标识(一般一个用户有一个连接)所以就需要创建一个Map<String,Session>来装所有的session并对每个session进行标识。

1:先把页面代码贴出来

<script type="text/javascript">
webSocket = new WebSocket("ws://localhost:8080/WSPMXT/WSHello");
webSocket.onopen =function(event){
if(event.data === undefined)
return;
webSocket.onmessage =function(event){
 alert("成功了"+event.data);
};
webSocket.onerror =function(event){
alert("连接错误");
};
webSocket.onclose =function(event){
alert("连接关闭");
};
}
</script>


2:后台代码 首先建一个HelloEndPoint 类进行连接管理,onOpen方法在创建连接的时候使用onMessage方法则是需要给页面发送数据的时候调用



  
  
import java.io.IOException; import java.util.HashMap; import java.util.Map;
import javax.websocket.EndpointConfig; 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;
@ServerEndpoint(value="/WSHello",configurator=GetHttpSessionConfigurator.class ) //configurator 指定一个被重写的类 onOpen方法才能使用第二个参数EndpointConfig config ,一般第二个参数用来做Map的KEY public class HelloEndPoint {  public static final Map<String,Session > users = new HashMap<String, Session>();   //构建一个Map 来装所有链接webSocket的session       @OnOpen     public void onOpen(Session session,EndpointConfig config){      // HttpSession httpSession= (HttpSession) config.getUserProperties().get(HttpSession.class.getName());      String userId= (String) config.getUserProperties().get("sendid");         System.out.println("Session " + session.getId() + " has opened a connection");         users.put(userId, session);  //注意 最好是能在session断开连接的时候 将对应得session清除,不然如果KEY值一样的话第二次websocket连接的时候会出错         try {             session.getBasicRemote().sendText("Connection Established");         } catch (IOException ex) {             ex.printStackTrace();         }     }  
    @OnMessage     public void onMessage(String message, Session session){            try {             session.getBasicRemote().sendText("message");         } catch (IOException ex) {             ex.printStackTrace();         }     }  
    @OnClose     public void onClose(Session session){         System.out.println("Session " +session.getId()+" has closed!");     }         /**      * 注意: OnError() 只能出现一次.   其中的参数都是可选的。      * @param session      * @param t      */     @OnError     public void onError(Session session, Throwable t) {         t.printStackTrace();     }     }

3:2中指定了一个重写的类,这里贴出该类的代码

import javax.servlet.http.HttpSession;
import javax.websocket.HandshakeResponse;
import javax.websocket.server.HandshakeRequest;
import javax.websocket.server.ServerEndpointConfig;
import javax.websocket.server.ServerEndpointConfig.Configurator;

public class GetHttpSessionConfigurator extends Configurator { 
//继承Configurator 重写下面的方法完成逻辑代码,比如将HttpSession或者Cookie传过去或者其他类的一些业务数据比如下面我将传递一个UserId过去

    @Override
    public void modifyHandshake(ServerEndpointConfig sec,
            HandshakeRequest request, HandshakeResponse response) {
       // HttpSession httpSession=(HttpSession) request.getHttpSession();//获取HttpSession
       // sec.getUserProperties().put(HttpSession.class.getName(),httpSession); //将session装进sec,在webSocket主类里onOpen方法里调用这个对象
       
     SendUserId si = new SendUserId();
     String id = si.sendId();
     sec.getUserProperties().put("sendid",id);
    }
}


4:调用2中的onMessage方法向页面传递数据

import javax.websocket.Session;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

import com.zsq.webSocket.HelloEndPoint;
import com.zsq.webSocket.SendUserId;

@Controller("Sse")
public class TestSseController {

 @RequestMapping(value="websocket")
 protected String sendMesage(){
  SendUserId si = new SendUserId();
     String id = si.sendId();
  HelloEndPoint hep = new HelloEndPoint();
  Session session = hep.users.get(id);  //根据userid获取相应的session用这个session传值给指定的用户
  String message = "成功";
  hep.onMessage(message,session);
  return "index";
 }
}


5:这里提及一下SSE,这是一种服务器单向推送数据到浏览器的技术。我之前也用过但是,SSE推送数据浏览器接收后会再想服务器发送一个请求,这一点很不爽。


















  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
WebSocket 是一种在单个 TCP 连接上进行全双工通信的协议,它可以让客户端和服务器之间进行实时通信。在使用 WebSocket 时,客户端和服务器之间会建立一个长连接,这样客户端就可以向服务器发送数据,并从服务器接收数据。相比于传统的 HTTP 请求,WebSocket 的优势是可以实现实时通信,而且不需要频繁地发起请求和响应。 下面是使用 WebSocket 的基本步骤: 1. 客户端向服务器发起 WebSocket 连接请求。 2. 服务器接收到 WebSocket 连接请求,并建立连接。 3. 客户端和服务器之间进行实时通信。 4. 当通信结束时,客户端和服务器都可以关闭连接。 在 JavaScript 中,可以使用 WebSocket 对象来实现 WebSocket 通信。以下是一个简单的 WebSocket 示例: ```javascript // 创建 WebSocket 对象 var ws = new WebSocket('ws://localhost:8080'); // 监听连接事件 ws.onopen = function() { console.log('WebSocket 已连接'); }; // 监听消息事件 ws.onmessage = function(evt) { console.log('收到消息:' + evt.data); }; // 发送消息 ws.send('Hello, WebSocket!'); // 关闭连接 ws.close(); ``` 在上面的示例中,我们首先创建了一个 WebSocket 对象,然后监听了连接事件和消息事件。当连接建立成功时,会触发 onopen 事件;当收到消息时,会触发 onmessage 事件。我们还可以使用 send 方法向服务器发送消息,使用 close 方法关闭连接。 在服务器端,也可以使用 WebSocket 对象来实现 WebSocket 通信。具体实现方式可以参考各种编程语言的 WebSocket 库和示例代码。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值