Skip to content

java实现websocket转发消息apiserver没有回应 #3

@yaoyuanming

Description

@yaoyuanming

这是前段和后端建立连接的websocket过程:

File configFile = new File("config/kubeconfig");
final String configYAML;
configYAML = String.join("\n",Files.readAllLines(configFile.toPath()));
Config kubernetesConfig = Config.fromKubeconfig(configYAML);
kubernetesConfig.setTrustCerts(true);

String urlStr = "https://127.0.0.1/api/v1/namespaces/namespace1/pods/pod1/exec?container=container1&stdin=true&stdout=true&stderr=true&tty=true&command=sh&pretty=true&follow=true";
URL url = new URL(urlStr);
clientWebSocketListener = initServerWebSocket(url, kubernetesConfig);
clientWebSocketListener.setSession(session);

@OnMessage
public void onMessage(Session session, byte[] messages) throws UnsupportedEncodingException {
    if (Objects.isNull(session)) {
            return;
        }
        String sessionId = session.getId();
        WebsocketMapping websocketMapping = clients.get(sessionId);
        ClientWebSocketListener listener = websocketMapping.getListener();
        try {
            // 向apiServer发送消息
            listener.waitUntilReady(1);
            listener.send(message.getBytes(), message.length);
        } catch (IOException | InterruptedException ie) {
            // 通知发送方
            session.getAsyncRemote().sendText("向apiServer发送消息失败!失败消息内容: " + message);
        }
}

private static ClientWebSocketListener initServerWebSocket(URL url, Config  config) {
        OkHttpClient client = HttpClientUtils.createHttpClient(config);
        final ClientWebSocketListener serverWebSocketListener = new ClientWebSocketListener();
        final Request.Builder request = new Request.Builder().url(url).get();
        final OkHttpClient clone = client.newBuilder().readTimeout(0, TimeUnit.MILLISECONDS).build();
        clone.newWebSocket(request.build(), serverWebSocketListener);
        return serverWebSocketListener;

    }

这是和apiserver建立的websocket的回复数据:

@Override
    public void onMessage(WebSocket webSocket, ByteString bytes) {
        readyLatch.countDown();
        this.getSession().getAsyncRemote().sendBinary(ByteBuffer.wrap(bytes.toByteArray()));
    }

    @Override
    public void onMessage(WebSocket webSocket, String text) {
        readyLatch.countDown();
        this.getSession().getAsyncRemote().sendText(text);

    }

现在的问题就是和apiserver能够建立连接,而且在onopen的时候apiserver成功的返回了terminal的$d的开头,但是之后再向apiserver发送消息apiserver都没有回应,请问一下是需要进行什么转换吗,还是我少了一些步骤?

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions