Java-WebSocket服务端和客户端

原创
2024/12/11 10:43
阅读数 22
<dependency>
     <groupId>org.java-websocket</groupId>
     <artifactId>Java-WebSocket</artifactId>
     <version>1.3.4</version>
</dependency>

maven-repository\org\java-websocket\Java-WebSocket\1.3.4\Java-WebSocket-1.3.4.jar

package com.dhcc.project.evaluate.websocket.server;

import com.dhcc.common.utils.bean.SpringContextUtil;
import com.dhcc.framework.redis.RedisCache;
import lombok.extern.slf4j.Slf4j;
import org.java_websocket.WebSocket;
import org.java_websocket.handshake.ClientHandshake;

import java.net.InetSocketAddress;
import java.util.concurrent.CopyOnWriteArraySet;

@Slf4j
public class EvaluateWebSocketServer extends org.java_websocket.server.WebSocketServer {
    //concurrent包的线程安全Set,用来存放每个客户端对应的MyWebSocket对象
    CopyOnWriteArraySet<WebSocket> connections = new CopyOnWriteArraySet();
    public EvaluateWebSocketServer(int port) {
        super(new InetSocketAddress(port));
    }

    @Override
    public void onOpen(WebSocket conn, ClientHandshake clientHandshake) {
        RedisCache redisTemplate = SpringContextUtil.getBean(RedisCache.class);
        conn.send("客户端与服务器握手成功了,开始聊天吧");
        // 新连接开启时,可以在这里添加逻辑,例如记录连接信息到Redis
        connections.add(conn);
        //conn.getRemoteSocketAddress().toString();
        //String userName = clientHandshake.getFieldValue("userName");
        //log.info("用户:{}连接成功",userName);
        String pathParam = clientHandshake.getResourceDescriptor();
        log.info("pathParam: {}",pathParam);
        redisTemplate.getRedisTemplate().opsForHash().put("websockets", conn.getRemoteSocketAddress().toString(), "connected");
    }

    @Override
    public void onClose(WebSocket conn, int code, String reason, boolean remote) {
        log.info("关闭会话,原因:"+code+" : "+reason);
        RedisCache redisTemplate = SpringContextUtil.getBean(RedisCache.class);
        redisTemplate.getRedisTemplate().opsForHash().delete("websockets", conn.getRemoteSocketAddress().toString());
        connections.remove(conn);
    }

    @Override
    public void onMessage(WebSocket conn, String s) {
        //根据指令s做不同的处理
        //webSocket.send("收到指令:"+s);
        broadcast(s);
    }

    @Override
    public void onError(WebSocket webSocket, Exception e) {
        log.error("服务端错误信息",e);
    }

    @Override
    public void onStart() {
        log.info("服务已启动");
    }


    // 向所有连接的客户端广播消息
    private void broadcast(String message) {
        RedisCache redisTemplate = SpringContextUtil.getBean(RedisCache.class);
        for (WebSocket conn : connections) {
            redisTemplate.getRedisTemplate().opsForHash().get("websockets", conn.getRemoteSocketAddress().toString());
            conn.send("群发回复: "+message);
        }
    }
}

启动服务端

new EvaluateWebSocketServer(5004).start();

客户端

package com.dhcc.project.evaluate.websocket.client;

import cn.hutool.system.oshi.OshiUtil;
import lombok.extern.slf4j.Slf4j;
import org.java_websocket.client.WebSocketClient;
import org.java_websocket.handshake.ServerHandshake;

import java.net.URI;

@Slf4j
public class EvaluateWebsocketClient extends WebSocketClient {

    public static EvaluateWebsocketClient getInstance(URI serverUri){
        return new EvaluateWebsocketClient(serverUri);
    }
    /**
     * Constructs a WebSocketClient instance and sets it to the connect to the
     * specified URI. The channel does not attampt to connect automatically. The connection
     * will be established once you call <var>connect</var>.
     *
     * @param serverUri the server URI to connect to
     */
    public EvaluateWebsocketClient(URI serverUri) {
        super(serverUri);
       

    }

    @Override
    public void onOpen(ServerHandshake handshakedata) {
        log.info("websocket客户端与服务端握手结果:{} : {}",handshakedata.getHttpStatus(),handshakedata.getHttpStatusMessage());
        super.getConnection().send("我是客户端"+ OshiUtil.getOs().getFamily()+OshiUtil.getOs().getVersionInfo()+",欢迎你!");
    }

    @Override
    public void onMessage(String message) {
        log.info("服务器回复说: {}",message);
    }

    @Override
    public void onClose(int code, String reason, boolean remote) {
        log.info("关闭原因: {}:{}",code,reason);
    }

    @Override
    public void onError(Exception ex) {
        log.error("",ex);
    }
}

启动客户端

EvaluateWebsocketClient.getInstance(URI.create(wsUrl)).connect();

 

展开阅读全文
加载中
点击引领话题📣 发布并加入讨论🔥
0 评论
0 收藏
0
分享
返回顶部
顶部