All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.logicbus.backend.websocket.Remote Maven / Gradle / Ivy

There is a newer version: 1.6.17
Show newest version
package com.logicbus.backend.websocket;

import com.alogic.xscript.AbstractLogiclet;
import com.alogic.xscript.ExecuteWatcher;
import com.alogic.xscript.Logiclet;
import com.alogic.xscript.LogicletContext;
import com.alogic.xscript.doc.XsObject;
import com.alogic.xscript.plugins.Segment;
import com.anysoft.util.Properties;
import com.anysoft.util.PropertiesConstants;
import org.apache.commons.lang3.StringUtils;
import org.bouncycastle.util.encoders.Base64;

import javax.websocket.CloseReason;
import javax.websocket.RemoteEndpoint;
import javax.websocket.Session;
import java.nio.ByteBuffer;

/**
 * WebSocket的远程操作
 *
 * @since 1.6.14.1 [20210310 duanyy] 
*/ public class Remote extends Segment { public Remote(String tag, Logiclet p) { super(tag, p); registerModule("ws-text",SendText.class); registerModule("ws-data",SendData.class); registerModule("ws-ping",SendPing.class); registerModule("ws-pong",SendPong.class); registerModule("ws-close",SendClose.class); } /** * 操作虚基类 */ public abstract static class Operation extends AbstractLogiclet{ protected String pid = WSEndpointBase.SESSIONID; public Operation(String tag, Logiclet p) { super(tag, p); } @Override public void configure(Properties p){ super.configure(p); pid = PropertiesConstants.getString(p,"pid",pid,true); } @Override protected void onExecute(XsObject root, XsObject current, final LogicletContext ctx, final ExecuteWatcher watcher){ Session session = ctx.getObject(pid); if (session != null){ onExecute(session,root,current,ctx,watcher); } } protected abstract void onExecute(Session session, XsObject root, XsObject current, LogicletContext ctx, ExecuteWatcher watcher); } /** * 发送文本 */ public static class SendText extends Operation{ protected String $text; protected String $finish = "true"; public SendText(String tag, Logiclet p) { super(tag, p); } @Override public void configure(Properties props){ super.configure(props); $text = PropertiesConstants.getRaw(props,"text",""); $finish = PropertiesConstants.getRaw(props,"finish",$finish); } @Override protected void onExecute(Session session, XsObject root, XsObject current, LogicletContext ctx, ExecuteWatcher watcher) { String text = PropertiesConstants.transform(ctx,$text,""); if (StringUtils.isNotEmpty(text)){ RemoteEndpoint.Basic basic = session.getBasicRemote(); try { basic.sendText(text,PropertiesConstants.transform(ctx,$finish,true)); }catch (Exception ex){ log("Failed to send message to remote endpoint:" + ex.getMessage()); } } } } /** * 发送数据 */ public static class SendData extends Operation{ protected String $id; protected String $finish = "true"; public SendData(String tag, Logiclet p) { super(tag, p); } @Override public void configure(Properties props){ super.configure(props); $id = PropertiesConstants.getRaw(props,"id",""); $finish = PropertiesConstants.getRaw(props,"finish",$finish); } @Override protected void onExecute(Session session, XsObject root, XsObject current, LogicletContext ctx, ExecuteWatcher watcher) { String id = PropertiesConstants.transform(ctx,$id,""); if (StringUtils.isNotEmpty(id)){ String data = PropertiesConstants.getString(ctx,id,""); if (StringUtils.isNotEmpty(data)) { RemoteEndpoint.Basic basic = session.getBasicRemote(); try { byte[] bytes = Base64.decode(data); basic.sendBinary(ByteBuffer.wrap(bytes),PropertiesConstants.transform(ctx, $finish, true)); } catch (Exception ex) { log("Failed to send message to remote endpoint:" + ex.getMessage()); } } } } } /** * 发送Ping数据 */ public static class SendPing extends Operation{ protected String $id; public SendPing(String tag, Logiclet p) { super(tag, p); } @Override public void configure(Properties props){ super.configure(props); $id = PropertiesConstants.getRaw(props,"id",""); } @Override protected void onExecute(Session session, XsObject root, XsObject current, LogicletContext ctx, ExecuteWatcher watcher) { String id = PropertiesConstants.transform(ctx,$id,""); if (StringUtils.isNotEmpty(id)){ String data = PropertiesConstants.getString(ctx,id,""); if (StringUtils.isNotEmpty(data)) { RemoteEndpoint.Basic basic = session.getBasicRemote(); try { byte[] bytes = Base64.decode(data); basic.sendPing(ByteBuffer.wrap(bytes)); } catch (Exception ex) { log("Failed to send ping to remote endpoint:" + ex.getMessage()); } } } } } /** * 发送Pong数据 */ public static class SendPong extends Operation{ protected String $id; public SendPong(String tag, Logiclet p) { super(tag, p); } @Override public void configure(Properties props){ super.configure(props); $id = PropertiesConstants.getRaw(props,"id",""); } @Override protected void onExecute(Session session, XsObject root, XsObject current, LogicletContext ctx, ExecuteWatcher watcher) { String id = PropertiesConstants.transform(ctx,$id,""); if (StringUtils.isNotEmpty(id)){ String data = PropertiesConstants.getString(ctx,id,""); if (StringUtils.isNotEmpty(data)) { RemoteEndpoint.Basic basic = session.getBasicRemote(); try { byte[] bytes = Base64.decode(data); basic.sendPong(ByteBuffer.wrap(bytes)); } catch (Exception ex) { log("Failed to send ping to remote endpoint:" + ex.getMessage()); } } } } } /** * 发送Pong数据 */ public static class SendClose extends Operation{ protected String $status; protected String $reason; public SendClose(String tag, Logiclet p) { super(tag, p); } @Override public void configure(Properties props){ super.configure(props); $status = PropertiesConstants.getRaw(props,"status",""); $reason = PropertiesConstants.getRaw(props,"reason",""); } @Override protected void onExecute(Session session, XsObject root, XsObject current, LogicletContext ctx, ExecuteWatcher watcher) { int status = PropertiesConstants.getInt(ctx,$status,0); try { if (status >= 1000 && status <= 4999) { CloseReason.CloseCode closeCode = CloseReason.CloseCodes.getCloseCode(status); session.close(new CloseReason(closeCode,PropertiesConstants.transform(ctx,$reason,""))); }else{ session.close(); } } catch (Exception ex) { log("Failed to close remote endpoint:" + ex.getMessage()); } } } }




© 2015 - 2025 Weber Informatics LLC | Privacy Policy