基于springboot的websocket服务端和客户端demo(简单易上手)

jdk 1.8

1、导入maven依赖
<!-- websocket服务端依赖 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-websocket</artifactId>
</dependency>

<!-- websocket客户端依赖 -->
<dependency>
    <groupId>org.java-websocket</groupId>
    <artifactId>Java-WebSocket</artifactId>
    <version>1.3.5</version>
</dependency>
2、config配置类
@Configuration
public class WebSocketConfig {

    @Bean
    public ServerEndpointExporter serverEndpointExporter() {
        return new ServerEndpointExporter();
    }
}
3、消息体类
@Data
public class WebsocketMessage {
    private String id;            // 接收消息的用户id
    private String toType;        // 消息类型
    private String fromUserId;  // 消息发送的用户id
    private String message;       // 消息体
}
4、websocket服务端
@Slf4j
@Component
@ServerEndpoint("/websocket/{id}")
public class WebSocketServer {
    private Session session;
    private String id;
    private static ConcurrentHashMap<String, WebSocketServer> sessionPools = new ConcurrentHashMap<>();

    @OnOpen
    public void OnOpen(Session session, @PathParam("id") String id) {
        this.session = session;
        this.id = id;
        sessionPools.put(id, this);
        log.info("[WebSocketServer] 连接成功,当前连接人数:{}人", sessionPools.size());
    }

    @OnClose
    public void OnClose() {
        sessionPools.remove(this.id);
        log.info("[WebSocketServer] 退出成功,当前连接人数:{}人", sessionPools.size());
    }

    @OnMessage
    public void OnMessage(String message) {
        log.info("[WebSocketServer] 收到消息:{}",message);
        Gson gson = new Gson();
        WebsocketMessage webSocketMessage = gson.fromJson(message, WebsocketMessage.class);
        if (webSocketMessage.getToType().equals("PM")) {
            AppointSending(webSocketMessage.getId(), message);
        } else {
            GroupSending(webSocketMessage.getFromUserId(),message);
        }
    }

    /**
     * 群发
     * @param message
     */
    public void GroupSending(String fromId,String message){
        for (String id : sessionPools.keySet()){
            try {
                if (id.equals(fromId)) {
                    continue;
                }
                sessionPools.get(id).session.getBasicRemote().sendText(message);
            }catch (Exception e){
                e.printStackTrace();
            }
        }
    }

    /**
     * 指定发送
     * @param id
     * @param message
     */
    public void AppointSending(String id,String message){
        try {
            sessionPools.get(id).session.getBasicRemote().sendText(message);
        }catch (Exception e){
            e.printStackTrace();
        }
    }

}
5、websocket客户端
@Slf4j
public class MyWebSocketClient extends WebSocketClient {

    public MyWebSocketClient(URI serverUri) {
        super(serverUri);
    }

    @Override
    public void onOpen(ServerHandshake arg0) {
        // TODO Auto-generated method stub
        log.info("[WebSocket Client] 客户端已连接.");
    }

    @Override
    public void onClose(int arg0, String arg1, boolean arg2) {
        // TODO Auto-generated method stub
        log.info("[WebSocket Client] 客户端已关闭.{}",arg1);
    }

    @Override
    public void onError(Exception arg0) {
        // TODO Auto-generated method stub
        log.info("[WebSocket Client] 连接错误.{}",arg0);
    }

    @Override
    public void onMessage(String message) {
        Gson gson = new Gson();
        WebsocketMessage websocketMessage = gson.fromJson(message, WebsocketMessage.class);
        String message1 = websocketMessage.getMessage();
        String fromUserId = websocketMessage.getFromUserId();
        String toType = websocketMessage.getToType();
        String type = "";
        if (toType.equals("PM")) {
            type = "私发";
        } else {
            type = "群发";
        }
        // TODO Auto-generated method stub
        log.info("-------- 接收到来自{}的{}消息:" + message1 + "--------",fromUserId,type);
    }
}
6、websocket 客户端demo

正常情况下websocket客户端都集成在网页端,这里就不展示网页端的代码了,只展示java的websocket客户端。
这里用三个类模拟了三个客户端。

lisi客户端用户 lisi 私发消息给 zhangsan,也用于接收私聊或群发的消息

@Slf4j
public class DemoSend {
    public static void main(String[] args) {
        String currentPersonId = "lisi";
        String toPersonId = "zhangsan";
        MyWebSocketClient webSocketClient = null;
        try {
            webSocketClient = new MyWebSocketClient(new URI("ws://127.0.0.1:8080/websocket/" + currentPersonId));
        } catch (URISyntaxException e) {
            e.printStackTrace();
        }
        webSocketClient.connect();
        // 这里一定要等客户端连接上了服务端再执行后续逻辑操作,否则会报错
        while (!webSocketClient.getReadyState().equals(WebSocket.READYSTATE.OPEN)) {
            log.info("正在准备连接... ...");
        }
        log.info("连接成功!");
        Scanner scanner = new Scanner(System.in);
        WebsocketMessage websocketMessage = new WebsocketMessage();
        websocketMessage.setId(toPersonId);
        websocketMessage.setFromUserId(currentPersonId);
        websocketMessage.setToType("PM");
        while (true) {
            System.err.println(currentPersonId+" -> ");
            String message = scanner.nextLine();
            websocketMessage.setMessage(message);
            webSocketClient.send(new Gson().toJson(websocketMessage));
        }
    }
}

zhangsan客户端用户 zhangsan 私发消息给 wangwu,也用于接收私聊或群发的消息

@Slf4j
public class DemoSend2 {
    public static void main(String[] args) {
        String currentPersonId = "zhangsan";
        String toPersonId = "wangwu";
        MyWebSocketClient webSocketClient = null;
        try {
            webSocketClient = new MyWebSocketClient(new URI("ws://127.0.0.1:8080/websocket/" + currentPersonId));
        } catch (URISyntaxException e) {
            e.printStackTrace();
        }
        webSocketClient.connect();
        // 这里一定要等客户端连接上了服务端再执行后续逻辑操作,否则会报错
        while (!webSocketClient.getReadyState().equals(WebSocket.READYSTATE.OPEN)) {
            log.info("正在准备连接... ...");
        }
        log.info("连接成功!");
        Scanner scanner = new Scanner(System.in);
        WebsocketMessage websocketMessage = new WebsocketMessage();
        websocketMessage.setId(toPersonId);
        websocketMessage.setFromUserId(currentPersonId);
        websocketMessage.setToType("PM");
        while (true) {
            System.err.println(currentPersonId + " -> ");
            String message = scanner.nextLine();
            websocketMessage.setMessage(message);
            webSocketClient.send(new Gson().toJson(websocketMessage));
        }
    }
}

wangwu客户端用户 wangwu 群发消息,也用于接收私聊消息

@Slf4j
public class DemoSend3 {
    public static void main(String[] args) {
        String currentPersonId = "wangwu";
        MyWebSocketClient webSocketClient = null;
        try {
            webSocketClient = new MyWebSocketClient(new URI("ws://127.0.0.1:8080/websocket/" + currentPersonId));
        } catch (URISyntaxException e) {
            e.printStackTrace();
        }
        webSocketClient.connect();
        // 这里一定要等客户端连接上了服务端再执行后续逻辑操作,否则会报错
        while (!webSocketClient.getReadyState().equals(WebSocket.READYSTATE.OPEN)) {
            log.info("正在准备连接... ...");
        }
        log.info("连接成功!");
        Scanner scanner = new Scanner(System.in);
        WebsocketMessage websocketMessage = new WebsocketMessage();
        websocketMessage.setFromUserId(currentPersonId);
        websocketMessage.setToType("");
        while (true) {
            System.err.println(currentPersonId + " -> ");
            String message = scanner.nextLine();
            websocketMessage.setMessage(message);
            webSocketClient.send(new Gson().toJson(websocketMessage));
        }
    }
}

done.

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值