В сети, когда вы подключаетесь к серверу через TCP (или любой другой аналогичный протокол на основе подключения), при подключении ваш ПК уже выбирает и прослушивает (псевдо / относительно) случайный порт для получения ответов от серверов.Таким образом, пока сервер поддерживает соединение, а обе стороны поддерживают соединение живым, у вас уже есть двунаправленное соединение.Так что с технической точки зрения низкого уровня вам не нужно инициировать второе соединение .
В зависимости от вашей системы RPC она может или не может использоватьTCP и он могут иметь или не иметь двунаправленную связь (точнее, инициализацию двунаправленной связи).
Теперь, для thrift , кажется, что неттам еще много документации (нет ссылки на API).Но, проверяя пример кода, кажется, что он абстрагируется от обработки соединения и использует только связь запрос / ответ.Таким образом, в этом случае да, вам придется прослушивать клиентский порт с определенным портом и сообщать серверу, чтобы сервер мог инициировать передачу запроса / ответа .
Go сам предоставляет пакет rpc , который предназначен исключительно для передачи данных, поэтому не поможет.
Однако он также предоставляет websocket пакет .Хотя изначально он был нацелен на связь между веб-сервером и веб-браузером, он представляет собой двунаправленный протокол (в конце концов, это то, о чем идет речь) и может использоваться любым типом приложений.Возможно, он не настолько эффективен в отношении размера / полосы пропускания, но он выполняет свою работу.
Я не уверен в состоянии реализации в пакете go.Тип Conn имеет поле источника, но пример функции Conn.Dial передает http://localhost
;Я не уверен, заменяется ли это удаленно доступным источником веб-сокета.Функция Handler.ServeHTTP предоставляет http.ResponseWriter, который вы также можете использовать для инициации соединения. По крайней мере, это первое, что я бы протестировал.
Альтернатива, если вам удобно использовать определенный формат данных и самостоятельно управлять сетью , это Protobuf .Существует проект сообщества для привязки go к protobuf .Затем вы можете обработать TCP-соединение самостоятельно (подключиться к нему и отправить ваши данные, получить данные, сохранить информацию о соединении и т. Д.).
Что касается других альтернатив , вы можете проверить страница пакетов сообщества и / или страница проектов сообщества (особенно Go Ajax и go-xmlrpc - хотя и то, и другое на данный момент очень элементарно).