stomp java客户端_Stomp-Spring服务器端的Web套接字Java客户端

stomp java客户端

问题:

为了分析问题,我不得不编写一个简单的Java Web套接字客户端站点代码,并使用基于stomp的Web套接字代理连接到服务器端基于Spring的应用程序。

解决方案:

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.rnd</groupId><artifactId>SockWebsocketClient</artifactId><version>1.0-SNAPSHOT</version><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.0.3.RELEASE</version></parent><dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-messaging</artifactId><version>5.0.7.RELEASE</version></dependency><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.9.5</version></dependency><dependency><groupId>org.apache.tomcat.embed</groupId><artifactId>tomcat-embed-websocket</artifactId><version>9.0.8</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-dependencies</artifactId><version>2.0.2.RELEASE</version><type>pom</type></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.0.7.RELEASE</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-websocket</artifactId><version>5.0.7.RELEASE</version></dependency></dependencies>
</project>

Sock JS客户端

它是主要的班级,是做基础工作的简单班级。 由于当今大多数Web套接字都打算使用SSL,因此尝试通过创建虚拟TrustManager来传递信任管理器问题。

此代码的输入是您要订阅的主题字符串。

另外,不要在运行前更改代码中的<URL>字符串,指向您的Web套接字url。

package com.client;import org.springframework.messaging.Message;
import org.springframework.messaging.MessageHeaders;
import org.springframework.messaging.converter.MessageConverter;
import org.springframework.messaging.converter.SimpleMessageConverter;
import org.springframework.messaging.converter.StringMessageConverter;
import org.springframework.messaging.simp.stomp.StompHeaders;
import org.springframework.web.socket.WebSocketHttpHeaders;
import org.springframework.web.socket.client.standard.StandardWebSocketClient;
import org.springframework.web.socket.messaging.WebSocketStompClient;
import org.springframework.web.socket.sockjs.client.Transport;
import org.springframework.web.socket.sockjs.client.WebSocketTransport;
import org.springframework.web.socket.sockjs.frame.Jackson2SockJsMessageCodec;import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;
import java.net.URI;
import java.security.KeyManagementException;
import java.security.NoSuchAlgorithmException;
import java.security.cert.X509Certificate;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;public class SockJsClient {public static void main(String[] args) {try {StandardWebSocketClient simpleWebSocketClient = new StandardWebSocketClient();TrustManager[] trustAllCerts = new TrustManager[] {new X509TrustManager() {public X509Certificate[] getAcceptedIssuers() {return null;}public void checkClientTrusted(X509Certificate[] certs, String authType) {}public void checkServerTrusted(X509Certificate[] certs, String authType) {}}};SSLContext sc = SSLContext.getInstance("SSL");sc.init(null, trustAllCerts, new java.security.SecureRandom());HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());Map<String, Object> properties = new HashMap<>();properties.put("org.apache.tomcat.websocket.SSL_CONTEXT", sc);simpleWebSocketClient.setUserProperties(properties);List<Transport> transports = new ArrayList();transports.add(new WebSocketTransport(simpleWebSocketClient));org.springframework.web.socket.sockjs.client.SockJsClient sockJsClient = new org.springframework.web.socket.sockjs.client.SockJsClient(transports);sockJsClient.setMessageCodec(new Jackson2SockJsMessageCodec());WebSocketStompClient stompClient = new WebSocketStompClient(sockJsClient);stompClient.setMessageConverter(new MessageConverter() {@Overridepublic Object fromMessage(Message<?> message, Class<?> aClass) {return new String((byte[])message.getPayload());}@Overridepublic Message<?> toMessage(Object o, MessageHeaders messageHeaders) {return null;}});// url : pointing to websocket as sockJs first tries to get info by sending a HTTP request// and then sends an upgrade request to ws or wss. So your url should be some thing like htttp://URI stompUrlEndpoint = new URI("<url>");WebSocketHttpHeaders handshakeHeaders = new WebSocketHttpHeaders();StompHeaders connectHeaders = new StompHeaders();/*Can set connection header like login , passcode in connectHeaders  */stompClient.connect(stompUrlEndpoint.toString(), handshakeHeaders, connectHeaders, new SessionHandler(args[0]), new Object[0]);Thread.sleep(30000);stompClient.stop();} catch (Exception e) {e.printStackTrace();}}
}

会话处理程序

每个套接字连接都需要一个会话处理程序,这里是一个用于处理连接设置和传入消息的会话处理程序。

package com.client;import org.springframework.messaging.simp.stomp.StompCommand;
import org.springframework.messaging.simp.stomp.StompFrameHandler;
import org.springframework.messaging.simp.stomp.StompHeaders;
import org.springframework.messaging.simp.stomp.StompSession;
import org.springframework.messaging.simp.stomp.StompSessionHandlerAdapter;import java.lang.reflect.Type;public class SessionHandler extends StompSessionHandlerAdapter {private final String topicName ;public SessionHandler(String topicName) {this.topicName = topicName;}@Overridepublic void afterConnected(StompSession session, StompHeaders connectedHeaders) {this.subscribeTo(session);}@Overridepublic void handleException(StompSession session,StompCommand command,StompHeaders headers,byte[] payload,Throwable exception ) {exception.printStackTrace();}public void handleFrame(StompHeaders headers, Object payload) {System.out.println(payload.toString());}@Overridepublic void handleTransportError(StompSession session, Throwable exception) {exception.printStackTrace();}private void subscribeTo(StompSession session) {StompHeaders headers = new StompHeaders();headers.add("id","websocket-session-standalone-0");headers.add("destination",topicName);session.subscribe(headers, new StompFrameHandler() {@Overridepublic Type getPayloadType(StompHeaders stompHeaders) {return String.class;}@Overridepublic void handleFrame(StompHeaders stompHeaders, Object o) {System.out.println( " Message is " +o.toString());}});}
}

翻译自: https://www.javacodegeeks.com/2019/08/web-socket-java-client-stomp-spring-server-side.html

stomp java客户端

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/331949.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

tf.metrics._将指标标签与MicroProfile Metrics 2.0一起使用

tf.metrics.从我们的应用程序发出的与业务相关的度量标准可能包含要为其测量特定度量标准的参数&#xff08;即标签或标签 &#xff09;。 从MicroProfile Metrics 2.0开始&#xff0c;可以使用API​​将标签分配给特定的指标。 声明式方法 假设我们有以下资源&#xff1a; P…

ppt课堂流程图_除了直线能设计PPT,没想到曲线也实用,太赞了!

前几天在分享PPT设计的方法时&#xff0c;收到反馈&#xff0c;问这种曲线是如何设计以及怎么用&#xff1f;其实对于曲线&#xff0c;如果用好了比直线更加有效果&#xff0c;曲线本身自带动态效果&#xff0c;看一下。除此之外&#xff0c;曲线不仅可以用在PPT中&#xff0c;…

算法分析

【0】README 0.1&#xff09; 本文总结于 数据结构与算法分析&#xff1b;旨在了解 算法分析涉及到的数学基础、时间复杂度分析法则、和其它的一些法则 和 结论&#xff1b; 【1】 数学基础 1.1&#xff09;本书将使用以下4个定义&#xff1a; 对上述定义的分析&#xff0…

java文件端点续传效果图_Java单依赖性Dockerized HTTP端点

java文件端点续传效果图在本文中&#xff0c;我们将创建一个基于Java的HTTP端点&#xff0c;使用它创建一个可执行jar&#xff0c;将其打包在Docker中并立即在本地运行。 本文面向初学者&#xff0c;他们想要寻找一个简单的演练来在Docker中运行Java应用程序。 描述Dockerize…

立镖机器人浙江_立镖在美国获2020 NextGen供应链解决方案奖

Tompkins Robotics荣获2020 NextGen供应链解决方案提供商奖汤普金斯国际被《供应链管理评论》指定为机器人技术类获奖者2020年3月20日消息Tompkins International的业务部门 Tompkins Robotics被选为第二届年度NextGen供应链奖的获得者。汤普金斯机器人技术公司是《供应链管理…

final 实例域+final类+final方法(阻止继承)

【0】README 0.1&#xff09;本文描述源代码均 转自 core java volume 1&#xff0c; 旨在理清 “final 实例域”&#xff1b; 0.2&#xff09; 最后还增加了 阻止继承 的内容&#xff0c;涵盖了final类final方法&#xff1b; 0.3&#xff09; 引入了 内联 以及 即时编译器对…

java责任链设计模式_Java中的责任链设计模式

java责任链设计模式在本教程中&#xff0c;我们将学习如何在Java中实现责任链模式。 责任链设计模式涉及到拥有一系列负责处理请求的对象链。 当客户端发送请求时&#xff0c;第一个处理程序将尝试处理该请求。 如果可以处理&#xff0c;则请求处理在此结束。 但是&#xff0c…

机加工程序工时程序_团宠来袭 | 针对多品种小批量的机加工柔性生产解决方案...

“天下之至柔&#xff0c;驰骋天下之至坚。无有入于无间&#xff0c;吾是以知无为之有益。”老子指出&#xff0c;世间最柔弱的东西里面往往蓄着人们看不见的巨大力量&#xff0c;使得最坚强的东西也无法抵挡。就像水是最柔的东西&#xff0c;但却能穿透山地。柔性的力量不容小…

静态方法+工厂方法(静态方法用途)

【0】README 0.1&#xff09; 本文描述源代码均 转自 core java volume 1&#xff0c; 旨在了解 “静态方法”&#xff1b; 【1】静态方法相关 1.1&#xff09;静态方法是一种不能向对象实施操作的方法&#xff1b; 如&#xff0c;Math.pow(x, a)&#xff0c; 在运算时&#…

一致吗 驱动_iPhone 12无线充电真的香吗?

2020年10月14日凌晨1点&#xff0c;苹果发布会又来了&#xff0c;开场就是苹果CEO库克在总部贾伯斯剧院闪亮登场&#xff01;没错&#xff01;各位果粉心心念念的 iPhone 12 它走来了&#xff01;如之前爆料所言&#xff0c;本次发布会共推出了4款机型&#xff1a;iPhone 12 mi…

spring boot注释_Spring Boot中的@SpringBootConfiguration注释

spring boot注释Spring Boot中的 SpringBootConfiguration注释是一个类级别的注释&#xff0c;它指示此类提供了应用程序配置。 通常&#xff0c;具有main&#xff08;&#xff09;方法的类最适合此注释。 我们通常使用SpringBootApplication批注&#xff0c;该批注会自动继承…

selenium自动化测试_Selenium测试可实现有效的测试自动化

selenium自动化测试尽管移动应用程序的市场份额有大幅增长&#xff0c;但网络应用程序仍然具有大量的用户基础。 在部署之前&#xff0c;企业正在关注Web应用程序的质量。 这是测试发挥重要作用的地方。 与某些可以自动化的功能测试不同&#xff0c;UI测试仍然大部分是手动过程…

画时序图 visual_时序图的初步了解

1、划清边界&#xff0c;识别交互的语境所谓划清边界&#xff0c;就是要界定好自己所要画的时序图的范围&#xff0c;“学生在教务系统中查询其课程的成绩”就是所要绘制的时序图的交互内容&#xff0c;不用往上延伸到用户登录&#xff0c;也不要往下延伸到下载成绩单。识别交互…

java 初始化块

【0】README 0.1&#xff09; 本文描述源代码均 转自 core java volume 1&#xff0c; 旨在分享初始化块 or 静态初始化块的调用过程&#xff1b; 【1】初始化块相关 1.1&#xff09;前面讲过了 两种初始化数据域的方法&#xff1a; 在构造器中设置值 在声明中赋值&#xff…

简短介绍_中秋节的来历由来简短20字30字 中秋节的起源50字100字简介

中秋节是我国的传统佳节。按照史籍的记实&#xff0c;“中秋”一词最早呈此刻《周礼》一书中。小编整理了中秋节来历的简单介绍&#xff0c;既有二三十字的简要版&#xff0c;也有100字左右的介绍&#xff0c;让我们一起了解中秋节的起源吧。中秋节的来历由来简短20字中秋节起源…

java中的lombok_如何在Java中使用Lombok删除样板设置器吸气剂

java中的lombok你好朋友&#xff0c; 一次又一次反对Java的观点之一是&#xff0c;我们必须写很多样板 我们简单的POJO类的setter和getter形式的代码&#xff0c;不必要地增加了 我们代码的长度。 为了解决这个问题&#xff0c;有一个名为Project Lombok的开源项目可以解决这…

super 和 this 关键字的比较+调用构造器(this)+动态绑定

【0】README 0.1&#xff09; 本文描述源代码均 转自 core java volume 1&#xff0c; 旨在加深对 super 和 this关键字 的用法比较&#xff1b; 0.2&#xff09; 最后还补充了 多态和动态绑定 的定义 以及对动态绑定进行了详细分析&#xff0c;这两个定义给的非常棒&#xf…

修改表格字体颜色_word排版应用:如何创建文本样式和表格样式

样式&#xff0c;大家应该不陌生&#xff0c;在Word中是一个非常强大的功能&#xff0c;运用得好&#xff0c;可以节省很多时间和精力。但如果你不会用&#xff0c;关键时刻可以把你急哭了&#xff01;在前面的“Word样式&#xff0c;简单又实用&#xff01;”和“Word样式也有…

java流式传输对象_Java性能:面向教学与流式传输

java流式传输对象在for循环中向上或向下计数是最有效的迭代方式吗&#xff1f; 有时答案既不可行。 阅读这篇文章&#xff0c;了解不同迭代品种的影响。 迭代性能 关于如何以高性能进行迭代有很多观点。 Java中的传统迭代方式是一个for循环&#xff0c;该循环从零开始&#xf…

vue框架项目部署到服务器_在浏览器中在线尝试无服务器框架项目!

vue框架项目部署到服务器无服务器框架是无服务器工具的一致领导者。 但是&#xff0c;没有简单的方法可以在线试用无服务器框架项目。 您确实需要一个体面的开发人员设置&#xff0c;并且需要一些工作来设置sls &#xff0c; npm等。 确切地说&#xff0c;您确实做到了 –直到…