使用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. public class JNInvokeMessage
  2. {
  3. public string targetName { get; set; }
  4.  
  5. public Dictionary<string, object> parameters;
  6.  
  7. public JNInvokeMessage(string targetName)
  8. {
  9. this.targetName = targetName;
  10. }
  11.  
  12. public JNInvokeMessage setParam(string key, object value)
  13. {
  14. lock (this)
  15. {
  16. if (parameters == null) parameters = new Dictionary<string, object>();
  17. }
  18. parameters[key] = value;
  19. return this;
  20. }
  21.  
  22. public object getParam(string key)
  23. {
  24. if (parameters == null) return null;
  25. object obj;
  26. if (parameters.TryGetValue(key, out obj))
  27. {
  28. return obj;
  29. }
  30. return null;
  31. }
  32. }

 JNReturnMessage.cs

  1. public class JNReturnMessage
  2. {
  3. public bool ok { get; set; }
  4.  
  5. public string error { get; set; }
  6.  
  7. public object value { get; set; }
  8. }

下一步就是定义一个接口契约了,在C#里,可以定义一个委托:

  1. public delegate JNReturnMessage IJNInterface(JNInvokeMessage invokeMessage);

java里,没有委托,所以我们定义一个接口:

  1. public interface IJNInterface {
  2. JNReturnMessage invoke(JNInvokeMessage invokeMessage);
  3. }

都是大同小异的东西,.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. static void startServer() throws IOException {
  2. JNServer server = new JNServer();
  3.  
  4. server.addInterface("test", invokeMessage -> {
  5. System.out.println(invokeMessage.toJson());
  6. JNReturnMessage returnMessage = new JNReturnMessage(true, "hello .net");
  7. return returnMessage;
  8. });
  9. server.addInterface("home/index", new IJNInterface() {
  10. @Override
  11. public JNReturnMessage invoke(JNInvokeMessage invokeMessage) {
  12.  
  13. System.out.println(invokeMessage.toJson());
  14. JNReturnMessage returnMessage = new JNReturnMessage(true, new int[]{1, 2, 3, 4, 5});
  15.  
  16. return returnMessage;
  17. }
  18. });
  19. server.start();
  20. }

.net Client:

  1. static void Main(string[] args)
  2. {
  3. //new Thread(new ThreadStart(startServer)).Start();
  4. //Thread.Sleep(1000);
  5.  
  6. JNClient client = new JNClient();
  7.  
  8. JNInvokeMessage msg = new JNInvokeMessage("test");
  9.  
  10. var ret = client.Invoke(msg);
  11. Console.WriteLine(ret.toJson());
  12. }

.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。

下载:

JNInterface

源码:

http://git.oschina.net/loogn/Loogn.JNInterface.JAVA

http://git.oschina.net/loogn/Loogn.JNInterface.NET

通过接口实现JAVA和.NET互调用-JNInterface的更多相关文章

  1. 【Java EE 学习 21 下】【 使用易宝支付接口实现java网上支付功能】

    一.网上支付分为两种情况,一种方法是使用直接和银行的支付接口,另外一种方法是使用第三方支付平台和银行对接完成支付. 1.直接和银行对接. 2.使用第三方支付平台 3.常见的第三方支付平台 二.使用易宝 ...

  2. 零成本实现接口自动化测试 – Java+TestNG 测试Restful service

    接口自动化测试 – Java+TestNG 测试 Restful Web Service 关键词:基于Rest的Web服务,接口自动化测试,数据驱动测试,测试Restful Web Service, ...

  3. 我对面向对象设计的理解——Java接口和Java抽象类

    在没有好好地研习面向对象设计的设计模式之前,我对Java接口和Java抽象类的认识还是很模糊,很不可理解. 刚学Java语言时,就很难理解为什么要有接口这个概念,虽说是可以实现所谓的多继承,可一个只有 ...

  4. 命名和目录接口 JNDI-The Java Naming and Directory Interface

    命名和目录接口 JNDI-The Java Naming and Directory Interface JNDI (The Java Naming and Directory Interface)为 ...

  5. Java接口和Java抽象类的认识

    在没有好好地研习面向对象设计的设计模式之前,我对Java接口和Java抽象类的认识还是很模糊,很不可理解. 刚学Java语言时,就很难理解为什么要有接口这个概念,虽说是可以实现所谓的多继承,可一个只有 ...

  6. 如何使用Externalizable接口自定义Java中的序列化

    Java序列化过程的缺点 我们都知道如何使用Serializable接口序列化/反序列化一个对象,并且如何使用writeObject 和readObject方法自定义序列化过程. 但是这些自定义还不够 ...

  7. 你应该这样去开发接口:Java多线程并行计算

    所谓的高并发除了在架构上的高屋建瓴,还得需要开发人员在具体业务开发中注重自己的每一行代码.每一个细节,面子有的同时,更重要的还是要有里子. 面对性能,我们一定要有自己的工匠精神,不可以对任何一行代码妥 ...

  8. NC凭证接口(Java发送流和处理返回结果)

    问题描述: 金融行业在系统模块分为财务和业务两个系统,我公司是负责业务模块系统,NC公司负责财务系统.但是财务有时候需要生成凭证,这时候就涉及业务模块了,我方就需要写NC凭证接口.这时候就需要三方交互 ...

  9. APP接口自动化测试JAVA+TestNG(三)之HTTP接口测试实例

    前言     前两篇普及相关基础知识后,本篇主要对举例对国家气象局接口自动化测试进行讲解(Get请求及结果断言),以达到自动化测试入门目的,除了前两篇的一些了解外,需要有一定的JAVA知识(HTTP相 ...

随机推荐

  1. jQuery基础_4

    dom对象就是jquery对象的数组组成部分jquery对象和dom对象的转化jquery对象-->dom对象$()[下标]dom对象-->jquery对象$(dom对象) jquery框 ...

  2. iOS UITabBarController的使用

    UITabBarController 和 UINavigationController 几乎是iOS APP的标配. UITabBarController分栏(标签栏)控制器, 和UINavigati ...

  3. SharePoint 2013 图文开发系列之网站栏

    网站栏的本质,就是一个xml的描述文件,所以创建过程,基本就是通过Feature部署一个Xml文件,然后修改Xml文件的网站栏描述. 1.添加新项目,选择SharePoint 2013 空项目,如下图 ...

  4. 用UILocalNotification实现一个闹钟(Swift)

    之前项目需求要实现一个闹钟,github上找了半天发现都是很旧的代码了,所以就准备自己写一个,刚好最近在学习Swift,就用Swift写了一个demo放在这里:https://github.com/P ...

  5. IOS开发之Bug--View是懒加载导致出误以为是UI加载的bug

    虽然分类为bug,但也算的上是一个问题,一个很简单的问题.先来看看问题的重现,就写了简单的Demo验证效果: 问题:点击ViewController跳转到TwoViewController,发现会延迟 ...

  6. Cucumber测试驱动开发

     Cucumber是一种BDD实践开发工具,属于敏捷开发的组成部分.      在敏捷开发中,对用户进行需求分析时,不是像传统的P&D的开发方式,首先编写大量的用户需求分析文档,而是通过一个个 ...

  7. Windows Phone 8.1低功耗蓝牙开发-Nokia Treasure Tag

    1. 引言 上一篇文章<Windows 8.1 低功耗蓝牙开发>讲述了如何在Windows 8.1平台上创建低功耗蓝牙应用,并且以TI的Sensor Tag为例,给出了代码步骤和演示.其实 ...

  8. MySQL初始化的正确姿势

    1. 背景 mysql安装教程很多,但是有不少讲得过于简单,没有考虑到安全问题.比如说,一些教程里,只设置一个root用户,并且对外网公开,一来容易被破解密码(用户名固定,破解难度自然降了一大截,而且 ...

  9. Zookeeper(一)从抽屉算法到Quorum (NRW)算法

    一.抽屉算法 抽屉算法,又名鸽巢原理,它是德国数学家狄利克雷首先明确的提出来并用以证明一些数论中的问题,因此,也称为狄利克雷原则.它是组合数学中一个重要的原理. 具体算法讲的是: 第一抽屉算法: 如果 ...

  10. 为什么 MySQL 回滚事务也会导致 ibd 文件增大?

    一个简单的测试: start transaction; insert into tb1 values(3, repeat('a', 65000),'x',1); --commit; rollback; ...