Inhaltsverzeichnis
Frageninhalt
Workaround
Heim Backend-Entwicklung Golang Wo hört der Golang jsonrpc2-Server zu?

Wo hört der Golang jsonrpc2-Server zu?

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

Golang jsonrpc2 服务器在哪里监听?

Wo hört der Golang jsonrpc2-Server zu? Dies ist ein Problem, auf das viele Golang-Entwickler häufig stoßen, wenn sie das jsonrpc2-Protokoll verwenden. Wo in Golang der jsonrpc2-Server lauscht, hängt davon ab, wie der Code implementiert wird. Eine gängige Praxis besteht darin, den Server einen bestimmten Port überwachen zu lassen, um Anfragen von Clients zu empfangen. Darüber hinaus kann der Server auch auf einer bestimmten Netzwerkschnittstelle überwacht werden, beispielsweise der lokalen Loopback-Schnittstelle (localhost) oder einer angegebenen IP-Adresse. Um sicherzustellen, dass der Server Anfragen abhören und normal verarbeiten kann, müssen Entwickler den Abhörort im Code klar angeben.

Frageninhalt

Ich möchte einen einfachen LSP-Server in Golang erstellen. Dies ist der Code, den ich bisher geschrieben habe:

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())

}
Nach dem Login kopieren

Es funktioniert, aber ich weiß nicht, auf welchem ​​Port es läuft, oder wie ich es generell über den Client aufrufen soll. Hat jemand irgendwelche Ideen?

Ich dachte, es wäre Port 4389, aber das ist es nicht

Ich verwende dieses Skript zum Testen:

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))
Nach dem Login kopieren

Ich denke, das ist richtig, weil ich diesen Client von einer anderen Stackoverflow-Frage erhalten habe

Workaround

Ich verstehe:

handlerwitherror(s.handle)

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

Das bedeutet, dass Ihr Code JSON-RPC über die Standardeingabe und -ausgabe (stdin/stdout) verwendet, anstatt eine Verbindung über das Netzwerk herzustellen.
Wenn Sie das Argument für os.stdin 作为 jsonrpc2.newbufferedstream verwenden, geben Sie an, dass die Eingabe von der Standardeingabe des Prozesses stammen soll, der den Server ausführt. und die Antwort wird an die Standardausgabe gesendet.

Der Server überwacht also keinen Netzwerkport. Es interagiert mit Daten, die direkt an seine Standardeingabe und -ausgabe gesendet werden. Dies wird normalerweise für die Kommunikation zwischen Prozessen verwendet, wenn Sie beispielsweise möchten, dass ein Prozess einen Serverprozess aufruft und eine Antwort erhält.
Siehe zum Beispiel „go: Zwei-Wege-Kommunikation mit einem anderen Prozess? “ oder davidelorenzoli/stdin-stdout-ipc.

Wenn Sie möchten, dass der JSON-RPC-Server einen Netzwerkport überwacht, müssen Sie das net-Paket verwenden. Sie müssen außerdem das Client-Skript ändern, um seine Anfragen an den richtigen Netzwerkport zu senden, anstatt eine http-Anfrage an die URL zu senden.

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
}
Nach dem Login kopieren

Dies ist ein einfaches Beispiel, bei dem die serve-Methode einen TCP-Listener erstellt, der Port 4389 von localhost überwacht. Anschließend tritt es in eine Schleife ein und wartet auf eine Verbindung. Wenn eine Verbindung hergestellt wird, startet es eine neue Goroutine, um die Verbindung mithilfe des JSON-RPC-Servers zu verarbeiten.

Auf der Clientseite müssen Sie eine TCP-Verbindung zum Server öffnen, die JSON-RPC-Anfrage an diese Verbindung schreiben und dann die Antwort lesen.

Sie können die requests Bibliothek nicht wie in einem Python-Skript verwenden, da sie für http-Anfragen und nicht für rohe TCP-Verbindungen gedacht ist.
Sie müssen die socket-Bibliothek in Python oder in der Sprache Ihres Kunden verwenden, um eine TCP-Verbindung herzustellen und darüber Daten zu senden/empfangen.

Aber denken Sie daran, lsp (Language Server Protocol) läuft über stdin/stdout und nicht über Netzwerk-Sockets.
Dies liegt daran, dass der LSP-Server normalerweise vom Editor/IDE als untergeordneter Prozess gestartet wird und direkt über diese Kanäle kommuniziert. Abhängig von Ihrem Anwendungsfall sind die rohen stdin/stdout-Methoden möglicherweise besser geeignet.

Das obige ist der detaillierte Inhalt vonWo hört der Golang jsonrpc2-Server zu?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

AI Hentai Generator

AI Hentai Generator

Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

R.E.P.O. Energiekristalle erklärten und was sie tun (gelber Kristall)
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Beste grafische Einstellungen
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. So reparieren Sie Audio, wenn Sie niemanden hören können
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Wie man alles in Myrise freischaltet
4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Der jüngste Preis für Bitcoin in den Jahren 2018-2024 USD Der jüngste Preis für Bitcoin in den Jahren 2018-2024 USD Feb 15, 2025 pm 07:12 PM

Echtzeit-Bitcoin-USD-Preis Faktoren, die den Bitcoin -Preis beeinflussen Indikatoren für die Vorhersage zukünftiger Bitcoin -Preise Hier finden Sie einige wichtige Informationen zum Preis von Bitcoin in den Jahren 2018-2024:

So öffnen Sie das XML -Format So öffnen Sie das XML -Format Apr 02, 2025 pm 09:00 PM

Verwenden Sie die meisten Texteditoren, um XML -Dateien zu öffnen. Wenn Sie eine intuitivere Baumanzeige benötigen, können Sie einen XML -Editor verwenden, z. B. Sauerstoff XML -Editor oder XMLSPY. Wenn Sie XML -Daten in einem Programm verarbeiten, müssen Sie eine Programmiersprache (wie Python) und XML -Bibliotheken (z. B. XML.etree.elementtree) verwenden, um zu analysieren.

Wie kann man das Größensymbol durch CSS anpassen und es mit der Hintergrundfarbe einheitlich machen? Wie kann man das Größensymbol durch CSS anpassen und es mit der Hintergrundfarbe einheitlich machen? Apr 05, 2025 pm 02:30 PM

Die Methode zur Anpassung der Größe der Größe der Größe der Größe in CSS ist mit Hintergrundfarben einheitlich. In der täglichen Entwicklung begegnen wir häufig Situationen, in denen wir die Details der Benutzeroberfläche wie Anpassung anpassen müssen ...

Wie verwendet ich das Clip-Pfad-Attribut von CSS, um den 45-Grad-Kurveneffekt des Segmenters zu erreichen? Wie verwendet ich das Clip-Pfad-Attribut von CSS, um den 45-Grad-Kurveneffekt des Segmenters zu erreichen? Apr 04, 2025 pm 11:45 PM

Wie kann man den 45-Grad-Kurveneffekt des Segmenters erreichen? Bei der Implementierung des Segmenters verwandeln Sie den rechten Rand in eine 45-Grad-Kurve, wenn Sie auf die linke Schaltfläche klicken, und der Punkt ...

Ist die H5-Seitenproduktion eine Front-End-Entwicklung? Ist die H5-Seitenproduktion eine Front-End-Entwicklung? Apr 05, 2025 pm 11:42 PM

Ja, die H5-Seitenproduktion ist eine wichtige Implementierungsmethode für die Front-End-Entwicklung, die Kerntechnologien wie HTML, CSS und JavaScript umfasst. Entwickler bauen dynamische und leistungsstarke H5 -Seiten auf, indem sie diese Technologien geschickt kombinieren, z. B. die Verwendung der & lt; canvas & gt; Tag, um Grafiken zu zeichnen oder JavaScript zu verwenden, um das Interaktionsverhalten zu steuern.

Der Text unter Flex -Layout wird weggelassen, aber der Behälter wird geöffnet? Wie löst ich es? Der Text unter Flex -Layout wird weggelassen, aber der Behälter wird geöffnet? Wie löst ich es? Apr 05, 2025 pm 11:00 PM

Das Problem der Containeröffnung aufgrund einer übermäßigen Auslassung von Text unter Flex -Layout und Lösungen werden verwendet ...

Wie kann die technische Fragen und Antworten in der Chatgpt -Ära auf Herausforderungen reagieren? Wie kann die technische Fragen und Antworten in der Chatgpt -Ära auf Herausforderungen reagieren? Apr 01, 2025 pm 11:51 PM

Die technische Q & A -Community in der Chatgpt -Ära: SegmentFaults Antwortstrategie Stackoverflow ...

Die vollständigste Zusammenfassung der historischen Preisdetails seit der Geburt von Bitcoin (die neueste Version von 2025) Die vollständigste Zusammenfassung der historischen Preisdetails seit der Geburt von Bitcoin (die neueste Version von 2025) Feb 15, 2025 pm 06:45 PM

Wichtiger Knoten für Bitcoin Historical Price 3. Januar 2009: Genesis Block wurde generiert, das erste Bitcoin wurde mit einem Wert von USD 0 generiert. 5. Oktober: Als erste Bitcoin -Transaktion kaufte ein Programmierer zwei Pizzen mit 10.000 Bitcoins, entspricht 0,008 USD. 9. Februar 2010: Die Mt. Gox Exchange ging online und wurde zur Hauptplattform für den frühen Bitcoin -Handel. 22. Mai: Bitcoin bricht zum ersten Mal 1 $ durch. 17. Juli: Bitcoin-Preis fiel auf 0,008 USD und erreichte ein Allzeittief. 9. Februar 2011: Bitcoin Price bricht zum ersten Mal 10 US -Dollar durch. 10. April: Mt. Go

See all articles