使用Java进行WebSocket客户端开发
最编程
2024-08-09 07:16:45
...
使用java中Java-WebSocket做客户端
pom文件
<!-- 实际使用包 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
<!--websocket作为客户端-->
<dependency>
<groupId>org.java-websocket</groupId>
<artifactId>Java-WebSocket</artifactId>
<version>1.3.5</version>
</dependency>
客户端实现
package com.xie.websocket;
import com.alibaba.fastjson.JSONArray;
import lombok.extern.slf4j.Slf4j;
import javax.websocket.*;
import java.io.IOException;
/**
* @Description WebSocket Client
* @Date 2022-03-31 15:35
* @Author xie
*/
@Slf4j
@ClientEndpoint()
public class WebSocketClient {
// 业务service
private TestService testService = (TestService) ApplicationContextHandle.getBean(TestService.class);
private WebSocketStart webSocketStart = (WebSocketStart) ApplicationContextHandle.getBean(WebSocketStart.class);
@OnOpen
public void onOpen(Session session) {
log.info("客户端建立连接......");
}
@OnMessage
public void onMessage(Session session, String message) {
try {
log.info("客户端收到消息:{}......", message);
// 转化为自己bean对象
TestData data = JSONArray.parseObject(message, TestData.class);
// 处理数据
processData(data);
} catch (Exception e) {
e.printStackTrace();
}
}
@OnClose
public void onClose() {
log.info("与服务器端断开连接......");
try {
log.info("开始尝试重新连接......");
webSocketStart.start();
} catch (Exception e) {
e.printStackTrace();
log.info("重新连接失败,请检查网络!");
}
}
private static void sendMsg(Session session, String msg) throws IOException {
session.getBasicRemote().sendText(msg);
}
@OnError
public void onError(Session session, Throwable error){
log.error("发生错误......");
error.printStackTrace();
}
/**
* 处理数据
*/
private void processData(TestData data) {
/**
* 处理数据。。。。
*/
testService.batchSaveTestData(data);
}
}
package com.xie.websocket;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.context.annotation.Configuration;
/**
* @Description: Application 上下文
**/
@Configuration
public class ApplicationContextHandle implements ApplicationContextAware {
private static ApplicationContext applicationContext;
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
ApplicationContextHandle.applicationContext = applicationContext;
}
public static Object getBean(Class c) throws BeansException {
return applicationContext.getBean(c);
}
// 获取当前环境
public static String getActiveProfile() {
return applicationContext.getEnvironment().getActiveProfiles()[0];
}
}
维持监控连接
package com.xie.websocket;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import javax.websocket.ContainerProvider;
import javax.websocket.Session;
import javax.websocket.WebSocketContainer;
import java.io.IOException;
import java.net.URI;
/**
* @Description
* @Date 2022-03-31 15:43
* @Author xie
*/
@Slf4j
@Component
public class WebSocketStart {
@Value("${xx.xx.websocket.uri}")
private String uri;
private static Session session;
/**
* 消息发送事件
*/
private static long date;
private void connect() {
WebSocketContainer container = null;
try {
container = ContainerProvider.getWebSocketContainer();
URI r = URI.create(uri);
session = container.connectToServer(WebSocketClient.class, r);
} catch (Exception e) {
e.printStackTrace();
}
}
public void start() {
connect();
new Thread(new KeepAlive()).start();
try {
for (int i = 0; i < 5; i++) {
/**
*注意:此处对session做了同步处理,
* 因为下文中发送心跳包也是用的此session,
* 不用synchronized做同步处理会报
* Exception in thread "Thread-5" java.lang.IllegalStateException: The remote endpoint was in state [TEXT_FULL_WRITING] which is an invalid state for called method
* 错误
*/
synchronized (WebSocketStart.session) {
WebSocketStart.session.getBasicRemote().sendText("javaclient");
}
date = System.currentTimeMillis();
Thread.sleep(30000);
}
} catch (Exception e) {
log.info("客户端出错......");
e.printStackTrace();
}
}
/**
* 内部类,用来客户端给服务单发送心跳包维持连接
*/
class KeepAlive implements Runnable {
@Override
public void run() {
while (true) {
if (System.currentTimeMillis() - date > 30000) {
try {
log.info("发送心跳包......");
synchronized (WebSocketStart.session) {
WebSocketStart.session.getBasicRemote().sendText("keepalive");
}
date = System.currentTimeMillis();
} catch (IOException e) {
log.info("维持心跳包出錯......");
e.printStackTrace();
}
} else {
try {
Thread.sleep(30000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
}
原文地址:https://www.cnblogs.com/mask-xiexie/p/16082239.html
推荐阅读
-
使用Java进行文件压缩和解压缩操作
-
Java 8新特性探究(十三)JavaFX 8新特性以及开发2048游戏-JavaFX历史## 跟java在服务器端和web端成绩相比,桌面一直是java的软肋,于是Sun公司在2008年推出JavaFX,弥补桌面软件的缺陷,请看下图JavaFX一路走过来的改进 从上图看出,一开始推出时候,开发者需使用一种名为JavaFX Script的静态的、声明式的编程语言来开发JavaFX应用程序。因为JavaFX Script将会被编译为Java bytecode,程序员可以使用Java代码代替。 JavaFX 2.0之后的版本摒弃了JavaFX Script语言,而作为一个Java API来使用。因此使用JavaFX平台实现的应用程序将直接通过标准Java代码来实现。 JavaFX 2.0 包含非常丰富的 UI 控件、图形和多媒体特性用于简化可视化应用的开发,WebView可直接在应用中嵌入网页;另外 2.0 版本允许使用 FXML 进行 UI 定义,这是一个脚本化基于 XML 的标识语言。 从JDK 7u6开始,JavaFx就与JDK捆绑在一起了,JavaFX团队称,下一个版本将是8.0,目前所有的工作都已经围绕8.0库进行。这是因为JavaFX将捆绑在Java 8中,因此该团队决定跳过几个版本号,迎头赶上Java 8。 ##JavaFx8的新特性 ## ###全新现代主题:Modena 新的Modena主题来替换原来的Caspian主题。不过在Application的start方法中,可以通过setUserAgentStylesheet(STYLESHEET_CASPIAN)来继续使用Caspian主题。 参考http://fxexperience.com/2013/03/modena-theme-update/ ###JavaFX 3D 在JavaFX8中提供了3D图像处理API,包括Shape3D (Box, Cylinder, MeshView, Sphere子类),SubScene, Material, PickResult, LightBase (AmbientLight 和PointLight子类),SceneAntialiasing等。Camera类也得到了更新。从JavaDoc中可以找到更多信息。 ###富文本 强化了富文本的支持 ###TreeTableView ###日期控件DatePicker 增加日期控件 ###用于 CSS 结构的公共 API
-
使用RSA 2048位密钥对进行前端jsencrypt公钥加密和后端Java私钥解密
-
压缩Cesium中的模型使用Draco技术进行开发
-
使用Qt进行iOS平台上的跨平台APP开发
-
使用 C# Net Core 使用 ClientWebSocket 实现 WebSocket 客户端的方法 或 C# Net Core 实现 WebSocket 客户端的方法:使用 ClientWebSocket
-
W5500开发笔记 | 02 - 使用W5500 Socket API 建立TCP服务端、TCP客户端-3. 实现代码
-
身为java开发人员的你,一定得好好看看这份关于反射的使用总结
-
使用Java进行3D建模的实现
-
使用apktool和java_apktool进行APK反编译的方法