diff --git a/websocket_fdddf/README.md b/websocket_fdddf/README.md new file mode 100644 index 000000000..dbb2fd30d --- /dev/null +++ b/websocket_fdddf/README.md @@ -0,0 +1,41 @@ +# websocket +IDE前后端使用websocket通信,后端主动可以向前端发送消息 + +## 逻辑详情 + +### registerMessageHandler + +注册消息处理逻辑函数。 + +入参: Function +出参: Boolean 无意义 + +### sendMessage + +向订阅的/topic/common发送消息,但不调用上述注册的逻辑函数 + +入参: CommonRequestMessage +出参: Boolean 无意义 + + +CommonRequestMessage结构: +- content: String 消息内容 +- userId: Long 发送者id + +CommonReplyMessage结构 +- content: String 消息内容 +- userId: Long 发送者id + +## 使用步骤说明 + +1. 应用引用依赖库 +2. 无需配置应用配置参数 +3. 逻辑调用示例截图 + +![](Snipaste_2024-10-20_16-45-59.jpg) + + +## 应用演示链接 + +[使用了本依赖库的制品应用链接] +https://dev-websocket-qa.app.codewave.163.com/dashboard/testwebsocket \ No newline at end of file diff --git a/websocket_fdddf/Snipaste_2024-10-20_16-45-59.jpg b/websocket_fdddf/Snipaste_2024-10-20_16-45-59.jpg new file mode 100644 index 000000000..5c31d6aee Binary files /dev/null and b/websocket_fdddf/Snipaste_2024-10-20_16-45-59.jpg differ diff --git a/websocket_fdddf/jar/nasl-metadata-collector-0.8.0.jar b/websocket_fdddf/jar/nasl-metadata-collector-0.8.0.jar new file mode 100644 index 000000000..fffde156d Binary files /dev/null and b/websocket_fdddf/jar/nasl-metadata-collector-0.8.0.jar differ diff --git a/websocket_fdddf/jar/nasl-metadata-maven-plugin-1.3.0/install.bat b/websocket_fdddf/jar/nasl-metadata-maven-plugin-1.3.0/install.bat new file mode 100644 index 000000000..a01a75d94 --- /dev/null +++ b/websocket_fdddf/jar/nasl-metadata-maven-plugin-1.3.0/install.bat @@ -0,0 +1 @@ +mvn install:install-file -Dfile="nasl-metadata-maven-plugin-1.3.0.jar" -DpomFile="pom.xml" \ No newline at end of file diff --git a/websocket_fdddf/jar/nasl-metadata-maven-plugin-1.3.0/install.sh b/websocket_fdddf/jar/nasl-metadata-maven-plugin-1.3.0/install.sh new file mode 100644 index 000000000..a01a75d94 --- /dev/null +++ b/websocket_fdddf/jar/nasl-metadata-maven-plugin-1.3.0/install.sh @@ -0,0 +1 @@ +mvn install:install-file -Dfile="nasl-metadata-maven-plugin-1.3.0.jar" -DpomFile="pom.xml" \ No newline at end of file diff --git a/websocket_fdddf/jar/nasl-metadata-maven-plugin-1.3.0/nasl-metadata-maven-plugin-1.3.0.jar b/websocket_fdddf/jar/nasl-metadata-maven-plugin-1.3.0/nasl-metadata-maven-plugin-1.3.0.jar new file mode 100644 index 000000000..0eaf1ec67 Binary files /dev/null and b/websocket_fdddf/jar/nasl-metadata-maven-plugin-1.3.0/nasl-metadata-maven-plugin-1.3.0.jar differ diff --git a/websocket_fdddf/jar/nasl-metadata-maven-plugin-1.3.0/pom.xml b/websocket_fdddf/jar/nasl-metadata-maven-plugin-1.3.0/pom.xml new file mode 100644 index 000000000..642d8f6b1 --- /dev/null +++ b/websocket_fdddf/jar/nasl-metadata-maven-plugin-1.3.0/pom.xml @@ -0,0 +1,74 @@ + + 4.0.0 + + com.netease.lowcode + nasl-metadata-maven-plugin + 1.3.0 + maven-plugin + + Nasl Metadata Maven Plugin + + UTF-8 + + + + + org.apache.maven + maven-plugin-api + 2.0 + + + org.apache.maven + maven-project + 2.0.10 + + + org.apache.maven.plugin-tools + maven-plugin-annotations + 3.2 + provided + + + org.codehaus.plexus + plexus-compiler-manager + 2.8.4 + + + org.codehaus.plexus + plexus-utils + 3.0.8 + + + org.apache.maven.shared + maven-common-artifact-filters + 3.0.1 + + + + org.apache.maven + maven-aether-provider + 3.3.9 + + + + org.eclipse.aether + aether-api + 1.1.0 + + + + + + + org.apache.maven.plugins + maven-plugin-plugin + 3.2 + + nasl-metadata-maven-plugin + true + + + + + diff --git a/websocket_fdddf/pom.xml b/websocket_fdddf/pom.xml new file mode 100644 index 000000000..62d0ab030 --- /dev/null +++ b/websocket_fdddf/pom.xml @@ -0,0 +1,78 @@ + + + 4.0.0 + + org.springframework.boot + spring-boot-starter-parent + 2.2.9.RELEASE + + + + fdddf + websocket + websocket + websocket依赖库,支持STOMP协议 + 1.0.6 + + + 8 + 8 + UTF-8 + 3.3 + + + + + nasl-metadata-collector + com.netease.lowcode + 0.8.0 + true + system + ${project.basedir}/jar/nasl-metadata-collector-0.8.0.jar + + + com.fasterxml.jackson.core + jackson-databind + ${jackson.version} + + + org.slf4j + slf4j-api + provided + + + + org.springframework.boot + spring-boot-starter-web + provided + + + org.springframework.boot + spring-boot-starter-websocket + + + + + + com.netease.lowcode + nasl-metadata-maven-plugin + 1.3.0 + + false + + + + + archive + + + + + + + \ No newline at end of file diff --git a/websocket_fdddf/src/main/java/com/fdddf/websocket/LibraryAutoScan.java b/websocket_fdddf/src/main/java/com/fdddf/websocket/LibraryAutoScan.java new file mode 100644 index 000000000..a75f568b1 --- /dev/null +++ b/websocket_fdddf/src/main/java/com/fdddf/websocket/LibraryAutoScan.java @@ -0,0 +1,8 @@ +package com.fdddf.websocket; + +/** + * 依赖库自动扫描类 + * @author system + */ +public class LibraryAutoScan { +} diff --git a/websocket_fdddf/src/main/java/com/fdddf/websocket/MessagingStompWebsocketApplication.java b/websocket_fdddf/src/main/java/com/fdddf/websocket/MessagingStompWebsocketApplication.java new file mode 100644 index 000000000..33666b737 --- /dev/null +++ b/websocket_fdddf/src/main/java/com/fdddf/websocket/MessagingStompWebsocketApplication.java @@ -0,0 +1,11 @@ +package com.fdddf.websocket; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class MessagingStompWebsocketApplication { + public static void main(String[] args) { + SpringApplication.run(MessagingStompWebsocketApplication.class, args); + } +} diff --git a/websocket_fdddf/src/main/java/com/fdddf/websocket/WebsocketBasicSpringEnvironmentConfiguration.java b/websocket_fdddf/src/main/java/com/fdddf/websocket/WebsocketBasicSpringEnvironmentConfiguration.java new file mode 100644 index 000000000..11ca9ab6e --- /dev/null +++ b/websocket_fdddf/src/main/java/com/fdddf/websocket/WebsocketBasicSpringEnvironmentConfiguration.java @@ -0,0 +1,12 @@ +package com.fdddf.websocket; + +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; + +/** + * 加入spring环境配置(在spring.factories中指定) + */ +@Configuration +@ComponentScan(basePackageClasses = LibraryAutoScan.class) +public class WebsocketBasicSpringEnvironmentConfiguration { +} diff --git a/websocket_fdddf/src/main/java/com/fdddf/websocket/WebsocketException.java b/websocket_fdddf/src/main/java/com/fdddf/websocket/WebsocketException.java new file mode 100644 index 000000000..07bbd88ca --- /dev/null +++ b/websocket_fdddf/src/main/java/com/fdddf/websocket/WebsocketException.java @@ -0,0 +1,14 @@ +package com.fdddf.websocket; + +public class WebsocketException extends RuntimeException { + private static final long serialVersionUID = 1L; + public WebsocketException(String message) { + super(message); + } + public WebsocketException(String message, Throwable cause) { + super(message, cause); + } + public WebsocketException(Throwable cause) { + super(cause); + } +} diff --git a/websocket_fdddf/src/main/java/com/fdddf/websocket/config/WebSocketConfig.java b/websocket_fdddf/src/main/java/com/fdddf/websocket/config/WebSocketConfig.java new file mode 100644 index 000000000..43127f043 --- /dev/null +++ b/websocket_fdddf/src/main/java/com/fdddf/websocket/config/WebSocketConfig.java @@ -0,0 +1,32 @@ +package com.fdddf.websocket.config; + +import com.netease.lowcode.core.EnvironmentType; +import com.netease.lowcode.core.annotation.Environment; +import com.netease.lowcode.core.annotation.NaslConfiguration; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.messaging.simp.config.MessageBrokerRegistry; +import org.springframework.web.socket.config.annotation.EnableWebSocketMessageBroker; +import org.springframework.web.socket.config.annotation.StompEndpointRegistry; +import org.springframework.web.socket.config.annotation.WebSocketMessageBrokerConfigurer; +import org.springframework.web.socket.server.standard.ServerEndpointExporter; + +@Configuration +@EnableWebSocketMessageBroker +public class WebSocketConfig implements WebSocketMessageBrokerConfigurer { + + @Override + public void configureMessageBroker(MessageBrokerRegistry config) { + config.enableSimpleBroker("/topic"); + config.setApplicationDestinationPrefixes("/app"); + } + + @Override + public void registerStompEndpoints(StompEndpointRegistry registry) { + registry.addEndpoint("/ws") + .setAllowedOrigins("*"); + } + +} \ No newline at end of file diff --git a/websocket_fdddf/src/main/java/com/fdddf/websocket/controller/MessageController.java b/websocket_fdddf/src/main/java/com/fdddf/websocket/controller/MessageController.java new file mode 100644 index 000000000..086ee20aa --- /dev/null +++ b/websocket_fdddf/src/main/java/com/fdddf/websocket/controller/MessageController.java @@ -0,0 +1,55 @@ +package com.fdddf.websocket.controller; + +import com.fdddf.websocket.service.*; +import com.netease.lowcode.core.annotation.NaslLogic; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.messaging.handler.annotation.MessageMapping; +import org.springframework.messaging.handler.annotation.SendTo; +import org.springframework.messaging.simp.SimpMessagingTemplate; +import org.springframework.stereotype.Component; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; + +import java.util.function.Function; + +@Component +@Controller +public class MessageController { + @MessageMapping("/common") + @SendTo("/topic/common") + public CommonReplyMessage reply(CommonRequestMessage message) { + Function handler = Register.getMessageHandler(); + if (handler == null) { + return new CommonReplyMessage("No handler found to process message: "+ message.content, message.userId); + } + return handler.apply(message); + } + + @Autowired + private SimpMessagingTemplate template; + + /** + * 向/topic/common发送消息 [测试用] + * @param message CommonRequestMessage + * @return CommonRequestMessage + */ + @ResponseBody + @RequestMapping(value = "/sendMessage", method = RequestMethod.POST) + public CommonRequestMessage testSendMessage(@RequestBody CommonRequestMessage message) + { + this.template.convertAndSend("/topic/common", message); + return message; + } + + /** + * 向/topic/common发送消息 + * @param body CommonRequestMessage + * @return Boolean + */ + @NaslLogic + public Boolean sendMessage(CommonRequestMessage body) + { + this.template.convertAndSend("/topic/common", body); + return true; + } +} diff --git a/websocket_fdddf/src/main/java/com/fdddf/websocket/service/CommonReplyMessage.java b/websocket_fdddf/src/main/java/com/fdddf/websocket/service/CommonReplyMessage.java new file mode 100644 index 000000000..3dd107c96 --- /dev/null +++ b/websocket_fdddf/src/main/java/com/fdddf/websocket/service/CommonReplyMessage.java @@ -0,0 +1,25 @@ +package com.fdddf.websocket.service; + +import com.netease.lowcode.core.annotation.NaslStructure; + +@NaslStructure +public class CommonReplyMessage { + /** + * 消息内容 + */ + public String content; + + /** + * 发送者id + */ + public Long userId; + + public CommonReplyMessage() {} + + public CommonReplyMessage(String content, Long userId) + { + this.content = content; + this.userId = userId; + } +} + diff --git a/websocket_fdddf/src/main/java/com/fdddf/websocket/service/CommonRequestMessage.java b/websocket_fdddf/src/main/java/com/fdddf/websocket/service/CommonRequestMessage.java new file mode 100644 index 000000000..5dae3558e --- /dev/null +++ b/websocket_fdddf/src/main/java/com/fdddf/websocket/service/CommonRequestMessage.java @@ -0,0 +1,23 @@ +package com.fdddf.websocket.service; + +import com.netease.lowcode.core.annotation.NaslStructure; + +@NaslStructure +public class CommonRequestMessage { + /** + * 消息内容 + */ + public String content; + + /** + * 发送者id + */ + public Long userId; + + public CommonRequestMessage() {} + + public CommonRequestMessage(String message, long userId) { + this.content = message; + this.userId = userId; + } +} diff --git a/websocket_fdddf/src/main/java/com/fdddf/websocket/service/Register.java b/websocket_fdddf/src/main/java/com/fdddf/websocket/service/Register.java new file mode 100644 index 000000000..49eb243e3 --- /dev/null +++ b/websocket_fdddf/src/main/java/com/fdddf/websocket/service/Register.java @@ -0,0 +1,27 @@ +package com.fdddf.websocket.service; + +import com.netease.lowcode.core.annotation.NaslLogic; +import org.springframework.stereotype.Component; + +import java.util.function.Function; + +@Component +public class Register { + private static Function messageHandler; + + /** + * 注册消息处理函数 + * @param messageHandler 消息处理函数 + * @return 是否注册成功 + */ + @NaslLogic + public Boolean registerMessageHandler(Function messageHandler) + { + Register.messageHandler = messageHandler; + return true; + } + + public static Function getMessageHandler() { + return messageHandler; + } +} diff --git a/websocket_fdddf/src/main/resources/META-INF/spring.factories b/websocket_fdddf/src/main/resources/META-INF/spring.factories new file mode 100644 index 000000000..8ef9e0771 --- /dev/null +++ b/websocket_fdddf/src/main/resources/META-INF/spring.factories @@ -0,0 +1,2 @@ +org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ +com.fdddf.websocket.WebsocketBasicSpringEnvironmentConfiguration \ No newline at end of file diff --git a/websocket_fdddf/src/main/resources/application.yml b/websocket_fdddf/src/main/resources/application.yml new file mode 100644 index 000000000..91f2f8379 --- /dev/null +++ b/websocket_fdddf/src/main/resources/application.yml @@ -0,0 +1,3 @@ +server: + port: 9090 + diff --git a/websocket_fdddf/src/main/resources/static/app.js b/websocket_fdddf/src/main/resources/static/app.js new file mode 100644 index 000000000..ffa23f506 --- /dev/null +++ b/websocket_fdddf/src/main/resources/static/app.js @@ -0,0 +1,72 @@ +const stompClient = new StompJs.Client({ + brokerURL: 'ws://localhost:9090/ws' +}); + +stompClient.onConnect = (frame) => { + setConnected(true); + console.log('Connected: ' + frame); + stompClient.subscribe('/topic/greetings', (greeting) => { + showGreeting(JSON.parse(greeting.body).content); + }); + stompClient.subscribe('/topic/common', (common) => { + let data = JSON.parse(common.body) + $('#common').append(data.userId + ': ' + data.content + '
') + }); +}; + +stompClient.onWebSocketError = (error) => { + console.error('Error with websocket', error); +}; + +stompClient.onStompError = (frame) => { + console.error('Broker reported error: ' + frame.headers['message']); + console.error('Additional details: ' + frame.body); +}; + +function setConnected(connected) { + $("#connect").prop("disabled", connected); + $("#disconnect").prop("disabled", !connected); + if (connected) { + $("#conversation").show(); + } + else { + $("#conversation").hide(); + } + $("#greetings").html(""); +} + +function connect() { + stompClient.activate(); +} + +function disconnect() { + stompClient.deactivate(); + setConnected(false); + console.log("Disconnected"); +} + +function sendName() { + stompClient.publish({ + destination: "/app/hello", + body: JSON.stringify({'name': $("#name").val()}) + }); +} + +function sendCommon() { + stompClient.publish({ + destination: "/app/common", + body: JSON.stringify({'content': $("#message").val(), 'userId': 1}) + }); +} + +function showGreeting(message) { + $("#greetings").append("" + message + ""); +} + +$(function () { + $("form").on('submit', (e) => e.preventDefault()); + $( "#connect" ).click(() => connect()); + $( "#disconnect" ).click(() => disconnect()); + $( "#send" ).click(() => sendName()); + $( "#sendCommon" ).click(() => sendCommon()); +}); \ No newline at end of file diff --git a/websocket_fdddf/src/main/resources/static/index.html b/websocket_fdddf/src/main/resources/static/index.html new file mode 100644 index 000000000..11fb40853 --- /dev/null +++ b/websocket_fdddf/src/main/resources/static/index.html @@ -0,0 +1,64 @@ + + + + Hello WebSocket + + + + + + + + +
+
+
+
+
+ + + +
+
+
+
+
+
+ + +
+ +
+
+
+
+
+
+
+ + +
+ +
+
+
+
+
+ + + + + + + + +
Greetings
+
+
+
+
+ + \ No newline at end of file diff --git "a/websocket_fdddf/\344\276\235\350\265\226\345\272\223\344\275\277\347\224\250\346\226\207\346\241\243\350\257\264\346\230\216.docx" "b/websocket_fdddf/\344\276\235\350\265\226\345\272\223\344\275\277\347\224\250\346\226\207\346\241\243\350\257\264\346\230\216.docx" new file mode 100644 index 000000000..b77823ada Binary files /dev/null and "b/websocket_fdddf/\344\276\235\350\265\226\345\272\223\344\275\277\347\224\250\346\226\207\346\241\243\350\257\264\346\230\216.docx" differ