目錄
問題內容
解決方法
首頁 後端開發 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脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

<🎜>:泡泡膠模擬器無窮大 - 如何獲取和使用皇家鑰匙
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
北端:融合系統,解釋
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
Mandragora:巫婆樹的耳語 - 如何解鎖抓鉤
3 週前 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)

熱門話題

Java教學
1666
14
CakePHP 教程
1425
52
Laravel 教程
1327
25
PHP教程
1273
29
C# 教程
1252
24
H5頁面製作是前端開發嗎 H5頁面製作是前端開發嗎 Apr 05, 2025 pm 11:42 PM

是的,H5頁面製作是前端開發的重要實現方式,涉及HTML、CSS和JavaScript等核心技術。開發者通過巧妙結合這些技術,例如使用&lt;canvas&gt;標籤繪製圖形或使用JavaScript控制交互行為,構建出動態且功能強大的H5頁面。

xml怎麼轉換成圖片形式文件 xml怎麼轉換成圖片形式文件 Apr 03, 2025 am 08:27 AM

可將 XML 轉換為圖片形式文件的方法有多種:使用軟件:Altova XMLSpy、Oxygen XML Editor、XML Viewer 等。使用在線工具:XML to Image、Convert XML to Image、Free Online XML to Image Converter 等。

如何通過JavaScript或CSS控制瀏覽器打印設置中的頁首和頁尾? 如何通過JavaScript或CSS控制瀏覽器打印設置中的頁首和頁尾? Apr 05, 2025 pm 10:39 PM

如何使用JavaScript或CSS控制瀏覽器打印設置中的頁首和頁尾在瀏覽器的打印設置中,有一個選項可以控制是否顯�...

為什麼inline-block元素會出現錯位現象?如何解決這個問題? 為什麼inline-block元素會出現錯位現象?如何解決這個問題? Apr 04, 2025 pm 10:39 PM

關於inline-block元素錯位顯示的原因及解決方案在編寫網頁佈局時,我們常常會遇到一些看似奇怪的顯示問題。比...

如何使用CSS的clip-path屬性實現分段器的45度曲線效果? 如何使用CSS的clip-path屬性實現分段器的45度曲線效果? Apr 04, 2025 pm 11:45 PM

如何實現分段器的45度曲線效果?在實現分段器的過程中,如何讓點擊左側按鈕時右側邊框變成45度曲線,而點�...

如何通過CSS自定義resize符號並使其與背景色統一? 如何通過CSS自定義resize符號並使其與背景色統一? Apr 05, 2025 pm 02:30 PM

CSS自定義resize符號的方法與背景色統一在日常開發中,我們經常會遇到需要自定義用戶界面細節的情況,比如調...

xml怎麼轉換成json xml怎麼轉換成json Apr 03, 2025 am 09:09 AM

將 XML 轉換為 JSON 的方法包括:使用編程語言(如 Python、Java、C#)編寫腳本或程序進行轉換;使用在線工具(如 XML 轉換為 JSON、Gojko's XML 轉換器、XML 在線工具)粘貼或上傳 XML 數據並選擇 JSON 格式輸出;使用 XML 到 JSON 轉換器(如 Oxygen XML Editor、Stylus Studio、Altova XMLSpy)執行轉換任務;使用 XSLT 樣式表將 XML 轉換為 JSON;使用數據集成工具(如 Informatic

xml格式怎麼打開 xml格式怎麼打開 Apr 02, 2025 pm 09:00 PM

用大多數文本編輯器即可打開XML文件;若需更直觀的樹狀展示,可使用 XML 編輯器,如 Oxygen XML Editor 或 XMLSpy;在程序中處理 XML 數據則需使用編程語言(如 Python)與 XML 庫(如 xml.etree.ElementTree)來解析。

See all articles