问题:

为了分析问题,我不得不编写一个简单的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客户端相关推荐

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

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

  2. Dart的套接字与web套接字

    套接字 首先在项目中建三个dart文件,如下图 main.dart中的代码如下 import 'dart:io'; import 'dart:convert';main(List<String& ...

  3. Java套接字程序_java – 通过Web套接字进行应用程序到应用程序的通信

    我通过Web套接字(没有浏览器工作)获得应用程序到应用程序的通信有些麻烦.由于这似乎不是最常用的网络套接字应用程序,我想知道是否有人有这方面的经验. 为什么我要使用网络套接字? 由于防火墙问题,我需要 ...

  4. java sendto,Android:套接字-java.net.SocketException:sendto失败:EPIPE(管道断开)

    我正在尝试使用套接字与服务器建立连接.连接管道损坏,如下所示. 01-31 14:47:16.536: W/System.err(27255): java.net.SocketException: s ...

  5. Socket套接字(Java)

    1.UDP数据报套接字 1.1.DatagramSocket API DatagramSocket 是 UDP Socket,用于发送和接收UDP数据报(DatagramPacket). 构造方法 构 ...

  6. 【Groovy】使用 Groovy 语言开发服务器 Server 和客户端 Client 套接字程序 ( 服务器客户端完整代码示例 | 运行服务器端与客户端效果及过程分析 )

    文章目录 一.服务器端完整代码 Server.groovy 二.客户端完整代码 Client.groovy 三.运行服务器端与客户端效果及过程分析 一.服务器端完整代码 Server.groovy 参 ...

  7. 02、Windows Phone 套接字(Socket)实战之服务器端设计

    这里主要写 PC 服务器端的逻辑,UI 使用的是 WPF,因为 WPF 比普通的 WinForm 的流式布局 更容易控制,而且比 WinForm 美观一些,显示截图: 一.页面 UI MainWind ...

  8. 【网络篇】第五篇——网络套接字编程(一)(socket详解)

    socket编程 套接字概念 数据传输方式 ip地址转换函数 socket常见API sockaddr数据结构 socket缓冲区以及阻塞模式 LINUX下socket程序的演示 socket编程 套 ...

  9. 利用套接字实现进程通信一例

    下面程序实现的功能是:客户端将从键盘输入的内容发送给服务器,然后服务器在将受到的数据原封不动的发给客户端. 先看看服务器端的程序: 1: /* 2: * ======================= ...

最新文章

  1. 自回归解码加速64倍,谷歌提出图像合成新模型MaskGIT
  2. AlwaysOn业务IP和高可用IP分开使用方案测试报告
  3. hostapd移植与使用
  4. SectionList的使用
  5. 8位数控分频器的设计_eda设计数控分频器(实现2~16)分频
  6. MDCC 2016:网易云信直击移动IM之痛
  7. 世界地球日主题班会PPT教学课件模板
  8. Excel中插入VBA宏处理
  9. Integer 中的缓存类IntegerCache
  10. C#LeetCode刷题之#485-最大连续1的个数(Max Consecutive Ones)
  11. 聊聊Socket、TCP/IP、HTTP、FTP及网络编程
  12. iOS camera 相关
  13. 使用yolo v3训练自己的模型
  14. cssci核心期刊(cssci核心期刊目录)
  15. 基于Unity的阿里云短信SDK接入流程
  16. c语言调用aida64温度,关于aida64软件cpu温度的问题
  17. 快速清理C盘的四个方法
  18. Oracle JDE R23更新快报
  19. 【LDO稳压器】SOT23-5封装-RT9193-RT9013-LP2992-LP5907设计
  20. 使用Java的Graphics类进行绘图

热门文章

  1. 洛谷P3845-球赛【离散化,贪心】
  2. The 2020 ICPC Asia Macau Regional Contest J. Jewel Grab(数颜色+链表)
  3. MySQL date_format()函数
  4. 数据库 - 事务管理(ACID)隔离级别 事务传播行为
  5. vue 动态修改路由参数
  6. JAVA数据库连接池实现
  7. ssm使用全注解实现增删改查案例——Emp
  8. 多线程三种同步方式(模拟银行取款)
  9. 集成Springboot----ElasticSearch
  10. linux软件可以在所有发行版运行吗,Linux通用的跨发行版的3大软件包管理器