Wo hört der Golang jsonrpc2-Server zu?
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()) }
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 protected]','Subject': 'Hello', 'Content': 'Hi!!!'} smsArgs = {'Number': '381641234567', 'Content': 'Sms!!!'} print(rpc_call(url, 'email.SendEmail', emailArgs)) print(rpc_call(url, 'sms.SendSMS', smsArgs))
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() }
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 }
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!

Heiße KI -Werkzeuge

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool
Ausziehbilder kostenlos

Clothoff.io
KI-Kleiderentferner

AI Hentai Generator
Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

Heiße Werkzeuge

Notepad++7.3.1
Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version
Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1
Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6
Visuelle Webentwicklungstools

SublimeText3 Mac-Version
Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Heiße Themen



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:

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.

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 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 ...

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.

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

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

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
