zhangzq
4 weeks ago
2 changed files with 132 additions and 9 deletions
@ -0,0 +1,107 @@ |
|||
/* |
|||
* Copyright 2019-2020 Zheng Jie |
|||
* |
|||
* Licensed under the Apache License, Version 2.0 (the "License"); |
|||
* you may not use this file except in compliance with the License. |
|||
* You may obtain a copy of the License at |
|||
* |
|||
* http://www.apache.org/licenses/LICENSE-2.0
|
|||
* |
|||
* Unless required by applicable law or agreed to in writing, software |
|||
* distributed under the License is distributed on an "AS IS" BASIS, |
|||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
|||
* See the License for the specific language governing permissions and |
|||
* limitations under the License. |
|||
*/ |
|||
package org.nl.common.mnt.websocket; |
|||
|
|||
import com.alibaba.fastjson.JSON; |
|||
import lombok.extern.slf4j.Slf4j; |
|||
import org.springframework.stereotype.Component; |
|||
|
|||
import javax.websocket.*; |
|||
import javax.websocket.server.PathParam; |
|||
import javax.websocket.server.ServerEndpoint; |
|||
import java.util.concurrent.CopyOnWriteArraySet; |
|||
|
|||
/* |
|||
* @author ZZQ |
|||
* @Date 2024/1/8 17:03 |
|||
*/ |
|||
@ServerEndpoint("/webSocket/sendPrint/{sid}") |
|||
@Slf4j |
|||
@Component |
|||
public class SendPrintSocket { |
|||
|
|||
/** |
|||
* concurrent包的线程安全Set,用来存放每个客户端对应的MyWebSocket对象。 |
|||
*/ |
|||
private static CopyOnWriteArraySet<SendPrintSocket> webSocketSet = new CopyOnWriteArraySet<SendPrintSocket>(); |
|||
/** |
|||
* 与某个客户端的连接会话,需要通过它来给客户端发送数据 |
|||
*/ |
|||
private Session session; |
|||
/** |
|||
* 接收sid |
|||
*/ |
|||
private String sid = ""; |
|||
/** |
|||
* 连接建立成功调用的方法 |
|||
*/ |
|||
@OnOpen |
|||
public void onOpen(Session session, @PathParam("sid") String sid) { |
|||
this.session = session; |
|||
//如果存在就先删除一个,防止重复推送消息
|
|||
for (SendPrintSocket webSocket : webSocketSet) { |
|||
if (webSocket.sid.equals(sid)) { |
|||
webSocketSet.remove(webSocket); |
|||
} |
|||
} |
|||
webSocketSet.add(this); |
|||
this.sid = sid; |
|||
} |
|||
|
|||
/** |
|||
* 连接关闭调用的方法 |
|||
*/ |
|||
@OnClose |
|||
public void onClose() { |
|||
webSocketSet.remove(this); |
|||
} |
|||
|
|||
/** |
|||
* 收到客户端消息后调用的方法 |
|||
* |
|||
* @param message 客户端发送过来的消息 |
|||
*/ |
|||
@OnMessage |
|||
public void onMessage(String message, Session session) { |
|||
System.out.println(webSocketSet.size()+"_接收到消息_"+session.getId()); |
|||
} |
|||
|
|||
@OnError |
|||
public void onError(Session session, Throwable error) { |
|||
log.error("发生错误"); |
|||
webSocketSet.remove(session); |
|||
error.printStackTrace(); |
|||
} |
|||
public static void sendPrint(String print){ |
|||
if (webSocketSet.size()>0){ |
|||
try { |
|||
//如果有多个客户端连接一个服务端,只要给一个客户端下发打印即可
|
|||
for (SendPrintSocket printSocket : webSocketSet) { |
|||
if (printSocket.session.isOpen()){ |
|||
printSocket.session.getBasicRemote().sendText(print); |
|||
break; |
|||
} |
|||
} |
|||
}catch (Exception ex){ |
|||
ex.printStackTrace(); |
|||
} |
|||
} |
|||
} |
|||
|
|||
public static void main(String[] args) { |
|||
SendPrintSocket.sendPrint("xxx"); |
|||
} |
|||
} |
Loading…
Reference in new issue