返回顶部
首页 > 资讯 > 服务器 >Golang jsonrpc2 服务器在哪里监听?
  • 358
分享到

Golang jsonrpc2 服务器在哪里监听?

golang开发overflowlsp 2024-02-08 21:02:52 358人浏览 独家记忆
摘要

golang JSONrpc2 服务器在哪里监听?这是许多Golang开发者在使用jsonrpc2协议时经常遇到的问题。在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 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 服务器在哪里监听?的详细内容,更多请关注编程网其它相关文章!

--结束END--

本文标题: Golang jsonrpc2 服务器在哪里监听?

本文链接: https://lsjlt.com/news/562072.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Golang jsonrpc2 服务器在哪里监听?
    Golang jsonrpc2 服务器在哪里监听?这是许多Golang开发者在使用jsonrpc2协议时经常遇到的问题。在Golang中,jsonrpc2服务器监听的位置取决于代码的实...
    99+
    2024-02-08
    golang开发 overflow lsp
  • oracle监听在哪里配置
    oracle 监听的配置文件位置为:listener.ora:主配置文件,用于监听连接并启动实例。tnsnames.ora:包含客户端连接到数据库所需的信息。sqlnet.ora:包含用...
    99+
    2024-04-19
    oracle linux
  • oracle监听日志在哪里
    oracle 监听日志文件位于:windows:%oracle_base%\diag\tnslsnr\\\listener\.log;unix:$oracle_base/diag/tns...
    99+
    2024-04-19
    oracle
  • 如何在 Go 中停止监听服务器
    在Go语言中,如何优雅地停止监听服务器是一个常见的问题。当我们需要停止服务器时,我们希望能够正常关闭所有连接,并且不影响正在处理的请求。本文将介绍几种常见的方法,帮助你解决这个问题。 ...
    99+
    2024-02-09
    go语言
  • 阿里云服务器监听8080功能详解
    在搭建网站或者开发过程中,我们经常会遇到需要监听8080端口的问题。那么,阿里云服务器是如何监听8080功能的呢?本文将对此进行详细介绍。 阿里云服务器是一款强大的云计算产品,它提供了丰富的功能和接口,使得用户可以轻松地在云上搭建网站或者...
    99+
    2023-11-06
    阿里 详解 功能
  • 阿里云服务器监听端口号是多少?
    阿里云服务器作为企业云服务提供商,提供了多种类型的服务器供用户选择。为了能够使用这些服务器,用户需要了解如何设置服务器监听的端口号。本文将详细说明阿里云服务器监听端口号的设置方法。 在使用阿里云服务器时,用户可能需要设置不同的端口号来访问不...
    99+
    2023-11-13
    阿里 端口号 服务器
  • oracle数据库监听服务是哪个
    oracle 数据库监听服务是 oracle net listener (onl)。它负责:客户端连接管理监听连接请求验证和建立安全会话转发请求给数据库实例会话管理负载均衡监视实例可用性...
    99+
    2024-04-19
    oracle
  • listener监听器在Java中的作用有哪些
    listener监听器在Java中的作用有哪些?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。1: 监听器的定义:监听器实际上是一个类,这个类实现了特定的接口,然...
    99+
    2023-05-31
    java listener
  • 如何在 Go 中非阻塞地监听服务器端 websocket
    问题内容 我使用 https://pkg.go.dev/golang.org/x/net/websocket 来创建服务器端 websocket。通过它进行的所有通信均采用 json ...
    99+
    2024-02-08
  • 云服务器监控报警系统设置在哪里
    云服务器监控报警系统可以安装在你的计算机上,也可以安装在你的服务器上。以下是两个常见的位置: 你的 Linux 或类似服务器操作系统 你的 Windows 服务器操作系统上 如果你的 Windows 服务器上安装了 MySQL,可以在...
    99+
    2023-10-26
    报警系统 服务器
  • oracle为什么没有监听服务器
    oracle没有监听服务器的原因:1、默认配置,为了安全考虑,以防止任何未经授权的访问;2、配置错误,可能在配置监听服务器时出现错误,导致它无法正常工作或无法启动;3、服务停止,由于系统崩溃、硬件故障、操作系统更新或其他未知原因引起的。本教...
    99+
    2023-08-08
  • 云服务器监控报警系统设置在哪里看
    云服务器监控报警系统可以通过以下几个步骤进行设置: 确定监控设备的地址和端口号:首先需要明确监控设备的地址和端口号,确保监控设备不会被恶意攻击或监听。 确定监控设备的类型和版本:监控设备需要支持不同的操作系统、硬件设备版本、操作系统版本...
    99+
    2023-10-26
    报警系统 服务器
  • 云服务器监控报警系统设置在哪里找
    云服务器监控报警系统可以根据以下步骤进行设置: 在云服务器的控制台上选择“服务器监控”选项。 在服务器监控的界面中,选择监控范围。 点击“立即查看”按钮,可以查看监控的服务器运行状态和监控报警信息。 如果需要查看服务器的详细配置,可以点...
    99+
    2023-10-26
    报警系统 哪里找 服务器
  • 云服务器在哪里
    云服务器是一种虚拟的计算资源,可以通过互联网访问。它通常位于本地或云端提供商的数据中心中。 云服务器提供商可能会为您提供服务器硬件、软件、技术支持和其他服务,以使您可以通过公共云或私有云平台访问它。 通常,云服务器提供商的名称通常会列出该...
    99+
    2023-10-26
    服务器
  • 云服务器监控报警系统设置在哪里打开
    云服务器监控报警系统可以安装在任何计算机上,并且可以通过以下方式打开: 打开控制台:登录到控制台后,右键点击要报警的程序或网站,选择“打开”即可。 使用浏览器:打开浏览器,然后点击“管理工具”,选择“系统工具”,选择“服务器监控报警系统...
    99+
    2023-10-26
    报警系统 服务器
  • 云服务器监控报警系统设置在哪里找的
    云服务器监控报警系统设置通常有以下几个地方: 服务器机房:可以在管理后台设置云服务器监控报警系统的IP地址范围、端口和监听端口范围,设置监听端口的上限,以保证监控报警系统能够及时接收到服务器异常信息并发出报警。 应用服务器:可以根据需要...
    99+
    2023-10-26
    报警系统 哪里找 服务器
  • 云服务器监控报警系统设置在哪里找到
    云服务器监控报警系统可以从云服务提供商的网站上找到。以下是一些可能需要的步骤和资源: 网站:登录云服务提供商的网站并查看相关的帮助页面。 用户指南:了解如何使用云服务器监控报警系统以及如何管理该系统。 常用的报警设置选项:查看每个报警设...
    99+
    2023-10-26
    报警系统 服务器
  • 云服务器监控报警系统设置在哪里看的
    云服务器监控报警系统设置通常有以下几个地方可以查看: 服务器托管中心:可以通过服务器托管中心进入云服务器监控报警系统页面,包括服务器列表、警告信息、报警级别等。可以查看服务器的运行状态,包括CPU、内存、网络等信息。 服务器列表:可以在...
    99+
    2023-10-26
    报警系统 服务器
  • 云服务器监控报警系统设置在哪里看啊
    云服务器监控报警系统可以通过以下几个步骤进行设置: 进入云服务器监控报警系统,可以在系统控制台上进行设置和操作,如更改监控设置、关闭某些服务等。 监控系统可以实时监测服务器的性能,包括CPU使用率、内存使用情况、磁盘占用情况等,如果发现...
    99+
    2023-10-26
    报警系统 看啊 服务器
  • 云服务器监控报警系统设置在哪里看到
    云服务器监控报警系统设置一般需要以下步骤: 在云服务器监控报警系统应用程序中创建监控数据,其中包括监控时间范围、监控用户和应用程序等相关信息。 创建报警事件组,可以包括监控事件、警告消息、告警通知、故障排除等信息。 在云服务器监控报警系...
    99+
    2023-10-26
    报警系统 服务器
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作