У меня есть машинописный JSON RPC-сервер и клиент Go. Я следовал различным руководствам по настройке сервера и клиента, однако у меня возникли проблемы со связью между ними. В настоящее время я пытаюсь подключиться к ним локально, поэтому использую stdin/stdout для связи между ними.
Это мой серверный код:
import * as jsonrpc from 'vscode-jsonrpc/node';
const connection = jsonrpc.createMessageConnection(
new jsonrpc.StreamMessageReader(process.stdin),
new jsonrpc.StreamMessageWriter(process.stdout)
);
connection.onRequest('testRequest', (params: any) => {
console.info('in test request');
return 'testRequest response';
});
connection.listen();
console.info('listening...');
А это мой клиентский код (я вызываю ConnectAndSendRequest в основном):
package testConnection
import (
"context"
"io"
"os/exec"
"github.com/sourcegraph/jsonrpc2"
)
type stdrwc struct {
in io.WriteCloser
out io.ReadCloser
}
func (c *stdrwc) Read(p []byte) (int, error) {
return c.out.Read(p)
}
func (c *stdrwc) Write(p []byte) (int, error) {
return c.in.Write(p)
}
func (c *stdrwc) Close() error {
if err := c.in.Close(); err != nil {
return err
}
return c.out.Close()
}
func ConnectAndSendRequest() error {
cmd := exec.Command("<my server>")
stdout, err := cmd.StdoutPipe()
if err != nil {
return nil, err
}
stdin, err := cmd.StdinPipe()
if err != nil {
return nil, err
}
if err := cmd.Start(); err != nil {
return nil, err
}
conn := jsonrpc2.NewConn(context.Background(), jsonrpc2.NewBufferedStream(&stdrwc{stdin, stdout}, jsonrpc2.VSCodeObjectCodec{}), nil)
defer conn.Close()
var res string
err := p.Ev2LSConnection.Call(context.Background(), "testRequest", &res)
if err != nil {
return err
}
log.Println(res)
return nil
}
Когда я запускаю программу go, я вижу журнал listening... в командной строке сервера, но не in test request. Программа go просто зависает, пока я не закрою командную строку сервера. Когда сервер закрыт, я просто получаю err: jsonrpc2: connection is closed в командной строке go cmd.
Я подозреваю, что мой stdin/stdout на сервере или клиенте настроен неправильно, поэтому сервер не получает запросы от клиента. Кто-нибудь, имеющий опыт в этом, знает, что может быть не так?






Теперь я разобрался с проблемами. Было несколько проблем.
Первая проблема: путь к серверу (<<my server>>) был неправильным, поэтому, когда я попытался создать соединение, на самом деле ничего не было создано. Когда я пытался отправлять запросы, я видел ошибку jsonrpc2: connection is closed.
Вторая проблема заключалась в том, что я отправлял журналы (используя console.info()) на сервер Typescript, однако я также использовал консоль Typescript для связи между сервером и клиентом, поэтому клиент go не мог понять вывод. Как только я удалил логи на стороне TS, все заработало от начала до конца.
Добавили ли вы ведение журнала в код Go, чтобы увидеть, где он зависает?