java - Springboot jetty web socket客户端注解不起作用
问题描述
我用java springboot开发了web socket客户端。我在 build.gradle 上添加以下行时使用了 jetty websocket 库
compile group: 'org.eclipse.jetty.websocket', name: 'websocket-client', version: '9.4.12.v20180830'
我制作了如下所示的 Web 套接字事件处理程序 - SimpleEchoSocket.java。
package com.iimp.pom.socket;
import org.eclipse.jetty.websocket.api.Session;
import org.eclipse.jetty.websocket.api.annotations.OnWebSocketClose;
import org.eclipse.jetty.websocket.api.annotations.OnWebSocketConnect;
import org.eclipse.jetty.websocket.api.annotations.OnWebSocketMessage;
import org.eclipse.jetty.websocket.api.annotations.WebSocket;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;
@WebSocket(maxTextMessageSize = 64 * 1024)
public class SimpleEchoSocket{
private final CountDownLatch closeLatch;
@SuppressWarnings("unused")
private Session session;
public SimpleEchoSocket(){
this.closeLatch = new CountDownLatch(1);
}
public boolean awaitClose(int duration, TimeUnit unit) throws InterruptedException{
return this.closeLatch.await(duration,unit);
}
@OnWebSocketClose
public void onClose(int statusCode, String reason){
System.out.printf("Connection closed: %d - %s%n",statusCode,reason);
this.session = null;
this.closeLatch.countDown(); // trigger latch
}
@OnWebSocketConnect
public void onConnect(Session session){
System.out.printf("Got connect: %s%n",session);
this.session = session;
try{
// CommonGlobalVariable.webSocketSession = session;
Future<Void> fut;
fut = session.getRemote().sendStringByFuture("Hello");
fut.get(2,TimeUnit.SECONDS); // wait for send to complete.
}catch (Throwable t){
t.printStackTrace();
}
}
@OnWebSocketMessage
public void onMessage(String msg){
System.out.printf("Got msg: %s%n",msg);
}
}
另外,我制作了如下所示的连接部分。
String destUri = "ws://"+body.get("host").toString()+"/va?api-key="+body.get("apiKey").toString()+"&plate=img";
WebSocketClient client = new WebSocketClient();
SimpleEchoSocket socket = new SimpleEchoSocket();
client.start();
URI echoUri = new URI(destUri);
ClientUpgradeRequest requestws = new ClientUpgradeRequest();
requestws.setSubProtocols("va-metadata");
client.connect(socket,echoUri,requestws);
System.out.printf("Connecting to : %s%n",echoUri);
结果,我猜想成功连接到 web socket 服务器,因为我找到了来自服务器的日志。但是 @OnWebSocketConnect 注释方法中的代码不会被执行。
如何在 SimpleEchoSocket.java 中运行代码?
解决方案
我通过参考 Joakim 的评论弄清楚了。
我改变了 SimpleEchoSocket.java 如下所示。
@OnWebSocketConnect
public void onConnect(Session session){
System.out.printf("Got connect: %s%n",session);
this.session = session;
try{
// CommonGlobalVariable.webSocketSession = session;
// Future<Void> fut;
// fut = session.getRemote().sendStringByFuture("Hello");
// fut.get(2,TimeUnit.SECONDS); // wait for send to complete.
}catch (Throwable t){
t.printStackTrace();
}
}
@OnWebSocketMessage
public void onMessageString(Session session, String msg){
System.out.println("getRemoteAddress1:"+session.getRemoteAddress());
String vaHost = session.getRemoteAddress().toString().replaceAll("/", "");
System.out.println();
System.out.printf("Got msg: %s%n",msg);
}
@OnWebSocketMessage
public void onMessageBuffer(Session session, byte[] byteArray, int offset, int length) throws IOException {
System.out.println("onMessageBuffer");
System.out.println("getRemoteAddress2:"+session.getRemoteAddress());
FileUtils.writeByteArrayToFile(new File("C:/files/ws/"+System.nanoTime()+".jpg"), byteArray);
}
谢谢你,乔金!
推荐阅读
- forms - render() 得到了一个意外的关键字参数 'renderer' - DateTimePicker - Django 1.11 -> 3.1 迁移
- spring - HttpServletRequest 在 Aspect 中使用时抛出错误
- node.js - 启动时未加载最新安装的节点版本
- php - PHP/ExtJS - 将带有 unicode 的字符串转换回其原始字符
- typescript - `$s` 不是一个有效的视频,尽管有 png url
- sql - SQL Server Xquery sql:变量用法
- sql - 在 hivesql 中查找唯一计数 Postgresql 查询
- python - 如何使用openCV从python中的图像中提取白色密度或像素数?
- xamarin - iOS 中是否有类似 android:actionBarSize 的属性?
- python - 如何通过 Gerrit-python-api 包在 gerrit 中设置代码审查?