Stomp-Spring服务器端的Web套接字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-Spring服务器端的Web套接字Java客户端相关推荐
- stomp java客户端_Stomp-Spring服务器端的Web套接字Java客户端
stomp java客户端 问题: 为了分析问题,我不得不编写一个简单的Java Web套接字客户端站点代码,并使用基于stomp的Web套接字代理连接到服务器端基于Spring的应用程序. 解决方案 ...
- Dart的套接字与web套接字
套接字 首先在项目中建三个dart文件,如下图 main.dart中的代码如下 import 'dart:io'; import 'dart:convert';main(List<String& ...
- Java套接字程序_java – 通过Web套接字进行应用程序到应用程序的通信
我通过Web套接字(没有浏览器工作)获得应用程序到应用程序的通信有些麻烦.由于这似乎不是最常用的网络套接字应用程序,我想知道是否有人有这方面的经验. 为什么我要使用网络套接字? 由于防火墙问题,我需要 ...
- java sendto,Android:套接字-java.net.SocketException:sendto失败:EPIPE(管道断开)
我正在尝试使用套接字与服务器建立连接.连接管道损坏,如下所示. 01-31 14:47:16.536: W/System.err(27255): java.net.SocketException: s ...
- Socket套接字(Java)
1.UDP数据报套接字 1.1.DatagramSocket API DatagramSocket 是 UDP Socket,用于发送和接收UDP数据报(DatagramPacket). 构造方法 构 ...
- 【Groovy】使用 Groovy 语言开发服务器 Server 和客户端 Client 套接字程序 ( 服务器客户端完整代码示例 | 运行服务器端与客户端效果及过程分析 )
文章目录 一.服务器端完整代码 Server.groovy 二.客户端完整代码 Client.groovy 三.运行服务器端与客户端效果及过程分析 一.服务器端完整代码 Server.groovy 参 ...
- 02、Windows Phone 套接字(Socket)实战之服务器端设计
这里主要写 PC 服务器端的逻辑,UI 使用的是 WPF,因为 WPF 比普通的 WinForm 的流式布局 更容易控制,而且比 WinForm 美观一些,显示截图: 一.页面 UI MainWind ...
- 【网络篇】第五篇——网络套接字编程(一)(socket详解)
socket编程 套接字概念 数据传输方式 ip地址转换函数 socket常见API sockaddr数据结构 socket缓冲区以及阻塞模式 LINUX下socket程序的演示 socket编程 套 ...
- 利用套接字实现进程通信一例
下面程序实现的功能是:客户端将从键盘输入的内容发送给服务器,然后服务器在将受到的数据原封不动的发给客户端. 先看看服务器端的程序: 1: /* 2: * ======================= ...
最新文章
- 自回归解码加速64倍,谷歌提出图像合成新模型MaskGIT
- AlwaysOn业务IP和高可用IP分开使用方案测试报告
- hostapd移植与使用
- SectionList的使用
- 8位数控分频器的设计_eda设计数控分频器(实现2~16)分频
- MDCC 2016:网易云信直击移动IM之痛
- 世界地球日主题班会PPT教学课件模板
- Excel中插入VBA宏处理
- Integer 中的缓存类IntegerCache
- C#LeetCode刷题之#485-最大连续1的个数(Max Consecutive Ones)
- 聊聊Socket、TCP/IP、HTTP、FTP及网络编程
- iOS camera 相关
- 使用yolo v3训练自己的模型
- cssci核心期刊(cssci核心期刊目录)
- 基于Unity的阿里云短信SDK接入流程
- c语言调用aida64温度,关于aida64软件cpu温度的问题
- 快速清理C盘的四个方法
- Oracle JDE R23更新快报
- 【LDO稳压器】SOT23-5封装-RT9193-RT9013-LP2992-LP5907设计
- 使用Java的Graphics类进行绘图
热门文章
- 洛谷P3845-球赛【离散化,贪心】
- The 2020 ICPC Asia Macau Regional Contest J. Jewel Grab(数颜色+链表)
- MySQL date_format()函数
- 数据库 - 事务管理(ACID)隔离级别 事务传播行为
- vue 动态修改路由参数
- JAVA数据库连接池实现
- ssm使用全注解实现增删改查案例——Emp
- 多线程三种同步方式(模拟银行取款)
- 集成Springboot----ElasticSearch
- linux软件可以在所有发行版运行吗,Linux通用的跨发行版的3大软件包管理器