简易服务端之Servlet实现Websocket消息通信

本文地址:https://blog.csdn.net/qq_40785165/article/details/121622651,转载需附上此链接

坚持就是胜利

大家好,我是小黑,一个还没秃头的程序员~~~

本期写点服务端的内容,介绍一下大学时期经常用到的Servlet是如何实现WebSocket连接与通信的,编写Servlet不需要搭建复杂的框架,沿用大学期间学习的Web项目经验即可,适用于大学生开发毕业设计或者课程作业等场景。

话不多说,直接开始:
条件:

  1. 需要Java-WebSocket-1.3.5.jar文件
链接:https://pan.baidu.com/s/1klmTVfjaqOBrCVRqsPbGNQ 
提取码:ijqw
  1. 需要Tomcat8.0及以上

代码如下:

package websocket;

import java.io.IOException;
import java.util.concurrent.ConcurrentHashMap;

import javax.websocket.OnClose;
import javax.websocket.OnError;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;

@ServerEndpoint(value = "/websocket/{name}")
public class WebSocket {
	  /**
     * 与某个客户端的连接对话,需要通过它来给客户端发送消息
     */
    private Session session;
    /**
     * 用于存所有的连接服务的客户端,这个对象存储是安全的
     */
    public static ConcurrentHashMap<String, WebSocket> webSocketSet = new ConcurrentHashMap<String, WebSocket>();
    /**
     * 标识当前连接客户端的用户名
     */
    private String name;

    public String getName() {
        return name;
    }


    /**
     * @param session
     * @param name    可以试着用uId
     */
    @OnOpen
    public void OnOpen(Session session, @PathParam(value = "name") String name) {
        this.session = session;
        System.out.println(session.getId()+","+name);
        this.name = name; 
        // name是用来表示唯一客户端,如果需要指定发送,需要指定发送通过name来区分
        webSocketSet.put(name, this);
        System.out.println("[WebSocket] 连接成功,当前连接人数为:="+ webSocketSet.size()+name);
    }


    @OnClose
    public void OnClose() {
        webSocketSet.remove(this.name);
        System.out.println("[WebSocket] 退出成功,当前连接人数为:="+webSocketSet.size()+webSocketSet.toString());
    }

    @OnMessage
    public void OnMessage(String message) {
        System.out.println("[WebSocket] 收到消息:{}"+ message);;
        try {
            sendMessage("接收的消息:"+message);
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

    @OnError
    public void onError(Throwable error) {
        System.out.println("[WebSocket] 发生错误:"+ error.toString());
    }

    /**
     * 群发
     *
     * @param message
     */
    public void GroupSending(String message) {
        for (String name : webSocketSet.keySet()) {
            try {
                webSocketSet.get(name).session.getBasicRemote().sendText(message);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    /**
     * 指定发送
     *
     * @param name
     * @param message
     */
    public static void appointSending(String name, String message) {
    	System.out.println(name);
        try {
            webSocketSet.get(name).session.getBasicRemote().sendText(message);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static ConcurrentHashMap<String, WebSocket> getWebSocketSet() {
        return webSocketSet;
    }
    public void sendMessage(String message) throws IOException {
    	System.out.println("消息===="+message);
        this.session.getBasicRemote().sendText(message);
    }
}

由于只是一次开发的记录,就不一一详解了,大家直接拿起来使用就行了,后面有机会我会继续分享关于服务端的开发学习过程的,大家晚安!

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值