JAVA和.NET互调用
通过接口实现JAVA和.NET互调用-JNInterface
使用C#编程多年,也十分感激微软在语言架构、语法糖、编辑器等方面给自己带来的便利。但因为最近工作中有接触到JAVA,渐渐地发现的确像大家说的那样,JAVA的生态很好,要找点什么几乎都有现成的,于是自然就想到了能不能用.NET来调用JAVA。
具了解,有个JNBridge的软件,可以"Bridge any Java with any .NET, anywhere",也许很好用,但是付费的,不喜欢。
又了解了一下其他的方法,都不怎么通用,支持不健全。
当然,通过WebService肯定是可以的,但是一直不喜欢webservice的臃肿。
于是就自己写了一个轻量级的小组件,java和.net各一个本版,都包含一个客户端和服务端,两个本版的客户端都可以与两个本版的服务端通信。
一句话概括来说就是:服务端监听客户端的请求,收到请求后会找到事先注册好的处理程序,处理后再返回客户端。(如果这个过程不了解,那么说明尊驾对HTTP也不了解,这段时间总有web开发者对我说http是有状态的,这一部分人应该也不理解...)
流程是很简单的,第一步就是定义消息体了,可以理解为HTTP协议定义的消息体,HTTP里有请求和应答,这里自然也有两个相似的东西,和实际生活中好多例子一样,比如有人问你"你吃饭了吗?",出于礼貌,不管你吃了没吃,当时心情如何,都应该回复人家。
这里我定义JNInvokeMessage和JNReturnMessage两个消息类(为了看起来清晰,贴出C#简化代码,java的基本是一样的)
JNInvokeMessage.cs
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
|
public class JNInvokeMessage{ public string targetName { get; set; } public Dictionary<string, object> parameters; public JNInvokeMessage(string targetName) { this.targetName = targetName; } public JNInvokeMessage setParam(string key, object value) { lock (this) { if (parameters == null) parameters = new Dictionary<string, object>(); } parameters[key] = value; return this; } public object getParam(string key) { if (parameters == null) return null; object obj; if (parameters.TryGetValue(key, out obj)) { return obj; } return null; }} |
JNReturnMessage.cs
|
1
2
3
4
5
6
7
8
|
public class JNReturnMessage{ public bool ok { get; set; } public string error { get; set; } public object value { get; set; }} |
下一步就是定义一个接口契约了,在C#里,可以定义一个委托:
|
1
|
public delegate JNReturnMessage IJNInterface(JNInvokeMessage invokeMessage); |
java里,没有委托,所以我们定义一个接口:
|
1
2
3
|
public interface IJNInterface { JNReturnMessage invoke(JNInvokeMessage invokeMessage);} |
都是大同小异的东西,.NET委托其实是类。
接下来就是实现Client和Server了,基本都是一些通信逻辑,老套路了网上都有,就不帖代码了,主要就是Server里有个interfaces,来保存接口处理程序,处理程序相等于MVC的Controller里的Action。在.net里用Dictionary,java里用map:
|
1
|
private Dictionary<string, IJNInterface> interfaces = new Dictionary<string, IJNInterface>(); |
|
1
|
private Map<String, IJNInterface> interfaces = new HashMap<String, IJNInterface>(); |
字典的key就相当于url,唯一确定要调用的处理程序。
两边开启服务和客户端调用写法基本都是一样的,下面展示java开启服务,在.net客户端调用:
java service
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
static void startServer() throws IOException { JNServer server = new JNServer(); server.addInterface("test", invokeMessage -> { System.out.println(invokeMessage.toJson()); JNReturnMessage returnMessage = new JNReturnMessage(true, "hello .net"); return returnMessage; }); server.addInterface("home/index", new IJNInterface() { @Override public JNReturnMessage invoke(JNInvokeMessage invokeMessage) { System.out.println(invokeMessage.toJson()); JNReturnMessage returnMessage = new JNReturnMessage(true, new int[]{1, 2, 3, 4, 5}); return returnMessage; } }); server.start();} |
.net Client:
|
1
2
3
4
5
6
7
8
9
10
11
12
|
static void Main(string[] args){ //new Thread(new ThreadStart(startServer)).Start(); //Thread.Sleep(1000); JNClient client = new JNClient(); JNInvokeMessage msg = new JNInvokeMessage("test"); var ret = client.Invoke(msg); Console.WriteLine(ret.toJson());} |
.net控制台显示,说明我们调用成功:

如果调用失败,ok为false,error是错误的描述。
把java程序或.net程序注册为服务,在windows上建议使用srvany.exe,简单好用,这里是SrvanyUI_1.0下载,下面是我测试用的java服务设置:

程序路径就是 java.exe,启动参数就是 -jar "服务jar包的路径"
注意:
消息格式是JSON,java里用了fastjson,.net里用了Newtonsoft.Json,所以如果在返回值或参数里用了复杂的对象或集合数组类的,反序列化处理应该是fastjson里的JSONObject和JSONArray,Newtonsoft.Json里的JObject和JArray。
下载:
源码:
JAVA和.NET互调用的更多相关文章
- 通过接口实现JAVA和.NET互调用-JNInterface
使用C#编程多年,也十分感激微软在语言架构.语法糖.编辑器等方面给自己带来的便利.但因为最近工作中有接触到JAVA,渐渐地发现的确像大家说的那样,JAVA的生态很好,要找点什么几乎都有现成的,于是自然 ...
- Java中是否可以调用一个类中的main方法?
前几天面试的时候,被问到在Java中是否可以调用一个类中的main方法?回来测试了下,答案是可以!代码如下: main1中调用main2的主方法 package org.fiu.test; impor ...
- java: Runtime和Process调用本机程序
java: Runtime和Process调用本机程序 调用纸牌程序,Process用来销毁程序 import java.io.IOException; public class RunTimeDem ...
- java本地方法如何调用其他程序函数,方法详解
JNI是Java Native Interface的缩写,中文为JAVA本地调用.从Java 1.1 开始,Java Native Interface (JNI)标准成为java平台的一部分,它允许J ...
- Java RMI 远程方法调用
Java RMI 指的是远程方法调用 (Remote Method Invocation).它是一种机制,能够让在某个 Java 虚拟机上的对象调用另一个 Java 虚拟机中的对象上的方法.可以用此方 ...
- Java构造器:级联调用,调用兄弟构造器
级联调用: class Father{ Father(){ System.out.println("Father birth"); } public void announce() ...
- java 中使用ajax调用后台方法注意事项
java 中使用ajax调用后台方法注意事项,后台方法一定要加@ResponseBody jQuery.validator.addMethod("checkRuleName",fu ...
- java接口对接——别人调用我们接口获取数据
java接口对接——别人调用我们接口获取数据,我们需要在我们系统中开发几个接口,给对方接口规范文档,包括访问我们的接口地址,以及入参名称和格式,还有我们的返回的状态的情况, 接口代码: package ...
- Android JNI学习(三)——Java与Native相互调用
本系列文章如下: Android JNI(一)——NDK与JNI基础 Android JNI学习(二)——实战JNI之“hello world” Android JNI学习(三)——Java与Nati ...
随机推荐
- UTL_FILE 的用法
UTL_FILE 的用法 UTL_FILE 是用来进行文件IO处理的专用包,使用这外包的注意事项如下: 1. 生成的文件好象只能放置在DATABASE所在的服务器路径中. 2. 生成的文件如何DO ...
- 记录下url拼接的多条件筛选js
本着为提高工作效率百度或者google这些代码发现拿过来的都不好用,然后自己写了个,写的一般但记录下以后再优化 <html> <head> <script> $(f ...
- Windows vista以上模拟Alt Ctrl Delete
之前客户要求我们能够在windows登陆界面能够用指定账户批量控制机器登陆,然后用windows credentials provider(vista以上,xp需要用Gina)实现了这个功能,这期间遇 ...
- centos安装中文支持(转)
安装中文支持包. yum install fonts-chineseyum install fonts-ISO8859-2 -------- 一.安装中文支持方法1.在安装光盘中找到一下包进行安装.r ...
- 扩展VirtualBox虚拟机磁盘容量
1. 在cmd命令行下进入VirtualBox的安装目录,使用“VBoxManage list hdds”命令,找到需要修改磁盘容量的虚拟机的img路径或UUID: VirtualBox安装目录> ...
- querySelectorAll的BUG
querySelector和querySelectorAll是W3C提供的新的查询接口 目前 IE8/9及Firefox/Chrome/Safari/Opera 的最新版已经支持它们. 但是Eleme ...
- jquery学习(3)--高级选择器
自己手写的学习笔记.常规选择器: /****************学习--高级选择器(1)****************/---高级选择器:ie7+ 层次选择器: 后代选择器 ul li ...
- IIS怎么设置本地域名解析(本地域名测试配置)
对于IIS相信大家都不陌生,可以用来作为网站服务器,可以解析网站内容,访问时可以用端口的方式访问,也可以用域名的方式访问.下面我就介绍一下,怎么在本地用域名的方式访问,怎么用IIS进行本地域名解析. ...
- Android IT资讯网络阅读器应用源码
这个是Android IT资讯网络阅读器应用,也是一款通过jsoup解析Html获取内容的网络阅读器,和前面的其实是类似的,也是大学时期闲暇完成,对照CSDN的Web页面元素设计进行解析提取内容,核心 ...
- 如何解决”无法将类型为“System.DateTime”的对象强制转换为类型“System.String”。“
字段Time在数据库中为datetime类型 dr.GetString(3).ToString() dr.GetString(3).ToString() => dr.GetDateTime(3) ...