j2ee实现websocket向外推送消息

引入naven配置

        <dependency>
            <groupId>javax.websocket</groupId>
            <artifactId>javax.websocket-api</artifactId>
            <version>1.1</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-websocket</artifactId>
        </dependency>

后台编写websocket服务类


import org.springframework.stereotype.Component;
import org.springframework.web.socket.WebSocketMessage;
import javax.websocket.*;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;
import java.util.Set;

@ServerEndpoint("/service")
@Component
public class websoketTest {
    public websoketTest(){}
    
    @OnOpen
    public void onopen(Session session){
        System.out.println("连接成功");
        try {
            session.getBasicRemote().sendText("hello client...");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    @OnClose
    public void onclose(Session session){
        System.out.println("close....");

    }
    @OnMessage
    public void onsend(Session session,String msg){
        try {

            // 广播消息
            Set<Session> sess = session.getOpenSessions();
            for(Session s : sess){
                s.getBasicRemote().sendText("client"+s.getId()+"___say:"+msg);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }


}

使用内嵌容器需要被 Spring 管理并初始化

@Configuration
public class WebSocketConfig {

    @Bean
    public ServerEndpointExporter serverEndpointExporter() {
        return new ServerEndpointExporter();
    }

}

前端接收html

<body>
<ul id="content"></ul>
<form class="form">
    <input type="text" placeholder="请输入发送的消息" class="message" id="message"/>
    <input type="button" value="发送" id="send" class="connect"/>
    <input type="button" value="连接" id="connect" class="connect"/>
</form>
<script>
    var oUl=document.getElementById('content');
    var oConnect=document.getElementById('connect');
    var oSend=document.getElementById('send');
    var oInput=document.getElementById('message');
    var ws=null;
    oConnect.onclick=function(){
        ws =new WebSocket('ws://localhost:8080/service');
        ws.onopen=function(){
            oUl.innerHTML+="<li>客户端已连接</li>";
        }
        ws.onmessage=function(evt){
            oUl.innerHTML+="<li>"+evt.data+"</li>";
        }
        ws.onclose=function(){
            oUl.innerHTML+="<li>客户端已断开连接</li>";
        };
        ws.onerror=function(evt){
            oUl.innerHTML+="<li>"+evt.data+"</li>";

        };
    };
    oSend.onclick=function(){
        if(ws){
            ws.send(oInput.value);
        }
    }

</script>
</body>

配合数据库或其它缓存服务可以实现复杂的推送服务

其它实现方式大同小异

如果觉得封装的太多,可以研究注解@ServerEndpoint

关键点是ServerEndpointConfig.Configurator,重写modifyHandshake完成握手,会灵活一些

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
Java实现WebSocket实现消息推送的步骤如下: 1.创建WebSocket配置类 ```java @Configuration @EnableWebSocket public class WebSocketConfig implements WebSocketConfigurer { @Override public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) { registry.addHandler(new MyWebSocketHandler(), "/websocket").addInterceptors(new MyHandshakeInterceptor()); } } ``` 2.创建WebSocket处理器 ```java public class MyWebSocketHandler extends TextWebSocketHandler { private static final List<WebSocketSession> sessions = new CopyOnWriteArrayList<>(); @Override public void afterConnectionEstablished(WebSocketSession session) throws Exception { sessions.add(session); } @Override protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception { for (WebSocketSession s : sessions) { s.sendMessage(message); } } @Override public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception { sessions.remove(session); } } ``` 3.创建握手拦截器 ```java public class MyHandshakeInterceptor implements HandshakeInterceptor { @Override public boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Map<String, Object> attributes) throws Exception { return true; } @Override public void afterHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Exception exception) { } } ``` 4.在页面中使用JavaScript连接WebSocket ```javascript var socket = new WebSocket("ws://localhost:8080/websocket"); socket.onmessage = function(event) { console.log(event.data); }; ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

平静的大海

你的鼓励是我的动力源泉

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值