Jadual Kandungan
Kandungan soalan
Penyelesaian
Rumah pembangunan bahagian belakang Golang Di manakah pelayan jsonrpc2 Golang mendengar?

Di manakah pelayan jsonrpc2 Golang mendengar?

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

Golang jsonrpc2 服务器在哪里监听?

Di manakah pelayan jsonrpc2 Golang mendengar? Ini adalah masalah yang sering dihadapi oleh ramai pembangun Golang apabila menggunakan protokol jsonrpc2. Di Golang, tempat pelayan jsonrpc2 mendengar bergantung pada cara kod itu dilaksanakan. Amalan biasa ialah meminta pelayan mendengar pada port tertentu untuk menerima permintaan daripada pelanggan. Selain itu, pelayan juga boleh dipantau pada antara muka rangkaian tertentu, seperti antara muka gelung balik tempatan (localhost) atau alamat IP tertentu. Untuk memastikan pelayan boleh mendengar permintaan dan memprosesnya secara normal, pembangun perlu menyatakan dengan jelas lokasi mendengar dalam kod.

Kandungan soalan

Saya ingin membuat pelayan lsp mudah di golang, ini adalah kod yang saya tulis setakat ini:

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

}
Salin selepas log masuk

Ia berfungsi, tetapi saya tidak tahu port mana yang ia sedang berjalan, atau cara memanggilnya melalui pelanggan secara umum. Adakah sesiapa mempunyai sebarang idea?

Saya fikir ia adalah port 4389, tetapi bukan itu

Saya menggunakan skrip ini untuk menguji:

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))
Salin selepas log masuk

Saya rasa ini betul kerana saya mendapat pelanggan ini daripada soalan stackoverflow yang lain

Penyelesaian

Saya faham:

handlerwitherror(s.handle)

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

Ini bermakna kod anda menggunakan json-rpc melalui input dan output standard (stdin/stdout), bukannya menyambung melalui rangkaian.
Apabila anda menggunakan hujah untuk os.stdin 作为 jsonrpc2.newbufferedstream , anda menentukan bahawa input harus datang daripada input standard proses yang menjalankan pelayan. dan respons akan dihantar ke output standard.

Jadi pelayan tidak mendengar pada mana-mana port rangkaian. Ia berinteraksi dengan data yang dihantar terus ke input dan output standardnya. Ini biasanya digunakan untuk komunikasi antara proses, contohnya apabila anda mahu satu proses memanggil proses pelayan dan menerima respons.
Contohnya, lihat "go: Komunikasi dua hala dengan proses lain? " atau davidelorenzoli/stdin-stdout-ipc.

Jika anda mahu pelayan json-rpc mendengar pada port rangkaian, anda perlu menggunakan pakej net. Anda juga perlu mengubah suai skrip klien untuk menghantar permintaannya ke port rangkaian yang betul dan bukannya menghantar permintaan http ke url.

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
}
Salin selepas log masuk

Ini ialah contoh asas di mana kaedah serve mencipta pendengar tcp yang mendengar pada port 4389 localhost. Ia kemudian memasuki gelung menunggu sambungan, dan apabila ia mendapat sambungan ia memulakan goroutine baharu untuk mengendalikan sambungan menggunakan pelayan json-rpc.

Di sisi klien, anda perlu membuka sambungan tcp ke pelayan, tulis permintaan json-rpc ke sambungan itu, dan kemudian baca respons.

Anda tidak boleh menggunakan perpustakaan requests seperti dalam skrip python, kerana ia adalah untuk permintaan http, bukan sambungan tcp mentah.
Anda perlu menggunakan socket perpustakaan dalam python, atau dalam bahasa pelanggan anda, untuk membuat sambungan tcp dan menghantar/menerima data di atasnya.

Tetapi ingat, lsp (Protokol Pelayan Bahasa) berjalan di atas stdin/stdout dan bukan soket rangkaian.
Ini kerana pelayan lsp biasanya dimulakan sebagai proses kanak-kanak oleh editor/IDE dan berkomunikasi secara langsung melalui saluran ini. Jadi bergantung pada kes penggunaan anda, kaedah stdin/stdout mentah mungkin lebih sesuai.

Atas ialah kandungan terperinci Di manakah pelayan jsonrpc2 Golang mendengar?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

AI Hentai Generator

AI Hentai Generator

Menjana ai hentai secara percuma.

Artikel Panas

R.E.P.O. Kristal tenaga dijelaskan dan apa yang mereka lakukan (kristal kuning)
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Tetapan grafik terbaik
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Cara Memperbaiki Audio Jika anda tidak dapat mendengar sesiapa
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Cara Membuka Segala -galanya Di Myrise
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Harga terbaru Bitcoin pada 2018-2024 USD Harga terbaru Bitcoin pada 2018-2024 USD Feb 15, 2025 pm 07:12 PM

Harga USD Bitcoin masa nyata Faktor yang menjejaskan harga bitcoin Petunjuk untuk meramalkan harga bitcoin masa depan Berikut adalah beberapa maklumat penting mengenai harga Bitcoin pada 2018-2024:

Cara Membuka Format XML Cara Membuka Format XML Apr 02, 2025 pm 09:00 PM

Gunakan kebanyakan editor teks untuk membuka fail XML; Jika anda memerlukan paparan pokok yang lebih intuitif, anda boleh menggunakan editor XML, seperti editor XML oksigen atau XMLSPY; Jika anda memproses data XML dalam program, anda perlu menggunakan bahasa pengaturcaraan (seperti Python) dan perpustakaan XML (seperti XML.Etree.ElementTree) untuk menghuraikan.

Bagaimana untuk menyesuaikan simbol saiz semula melalui CSS dan menjadikannya seragam dengan warna latar belakang? Bagaimana untuk menyesuaikan simbol saiz semula melalui CSS dan menjadikannya seragam dengan warna latar belakang? Apr 05, 2025 pm 02:30 PM

Kaedah penyesuaian simbol saiz semula dalam CSS bersatu dengan warna latar belakang. Dalam perkembangan harian, kita sering menghadapi situasi di mana kita perlu menyesuaikan butiran antara muka pengguna, seperti menyesuaikan ...

Bagaimana cara menggunakan atribut clip-path CSS untuk mencapai kesan lengkung 45 darjah segmen? Bagaimana cara menggunakan atribut clip-path CSS untuk mencapai kesan lengkung 45 darjah segmen? Apr 04, 2025 pm 11:45 PM

Bagaimana untuk mencapai kesan lengkung 45 darjah segmen? Dalam proses melaksanakan segmen, bagaimana membuat sempadan yang betul berubah menjadi lengkung 45 darjah ketika mengklik butang kiri, dan titik ...

Ringkasan Butiran Harga Sejarah yang Paling Lengkap Sejak Kelahiran Bitcoin (versi terkini pada tahun 2025) Ringkasan Butiran Harga Sejarah yang Paling Lengkap Sejak Kelahiran Bitcoin (versi terkini pada tahun 2025) Feb 15, 2025 pm 06:45 PM

Node penting untuk harga bersejarah Bitcoin 3 Januari 2009: Blok Kejadian dihasilkan, bitcoin pertama dihasilkan, dengan nilai USD 0. 5 Oktober: Transaksi Bitcoin pertama, seorang pengaturcara membeli dua pizza dengan 10,000 bitcoin, bersamaan dengan $ 0.008. 9 Februari 2010: Mt. Gox Exchange pergi dalam talian dan menjadi platform utama untuk perdagangan Bitcoin awal. 22 Mei: Bitcoin memecahkan $ 1 untuk kali pertama. 17 Julai: Harga Bitcoin menjunam ke $ 0.008, memukul rendah sepanjang masa. 9 Februari 2011: Harga bitcoin pecah melalui $ 10 untuk kali pertama. 10 April: Mt. Pergi

Di era CHATGPT, bagaimanakah masyarakat Q & A teknikal dapat bertindak balas terhadap cabaran? Di era CHATGPT, bagaimanakah masyarakat Q & A teknikal dapat bertindak balas terhadap cabaran? Apr 01, 2025 pm 11:51 PM

Komuniti Q & A Teknikal di Era CHATGPT: Strategi Respons Segmentfault StackOverflow ...

Teks di bawah susun atur flex ditinggalkan tetapi bekas dibuka? Bagaimana menyelesaikannya? Teks di bawah susun atur flex ditinggalkan tetapi bekas dibuka? Bagaimana menyelesaikannya? Apr 05, 2025 pm 11:00 PM

Masalah pembukaan kontena kerana peninggalan teks yang berlebihan di bawah susun atur flex dan penyelesaian digunakan ...

Adakah pengeluaran halaman H5 adalah pembangunan front-end? Adakah pengeluaran halaman H5 adalah pembangunan front-end? Apr 05, 2025 pm 11:42 PM

Ya, pengeluaran halaman H5 adalah kaedah pelaksanaan penting untuk pembangunan front-end, yang melibatkan teknologi teras seperti HTML, CSS dan JavaScript. Pemaju membina halaman H5 yang dinamik dan berkuasa dengan bijak menggabungkan teknologi ini, seperti menggunakan & lt; kanvas & gt; Tag untuk menarik grafik atau menggunakan JavaScript untuk mengawal tingkah laku interaksi.

See all articles