首页 > 解决方案 > 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 中运行代码?

标签: javaspringspring-bootwebsocketjetty

解决方案


我通过参考 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);
    }

谢谢你,乔金!


推荐阅读