java - 从客户端执行 json 远程过程调用(RPC)

     2023-02-16     280

关键词:

【中文标题】java - 从客户端执行 json 远程过程调用(RPC)【英文标题】:java - do json remote procedure call(RPC) from client 【发布时间】:2016-10-21 08:12:43 【问题描述】:

我正在开发一个 java 应用程序。我需要调用一个远程 api 方法。假设我有这些信息:remote_ipremote_portremote_method_name 和一些 key-value 数据要发布。我需要通过 TCP 协议将我的数据发布到远程服务器。我以这种方式测试了Sockets,但没有工作:

Socket socket = new Socket(remote_ip, remote_port);
BufferedWriter wr = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream(), "UTF8"));
String params = URLEncoder.encode("key1", "UTF-8")
      + "=" + URLEncoder.encode(value1, "UTF-8");

params += "&" + URLEncoder.encode("key2", "UTF-8")
+ "=" + URLEncoder.encode(value2, "UTF-8");
wr.write("POST " + remote_method_name + " HTTP/1.0\r\n");
wr.write("Content-Length: " + params.length() + "\r\n");
wr.write("Content-Type: application/x-www-form-urlencoded\r\n");
wr.write("\r\n");

wr.write(params);
wr.flush();

谁能告诉我如何正确调用api方法?

如果可能的话,我想在没有任何第三方库的情况下这样做。

任何帮助将不胜感激。

【问题讨论】:

任何特定的堆栈跟踪?什么不工作? 不抛出任何异常。只需返回404 not found。我想知道调用远程api方法的正确方法。 【参考方案1】:

首先,即使您说要使用原始 tcp 套接字,但您显然是在尝试发出 HTTP 休息请求。为此使用 http 客户端会方式更容易和更合适。我不想使用第三方库,使用内置的HttpUrlConnection(example usage)。

另一个优点是使用 http 客户端会给你一个明确的错误消息。

其次,您确定该内容类型吗?如果您尝试提交 json,通常要设置的标头是 Content-Type: application/json

第三,如果您收到 404 not found,我敢打赌您发帖的网址不正确。与为您提供此 API 规范的人仔细检查域和 baseurl。现在您的 URL 基本上是 http://remote_ip:remote_port/remote_method_name,这不太可能是正确的。

【讨论】:

【参考方案2】:

我认为原因是您提供的“remote_method_name”是错误的。 由于您正在进行 http 调用,因此这里有一个简短的示例供您参考。 对于您现在正在阅读的页面,请求应该是:

curl -v 'http://***.com/questions/40171522/java-do-json-remote-procedure-callrpc-from-client'
*   Trying 151.101.193.69...
* Connected to ***.com (151.101.193.69) port 80 (#0)
> GET /questions/40171522/java-do-json-remote-procedure-callrpc-from-client HTTP/1.1
> Host: ***.com
> User-Agent: curl/7.43.0
> Accept: */*
> 
< HTTP/1.1 200 OK
< Cache-Control: private
< Content-Type: text/html; charset=utf-8
< Last-Modified: Fri, 21 Oct 2016 09:01:29 GMT
< X-Frame-Options: SAMEORIGIN
< X-Request-Guid: 405a2900-543b-4a97-8c62-8fa9019ab934
< Content-Length: 77809
< Accept-Ranges: bytes
< Date: Fri, 21 Oct 2016 09:18:59 GMT
< Via: 1.1 varnish
< Age: 0
< Connection: keep-alive
< X-Served-By: cache-ams4437-AMS
< X-Cache: MISS
< X-Cache-Hits: 0
< X-Timer: S1477041539.483029,VS0,VE95
< X-DNS-Prefetch-Control: off
< Set-Cookie: prov=aef7ece4-db49-60e0-3209-a2a2830d8749;         domain=.***.com; expires=Fri, 01-Jan-2055 00:00:00 GMT; path=/; HttpOnly
< 
<!DOCTYPE html>
<html itemscope itemtype="http://schema.org/QAPage">
......

【讨论】:

.net下的面向工控领域的远程方法调用(rmi)中间件,客户端协议栈应答端实现

...流的方式返回,服务器端按照通信协议,做封包处理,而客户端的应答处理部分,从通信连接会话上,接收到待解析的字节流数据,负责解析,转化成客户端可执行的结构体数据。解包过程时,需要从外到内逐级向下,上级解包... 查看详情

rmi是干啥用的在java里面

...I-IIOP中的范例,没有其它的选择。直接在你的对象实现上执行远程调用是不可能的,你只能在对象类的接口上单独进行这一操作。所以我们在使用RMI-IIOP时,你必须建立一个客户接口,叫做remoteinterface。这个远程接口应该扩展java... 查看详情

7.go语言高并发与微服务实战---远程过程调用rpc

第7章远程过程调用RPC7.1RPC机制和实现过程 7.1.1RPC机制 1.客户端进程以正常的方式调用客户存根 2.客户存根生成一个消息,然后调用本地操作系统的网络模块,存根进入阻塞状态 3.客户端操作系统将网络消息发送给远程操作系... 查看详情

远程过程调用和 MIDL:如何实现具有 [out] 属性的功能?

...使用C++中的接口定义语言和远程过程调用来编写服务器和客户端。我可以使用[in]属性将数据从客户端发送到服务器。现在我希望服务器将数据发送回客户端。但我未能收到 查看详情

对 C++ 对象的并发远程过程调用

...象,然后将其存储在std::map中。我希望RPC服务器监听来自客户端的调用,获取从客户端传递的参数,在map中查找适当的值,进行计算,并将计 查看详情

从 Java 调用目录过程执行 SSIS 包

】从Java调用目录过程执行SSIS包【英文标题】:ExecuteSSISpackagefromJavacallingCatalogprocedures【发布时间】:2017-03-1316:23:35【问题描述】:所以我想做的是调用一个存储过程usp_Something,其中包含类似这样的内容EXEC[SSISDB].[catalog].[create_exe... 查看详情

rpc(remoteprocedurecall)及其应用(java版)(代码片段)

...添加Dubbo依赖:配置服务:配置服务注册中心配置客户端:服务调用一、简介1.1什么是rpcRPC(RemoteProcedureCall,远程过程调用)是一种远程调用程序的技术,它允许程序在不同的地址空间中相互通信,像调用本... 查看详情

在远程过程调用中返回记录列表

...5:31【问题描述】:我正在使用smartGWT移动作为前端,我从客户端UI发出rpc调用作为回报,我需要记录列表。如果我使用记录列表,它会引发一个编译错误,提示未导入或找到记录列表包。我需要它以记录列表的形式。例如,我必... 查看详情

什么是远程过程调用?

...术如消息传递一道,作为系统间通信的一种机制。客户机执行自己的任务,但靠服务器提供后端文件服务。RPC为客户机提供向后端服务器申请服务的通信机制,如图R-4所示。如果你把客户机/服务器应用程序想作是一个分离的程... 查看详情

rabbitmq九:远程过程调用rpc

...网络分布式多程序在内的应用程序更加容易。 PRC采用客户端/服务端模式,请 查看详情

java基础十一[远程部署的rmi](阅读headfirstjava记录)

...输入/输出。远程过程调用需要创建出4种东西:服务器、客户端、服务器辅助设施、客户端辅助设施 RMIJava的JMI提供客户端和服务器端的辅助设施对象(stub和skeleton,现在实际只用stub文件,客户端和服务端用一个)辅助设施... 查看详情

来自 Python | 的远程过程调用红宝石 | ... 到 C++

...09:19【问题描述】:TL;DR:是否有框架可以从用X语言编写的客户端进程调用用C++编写的服务器进程?我不介意我使用TCP/IP或UDP或HTTP在进程之间进行通信。详情:我编写了一个 查看详情

java分布式:rpc(远程过程调用)

...一个查询的接口IDBQuery,以及其实现类DBQueryImp,如果我们执行IDBQuery查询方法,只需要new一个DBQueryImp然后调用request方法即可,这就是本地函数调用,因为在同一个地址空间或者同一块内存,通过方法栈和参数栈就可以实现。 ... 查看详情

远程过程调用与本地过程调用

...息,以及它们不清楚的地方。RPC是进程间通信技术,允许客户端和服务器软件在分布式环境中进行通信。LPC用于两个 查看详情

javasecrmi(代码片段)

...程⽅法调⽤的流程:先介绍各个部分的功能作用:Stub:客户端调用一个被称为Stub(存根)的客户端代理对象。该代理对象负责对客户端隐藏网络通讯的细节。Stub写着如何通过网络套接字(Socket)发送调用,包括如何将调用参数... 查看详情

javarmi远程通讯

...调用,在Java里提供了完整的sockets通讯接口,但sockets要求客户端和服务端必须进行应用级协议的编码交换数据,采用sockets是非常麻烦的。  一个代替Sockets的协议是RPC(RemoteProcedureCall),它抽象出了通讯接口用于过程调用,使得编... 查看详情

rabbitmq远程过程调用(rpc)(代码片段)

...种模式为远程过程调用或者RPC.通过RabbitMQ进行RPC很容易,客户端发送请求消息,服务器回复响应消息.为了接收响应,我们需要发送带有“回调”队列地址的请求.同时,这里面涉及到几个比较重要的消息属性:消息属性Durable: 将消息... 查看详情

用于远程过程调用 unix 的端口和 ip

...题描述】:我正在使用RPC(远程过程调用)制作服务器-客户端程序。客户端向服务器发送三个数字,服务器计算数字的总和,如果它大于当前总和,则服务器将这三个数字发回给客户端。但我希望服务器发回客户端的端口和IP,... 查看详情