You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

2024年VSCode Language Client扩展:客户端如何接收LSP服务器消息?

2024年VSCode LSP扩展接收服务器自定义消息实现方案

客户端(VSCode扩展侧)实现

当前vscode-language-client包已简化就绪状态监听逻辑,无需寻找旧版的onReady()方法,直接通过client.ready这个Promise等待客户端初始化完成,即可注册自定义消息处理器。

1. 就绪后注册自定义消息处理

import { LanguageClient } from 'vscode-languageclient/node';
import * as vscode from 'vscode';

// 假设已完成LanguageClient实例初始化
async function setupCustomMessageHandler(client: LanguageClient) {
    // 等待客户端就绪
    await client.ready;

    // 处理服务器发来的自定义请求(需客户端返回响应)
    client.onRequest('custom/serverToClientRequest', async (params: any) => {
        console.log('收到服务器请求:', params);
        // 编写业务逻辑并返回响应
        return { status: 'processed', result: '客户端已处理请求' };
    });

    // 处理服务器发来的自定义通知(无需返回响应)
    client.onNotification('custom/serverToClientNotification', (params: any) => {
        console.log('收到服务器通知:', params);
        // 可在此触发VSCode交互,比如弹窗提示
        vscode.window.showInformationMessage(`服务器通知:${params.content}`);
    });
}

// 扩展激活时执行初始化逻辑
export async function activate(context: vscode.ExtensionContext) {
    // ... 此处省略LanguageClient实例创建代码 ...
    setupCustomMessageHandler(client);
    await client.start();
}

服务器(LSP后端)实现

使用vscode-languageserver包时,通过创建的Connection实例直接向客户端发送自定义请求或通知。

1. 发送自定义请求(等待客户端响应)

import { createConnection, ProposedFeatures } from 'vscode-languageserver/node';

const connection = createConnection(ProposedFeatures.all);

// 在业务逻辑触发点调用
async function sendCustomRequest() {
    try {
        const response = await connection.sendRequest('custom/serverToClientRequest', {
            content: '来自服务器的请求数据'
        });
        console.log('客户端响应结果:', response);
    } catch (error) {
        console.error('请求发送失败:', error);
    }
}

2. 发送自定义通知(无需响应)

// 在业务逻辑触发点调用
function sendCustomNotification() {
    connection.sendNotification('custom/serverToClientNotification', {
        content: '来自服务器的通知内容'
    });
}

注意事项

  • 自定义方法名建议使用反向域名格式(如com.yourteam.customMethod),避免与LSP内置方法冲突。
  • 客户端与服务器的方法名必须完全一致,否则消息无法被正确捕获处理。
  • 传递的数据需支持JSON序列化,因为LSP基于JSON-RPC协议通信。

内容的提问来源于stack exchange,提问作者盛安安

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 17:12:43