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

Posted Android_小黑

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了简易服务端之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);
    


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

以上是关于简易服务端之Servlet实现Websocket消息通信的主要内容,如果未能解决你的问题,请参考以下文章

初入Java后端之Servlet

node搭建简易的websocket服务

vue使用WebSocket模拟实现聊天功能-简易版

探秘Tomcat——一个简易的Servlet容器

HTML5 - websocket的应用 之 简易聊天室

python基于socket实现WebSocket简易实现