我正在开发一个拥有主机和客户端的项目,主机可以向客户端发送命令(通过套接字)。
我确定使用JSON进行通信效果最佳。
例如:
{
"method" : "toasty",
"params" : ["hello world", true]
}
在此示例中,当此JSON字符串发送到客户端时,将对其进行处理,并在客户端中运行合适的方法:
public abstract class ClientProcessor {
public abstract void toasty(String s, boolean bool);
public abstract void shutdown(int timer);
private Method[] methods = getClass().getDeclaredMethods();
public void process(String data) {
try {
JSONObject json = new JSONObject(data);
String methodName = (String) json.get("method");
if (methodName.equals("process"))
return;
for (int i = 0; i < methods.length; i++)
if (methods[i].getName().equals(methodName)) {
JSONArray arr = json.getJSONArray("params");
int length = arr.length();
Object[] args = new Object[length];
for (int i2 = 0; i2 < length; i2++)
args[i2] = arr.get(i2);
methods[i].invoke(this, args);
return;
}
} catch (Exception e) {}
}
}
使用ClientProcessor:
public class Client extends ClientProcessor {
@Override
public void toasty(String s, boolean bool) {
//make toast here
}
@Override
public void shutdown(int timer) {
//shutdown system within timer
}
public void processJSON(String json) {
process(json);
}
}
服务器将JSON发送到客户端,但可以修改服务器以发送不同的JSON。
我的问题是:
答案 0 :(得分:4)
有100种方法可以处理JSON消息,以便进行一些处理,但它们都归结为:
虽然您可以使用反射调用(在性能方面,大多数情况下都可以)调用方法,但是,imho会有点过于开放 - 恶意客户端可能会因为发出{而导致系统崩溃{1}}来电。
反射还会让您不得不正确映射参数,这比您在问题中显示的代码更复杂。
所以不要使用Reflection。
你能做的是定义一个简单的wait
,其中的实现将理解如何处理参数并让你的处理器(通常称为控制器)调用它,像这样的东西:
interface
答案 1 :(得分:0)
将方法名称映射到int常量,并在这些常量上切换(case)以调用适当的方法。
M
答案 2 :(得分:-3)
我相信您正在尝试将JSON字符串转换为Java对象,反之亦然......如果这是要求,那么这将不是正确的方法......
尝试任何像Gson这样的开源API ... 它是Google用于将Java转换为JSON的API,反之亦然。
请检查...... https://google-gson.googlecode.com/svn/trunk/gson/docs/javadocs/com/google/gson/Gson.html
如果您有任何其他问题,请告诉我......