目录
问题内容
解决方法
首页 后端开发 Golang Golang jsonrpc2 服务器在哪里监听?

Golang jsonrpc2 服务器在哪里监听?

Feb 08, 2024 pm 09:27 PM
golang开发 overflow lsp

Golang jsonrpc2 服务器在哪里监听?

Golang jsonrpc2 服务器在哪里监听?这是许多Golang开发者在使用jsonrpc2协议时经常遇到的问题。在Golang中,jsonrpc2服务器监听的位置取决于代码的实现方式。一种常见的做法是将服务器监听在特定的端口上,以便接收来自客户端的请求。另外,也可以将服务器监听在特定的网络接口上,例如本地回环接口(localhost)或指定的IP地址上。为了确保服务器能够正常监听请求并进行处理,开发者需要在代码中明确指定监听的位置。

问题内容

我想在golang中创建一个简单的lsp服务器,到目前为止这是我编写的代码:

package main

import (
    "context"
    "fmt"
    "os"
    "sync"

    "github.com/sourcegraph/jsonrpc2"
)

type lspserver struct {
    // the symmetric connection
    conn jsonrpc2.conn

    // check if the connection is available
    connmutex sync.mutex

    // shutdown
    shutdown bool
}

func newlspserver() *lspserver {
    return &lspserver{}
}

func (s *lspserver) initialize(ctx context.context) error {
    // to implement
    return nil
}

func (s *lspserver) handle(context.context, *jsonrpc2.conn, *jsonrpc2.request) (result interface{}, err error) {
    fmt.println("handling request...")
    // to implement
    return nil, nil
}

func (s *lspserver) serve(ctx context.context) {
    fmt.println("starting lsp server...")
    // what port is this server listening on?
    // it is listening on port 4389

    // create a new jsonrpc2 stream server
    handler := jsonrpc2.handlerwitherror(s.handle)

    // create a new jsonrpc2 stream server
    <-jsonrpc2.newconn(
        context.background(),
        jsonrpc2.newbufferedstream(os.stdin, jsonrpc2.vscodeobjectcodec{}),
        handler).disconnectnotify()
}

func main() {

    // create a new lsp server
    server := newlspserver()
    server.serve(context.background())

}
登录后复制

它可以运行,但我不知道它在哪个端口上运行,或者一般如何通过客户端调用它。有人有什么想法吗?

我认为应该是端口4389,但不是那个

我正在使用此脚本进行测试:

import json
import requests

def rpc_call(url, method, args):
    headers = {'content-type': 'application/json'}
    payload = {
        "method": method,
        "params": [args],
        "jsonrpc": "2.0",
        "id": 1,
    }
    response = requests.post(url, data=json.dumps(payload), headers=headers).json()
    return response['result']

url = 'http://localhost:4389/'

emailArgs = {'To': '[email&#160;protected]','Subject': 'Hello', 'Content': 'Hi!!!'}
smsArgs = {'Number': '381641234567', 'Content': 'Sms!!!'}
print(rpc_call(url, 'email.SendEmail', emailArgs))
print(rpc_call(url, 'sms.SendSMS', smsArgs))
登录后复制

我认为这是正确的,因为我从另一个 stackoverflow 问题中获取了这个客户

解决方法

我明白了:

handlerwitherror(s.handle)

    // create a new jsonrpc2 stream server
    <-jsonrpc2.newconn(
        context.background(),
        jsonrpc2.newbufferedstream(os.stdin, jsonrpc2.vscodeobjectcodec{}),
        handler).disconnectnotify()
}
登录后复制

这意味着您的代码通过标准输入和输出(stdin/stdout)使用 json-rpc,而不是通过网络连接。
当您使用 os.stdin 作为 jsonrpc2.newbufferedstream 的参数时,您指定输入应来自运行服务器的进程的标准输入。并且响应将被发送到标准输出。

因此,服务器没有侦听任何网络端口。它与直接发送到其标准输入和输出的数据进行交互。这通常用于进程间通信,例如,当您希望一个进程调用服务器进程并接收响应时。
例如,请参阅“go:与另一个进程进行双向通信?”或davidelorenzoli/stdin-stdout-ipc

如果您希望 json-rpc 服务器侦听网络端口,则需要使用 net。您还需要修改客户端脚本以将其请求发送到正确的网络端口,而不是向 url 发送 http 请求。

package main

import (
    "context"
    "net"
    "log"
    "sync"

    "github.com/sourcegraph/jsonrpc2"
)

type LSPServer struct {
    // The symmetric connection
    conn jsonrpc2.Conn

    // Check if the connection is available
    connMutex sync.Mutex

    // shutdown
    shutdown bool
}

func NewLSPServer() *LSPServer {
    return &LSPServer{}
}

func (s *LSPServer) Initialize(ctx context.Context) error {
    // Initialize here if needed
    return nil
}

func (s *LSPServer) Handle(context.Context, *jsonrpc2.Conn, *jsonrpc2.Request) (result interface{}, err error) {
    fmt.Println("Handling request...")
    // Handle something
    return nil, nil
}

func (s *LSPServer) Serve(ctx context.Context) {
    fmt.Println("Starting LSP server...")
    
    // Listen on TCP port 4389 on all available unicast and
    // anycast IP addresses of the local system.
    l, err := net.Listen("tcp", "localhost:4389")
    if err != nil {
        log.Fatal(err)
    }
    defer l.Close()

    for {
        // Wait for a connection.
        conn, err := l.Accept()
        if err != nil {
            log.Fatal(err)
        }

        // Handle the connection in a new goroutine.
        go func(c net.Conn) {
            // Create a new jsonrpc2 stream server
            handler := jsonrpc2.HandlerWithError(s.Handle)
            <-jsonrpc2.NewConn(
                ctx,
                jsonrpc2.NewBufferedStream(c, jsonrpc2.VSCodeObjectCodec{}),
                handler).DisconnectNotify()
            c.Close()
        }(conn)
    }
}

func main() {
    // Create a new LSP server
    server := NewLSPServer()
    go server.Serve(context.Background()) // run Serve in a separate goroutine
    select {} // wait forever
}
登录后复制

这是一个基本示例,其中 serve 方法创建一个 tcp 侦听器,侦听本地主机的端口 4389。然后它进入一个等待连接的循环,当它获得连接时,它会启动一个新的 goroutine 来使用 json-rpc 服务器处理该连接。

在客户端,您需要打开到服务器的 tcp 连接,将 json-rpc 请求写入该连接,然后读取响应。

您不能像在 python 脚本中那样使用 requests,因为它用于 http 请求,不是原始 tcp 连接。
您将需要在 python 中使用 socket,或在您客户端的语言,以创建 tcp 连接并通过它发送/接收数据。

但请记住,lsp(语言服务器协议) 通过 stdin/stdout 运行而不是网络套接字。
这是因为 lsp 服务器通常由编辑器/ide 作为子进程启动,并通过这些通道直接通信。因此,根据您的用例,原始的 stdin/stdout 方法可能更合适。

以上是Golang jsonrpc2 服务器在哪里监听?的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
2 周前 By 尊渡假赌尊渡假赌尊渡假赌
仓库:如何复兴队友
1 个月前 By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒险:如何获得巨型种子
4 周前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

红米Note13RPro怎么调整字体大小? 红米Note13RPro怎么调整字体大小? May 07, 2024 pm 06:34 PM

不要改变原内容的意思,微调内容,重写内容,不要续写红米Note13RPro不仅性能出色,使用体验更加出色,为了让大家有更舒适的使用体验,红米Note13RPro配备了字体调整功能,让用户能够调整自己的手机的字体。如果你想知道红米Note13RPro怎么调整字体大小,那么就来看一看吧。红米Note13RPro怎么调整字体大小?1.打开“设置”应用程序。2.滚动到底部,选择“显示”。3.点击“文字大小”。4.在此屏幕上,您可以通过拖动滑块调整字体大小或者选择预设字体大小。5.调整完毕后,按“确定”保

比特币诞生至今价格2009-2025 最全的BTC历史价格汇总 比特币诞生至今价格2009-2025 最全的BTC历史价格汇总 Jan 15, 2025 pm 08:11 PM

自 2009 年问世以来,比特币成为加密货币界的领头羊,其价格经历了巨大的波动。为了提供全面的历史概述,本文汇集了从 2009 年到 2025 年的比特币价格数据,涵盖了重大的市场事件、市场情绪变化和影响价格走势的重要因素。

红米Note13RPro怎么连接电脑? 红米Note13RPro怎么连接电脑? May 09, 2024 pm 06:52 PM

RedmiNote13RPro这款手机最近是非常火爆的,很多消费者都购买了这款手机,不过很多用户是第一次使用这款手机所以不清楚红米Note13RPro怎么连接电脑,对此,小编在这里为大家带来了详细的教程介绍。红米Note13RPro怎么连接电脑?1.使用USB数据线将红米手机连接到电脑的USB接口上。2.打开手机设置,击选项,将USB调试打开。3.在电脑上打开设备管理器,找到移动设备选项。4.右键点击移动设备,选择更新驱动程序,然后选择自动搜索更新的驱动程序。5.如果电脑没有自动搜索到驱动程序,

红米Note13RPro怎么提取图中的文字? 红米Note13RPro怎么提取图中的文字? May 08, 2024 pm 10:00 PM

红米Note13RPro手机在软件功能上集成了多项智能工具,其中,从图片中快速准确地提取文字内容便是其中之一,下面小编将为大家介绍红米Note13RPro如何提取图片中的文字。红米Note13RPro怎么提取图中的文字?使用小米扫码功能,打开手机的扫码应用,点击图片图标,选择一张图片,然后点击右边的“识别文字”选项,成功提取出图片中的文字。通过手机相册操作。在手机相册中找到需要提取文字的图片,点击图片下方的“更多”,选择“提取文字”,识别成功后,可以根据需要复制或保存文本。利用微信小程序。打开微

《整个活吧》全关卡通关攻略大全 《整个活吧》全关卡通关攻略大全 May 07, 2024 pm 06:31 PM

整个活吧是一款非常好玩的休闲解谜小游戏,大家可以在多平台体验!游戏提供了无数精彩的关卡等待解锁,每个关卡都充满了新奇和挑战,让你体验回答问题的有趣冒险,开启全新的游戏内容。那么整个活吧全关卡怎么通关呢?今天给大家带来了《整个活吧》全关卡通关攻略大全分享,大家过关遇到问题可以来参考一下哦!《整个活吧》全关卡通关攻略大全《整个活吧》全关卡通关攻略大全帮她守岁人鬼情未了帮小姐姐识别渣男狼外婆帮小女孩脱离危险户外探险假装看不见阿飘变回人形帮猩猩修成人形后座有人保持镇定和女鬼周旋夜班出租车保持镇定和女鬼周

《整个活吧》拯救邻居劝所有邻居下楼通关攻略 《整个活吧》拯救邻居劝所有邻居下楼通关攻略 May 07, 2024 pm 07:00 PM

整个活吧是抖音上非常火爆的趣味闯关小游戏,游戏中有超多的关卡等大家挑战!游戏中关卡拯救邻居这一关需要劝所有邻居下楼,具体怎么过关呢?下面是小编给大家带来的《整个活吧》拯救邻居劝所有邻居下楼通关攻略,不清楚如何过关的小伙伴们一起来看看吧,希望能帮到大家。《整个活吧》拯救邻居劝所有邻居下楼通关攻略拯救邻居劝所有邻居下楼1、楼下有人需要急救2、楼下书店在卖绝版学习资料3、楼下垃圾桶好多纸箱子4、我答应约会,你先下楼5、你家哥哥来咱们小区做推广了6、有人发现了新的钓鱼点7、拖动猫罐头到楼下8、拖动叉子给

VESA 宣布 DisplayHDR 1.2 规范,提高性能要求:增加色彩准确度、宽色域等 VESA 宣布 DisplayHDR 1.2 规范,提高性能要求:增加色彩准确度、宽色域等 May 08, 2024 pm 02:13 PM

本站5月8日消息,视频电子标准协会(VESA)今天发布新闻稿,宣布DisplayHDR1.2规范,并表示目前全球有超过3000款显示器型号通过DisplayHDR标准认证。DisplayHDR1.2版本规范带来了更严格的性能要求,对亮度、色域和位深度之外,还引入色彩精度、对比度、黑电平(blacklevel,指在经过一定校准的显示装置上,没有一行光亮输出的视频信号电平)和字幕闪烁的多项新测试要求。DisplayHDRv1.2改进了白色亮度级别测试,将黑色背景上的10%中心色块测试更改为非黑色背景

《整个活吧》叛逆期让母女相互理解并和好通关攻略 《整个活吧》叛逆期让母女相互理解并和好通关攻略 May 08, 2024 pm 01:31 PM

整个活吧是抖音上非常火爆的趣味闯关小游戏,游戏中有超多的关卡等大家挑战!游戏中叛逆期这一关需要让母女相互理解并和好,具体如何过关呢?下面是小编给大家带来的《整个活吧》叛逆期让母女相互理解并和好通关攻略,不清楚如何过关的小伙伴们一起来看看吧,希望能帮到大家。《整个活吧》叛逆期让母女相互理解并和好通关攻略叛逆期让母女相互理解并和好1、拖动书包给妈妈2、拖动下图所示物品给两个人3、向下滑动右边的时间4、点击书包《整个活吧》全关卡通关攻略大全帮她守岁人鬼情未了帮小姐姐识别渣男狼外婆帮小女孩脱离危险户外探

See all articles