websocket 获取连接id_socket编程之websocket实现

实现私聊和群聊两个功能,要在web端实现想微信QQ那样的即时通讯的功能,我们需要了解一下websocket。

websocket是一种可以双向通讯的长连接协议,http是获取完数据就关闭,websocket则可以一直连接,就像铺了一条管道一样,水可以一直流着。

一、websocket前端

var ws = new WebSocket("ws://127.0.0.1.com:8282");
    ws.onopen=function(){
    
        var msg = JSON.stringify({
    
            type: "login",
            content: "login"
        });
        ws.send(msg);
    }
    
    ws.onmessage = function (e){
     
        console.log(e);
        //服务器发送的内容
        var res = JSON.parse(e.data);
        switch(res.type){
    
            case "login":
                
                break;
            case "pm":
                
                break;
            case "groupPm":
                
                break;
                
        }
    }
    ws.onerror=function (e){
     
        console.log(e);
    }
    ws.onclose=function (e){
     
        console.log(e);
    }

二、服务端

a3f77f954d9261468d072ffa099a9dc4.png


客户端发送http请求,带上Sec-WebSocket-Key,
服务端握手 加密key,发送给客户端。
双方能进行交流。

发送接收消息需要进行打包encode 解包decode。

<?php

class SocketService
{
    
    public $host="tcp://0.0.0.0:8000";
    private $address;
    private $port;
    private $_sockets;
    public $clients;
    public $maxid=1000;
    public function __construct($address = '', $port
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在使用WebSocket进行通信时,我们通常需要对连接进行验证和授权,以确保只有经过身份验证的用户才能访问WebSocket。本文将介绍如何使用Token验证并将WebSocket的clientId绑定到用户的uid(微信)上实现WebSocket通信。 1. Token验证 在使用WebSocket建立连接时,可以在请求头中携带Token进行验证。我们可以在后端实现一个Token验证的过滤器,用于验证请求头中的Token是否有效。如果Token无效,则返回错误信息并关闭WebSocket连接;如果Token有效,则允许WebSocket连接。 以下是一个Token验证的Java代码示例: ```java public class TokenFilter implements Filter { @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest req = (HttpServletRequest) request; String token = req.getHeader("token"); // 从请求头中获取Token if (token == null) { // 如果Token为空,返回错误信息并关闭WebSocket连接 HttpServletResponse resp = (HttpServletResponse) response; resp.sendError(HttpServletResponse.SC_UNAUTHORIZED, "Token is required"); return; } // 验证Token是否有效,验证通过则允许WebSocket连接,否则返回错误信息并关闭WebSocket连接 if (validateToken(token)) { chain.doFilter(request, response); } else { HttpServletResponse resp = (HttpServletResponse) response; resp.sendError(HttpServletResponse.SC_UNAUTHORIZED, "Invalid token"); } } private boolean validateToken(String token) { // Token验证逻辑 return true; // 如果Token有效,则返回true,否则返回false } } ``` 在使用WebSocket时,我们需要在WebSocket请求中添加Token头信息,如下所示: ```javascript const ws = new WebSocket("ws://localhost:8080/websocket"); ws.onopen = function(event) { ws.send("Hello WebSocket"); // 发送消息 }; ws.setRequestHeader("token", "your_token"); // 添加Token头信息 ``` 2. clientId绑定到uid上 在WebSocket连接建立时,我们可以将WebSocket的clientId与用户的uid进行绑定,以便后续使用时能够快速找到对应的用户。在这里,我们以微信用户的openid作为用户的uid进行绑定。 在后端,我们可以维护一个WebSocket连接管理器,用于管理WebSocket连接和用户的绑定关系。当WebSocket连接建立时,我们可以将clientId和openid进行绑定,并将绑定关系保存到连接管理器中。 以下是一个WebSocket连接管理器的Java代码示例: ```java public class WebSocketManager { private static final Map<String, WebSocketSession> sessions = new ConcurrentHashMap<>(); private static final Map<String, String> clientIdToOpenid = new ConcurrentHashMap<>(); public static void addSession(String clientId, WebSocketSession session) { sessions.put(clientId, session); } public static void removeSession(String clientId) { sessions.remove(clientId); clientIdToOpenid.remove(clientId); } public static void bindClientIdToOpenid(String clientId, String openid) { clientIdToOpenid.put(clientId, openid); } public static String getOpenidByClientId(String clientId) { return clientIdToOpenid.get(clientId); } public static WebSocketSession getSessionByClientId(String clientId) { return sessions.get(clientId); } } ``` 当WebSocket连接建立时,我们可以在WebSocket处理器中获取openid,并将clientId和openid进行绑定,如下所示: ```java @Component public class WebSocketHandler extends TextWebSocketHandler { @Override public void afterConnectionEstablished(WebSocketSession session) throws Exception { String clientId = session.getId(); // 获取WebSocket的clientId String openid = getOpenidFromSession(session); // 获取用户的openid WebSocketManager.addSession(clientId, session); // 将WebSocket连接添加到连接管理器中 WebSocketManager.bindClientIdToOpenid(clientId, openid); // 将clientId和openid进行绑定 } private String getOpenidFromSession(WebSocketSession session) { // 从WebSocket的Attributes中获取用户的openid return (String) session.getAttributes().get("openid"); } } ``` 在后续使用WebSocket时,我们可以根据用户的openid快速找到对应的WebSocket连接,如下所示: ```java String openid = "your_openid"; String clientId = WebSocketManager.getClientIdByOpenid(openid); WebSocketSession session = WebSocketManager.getSessionByClientId(clientId); if (session != null && session.isOpen()) { session.sendMessage(new TextMessage("Hello WebSocket")); } ``` 以上就是使用Token验证并将WebSocket的clientId绑定到用户的uid实现WebSocket通信的方法。通过Token验证,我们可以确保WebSocket连接的安全性;通过将clientId和openid进行绑定,我们可以快速找到对应的WebSocket连接,提高通信的效率。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值