JAVA与.NET的相互调用——TCP/IP相互调用基本架构(附原代码)

简介:
TCP/IP套接字的概念

TCP/IP(传输控制协议/网际协议)是网络互连的通信协议,通过它可以实现各种异构网络或异种机之间的互联通信。TCP/IP是Transmission Control Protocol/Internet Protocol的简写,中文译名为传输控制协议/因特网互联协议,又叫网络通讯协议,这个协议是Internet最基本的协议、Internet国际互联网的 基础,简单地说,就是由网络层的IP协议和传输层的TCP协议组成的。TCP/IP 定义了电子设备(比如计算机)如何连入因特网,以及数据如何在它们之间传输的标准。TCP/IP是一个四层的分层体系结构。高层为传输控制协议,它负责聚 集信息或把文件拆分成更小的包。低层是网际协议,它处理每个包的地址部分,使这些包正确的到达目的地。 TCP/IP已成为当今计算机网络最成熟、应用最广的互联协议。Internet采用的就是 TCP/IP协议,网络上各种各样的计算机上只要安装了TCP/IP协议,它们之间就能相互通信。

  

TCP/IP套接字通讯的开发

在 众多的开发语言中,绝大部分的开发语言都支持TCP/IP协议通讯,开发过程也十分相像,先设置好Socket,然后由客户端发送请求信息,服务器连接客 户端接收到请求后再返还信息。而在.NET系统当中则稍有不同,系统把Socket对象包装在TcpClient对象内,对Socket对象的生命周期进 行管理。在开发过程当中,服务器与客户端的开发语言有所不同的情况经常发生,服务器是在JDK1.6的环境下进行开发的,客户却要求使用.NET开发客户 端,这往往会令开发人员感到困惑!下面在下使用JAVA为服务器,.NET为客户端为例子,为大家介绍一下如何使用TCP/IP协议进行JAVA  .NET之间的相互调用。像TCP/IP实现聊天室这样的例子很多,开发起来也比较简单,因为通讯双方都是使用String来传送信息。而在真正建立 ERP、OA、CRM等系统的时候,通讯双方都必须先建立一套统一的通讯契约,才能实现TCP/IP通讯,下面将为大家介绍一个比较典型的企业信息通讯实 例。

 

信息传送方式

因为.NET与JAVA各有不同的特性,双方不可能直接通过的序列化对象来传输信息,常用的信息交换方式有以下三种:

1. 最 笨拙也是最复杂的一种传息方式,就是直接使用“头文件说明+字段属性”的方式。 这是一个既原始又麻烦的通讯方式,因为每个契约都要以二进制的方式发送一个请求,就算是同一类契约,随着参数的不同,每个请求的长度也会发生改变。这样的 传息方式虽然是麻烦,但在不同开发语言相互调用的时候却经常会看到,这可能是因为开发人员对两种开发语言未能完全熟悉,所以倒置使用这最原始最简单的开发 方式。


 

2. 使用XML的信息传送方式,这是最常见,使用最广的信息传递方式。在绝大多数的开发平台都会支持XML,所以XML在Web网络传讯过程中最为常见。但XML最大的一个缺点就是过于堪舆,耗费大量的传输流量。

3. 对 于XML的缺点,JSON应运而生而且发展迅速,JSON本是源于Javascript的,多数只用于B/S的页面开发,但随着技术的发展和多个开发语言 的支持,现今到处都可以看JSON的身影。因为JSON既提供一套跨平台的通讯方式,也免去XML复杂特性,受到各类型开发人员的欢迎。


服务器端开发

  • 通讯契约
首先建立一套服务器与客户端同时接受通讯契约, Contract 的name特性是契约的名称,服务器会通过此名称在Contracts.xml文件中找到该契约,然后根据output的package属性,class属性,method属性找到该契约的包名称,类名,调用的方法等属性。


  
  
  1. <Contracts> 
  2.  
  3. <Contract name="GetPersonByAge"> //name为契约名,服务器与客户端必须同时遵守此契约 
  4. <Input> 
  5. <Description>获取Age等于此值的People对象集</Description> //说明此契约内容 
  6. </Input> 
  7. <Output> 
  8. <Package>Manager</Package> //接收到GetPersonByAge请求时所调用的包名称 
  9. <Class>PersonManager</Class> //接收到GetPersonByAge请求时所调用的类名称 
  10. <Method>GetListByAge</Method> //接收到GetPersonByAge请求时所调用的处理方法名称 
  11. </Output> 
  12. </Contract> 
  13.  
  14. <Contract name="GetPersonByID"> 
  15. <Input> 
  16. <Description>获取ID等于此值的People对象</Description> 
  17. </Input> 
  18. <Output> 
  19.   <Package >Manager</Package> 
  20. <Class>PersonManager</Class> 
  21. <Method>GetListByID</Method> 
  22. </Output> 
  23. </Contract> 
  24.  
  25. </Contracts> 
  • 以JSON方式实现信息传送

尽管目前在C/S的开发当中大部分还是使用序列化对象和分节字段的方式进行双方通讯,但在这个实例当中,在下想以JSON通讯方式为例子来实现。首先,客户端会使用额定格式的JSON向服务器发送请求: 

{“ContractName”:“GetPeopleByAge”,“Params”:[23]}

ContractName代表着契约名称,系统会根据此名称在Contracts.xml文件中找到Name等于GetPeopleByAge的Contract项。然后在对应Output的子项Package,Class,Method中查找到对应的包,类型和方法。

Params是客户端传输过来的参数,服务器端会调用对象的方法输入参数23后,得到计算结果,最后把结果返还到客户端。

在 这里有两点是值得注意的,第一点是JSON中的契约格式是固定的,服务器与客户端都必须遵守此契约,在ContractName中输入是必须对应的契约名 称,而在Params中输入的必输是一个参数的集合,哪怕里面只包含有一个参数。第二点是在Contracts.xml文件,Output里面的 Package,Class,Method是服务器端自定义的,它只是绑定了服务器端实现GetPersonByAge契约的方法,而这些方法并不是固 定,服务器可以根据系统的需要而修改。这个做法有点像Struts里面的Struts.xml文件和Spring里面的Bean绑定,其意义就是要遵守 DIP依赖倒置原则,实现依赖注入。

  • 基本结构


系统的基本结构如图,客户端会以JSON方式{“ContractName”:“GetPeopleByAge”,“Params”:[23]}发送请求到服务器,服务器会利用“数据转换层”把接收到的请求转换成Contract对象。然后逻辑转换层会根据该Contract对象调用对应的方法,最后把计算结果以JSON方式返回到客户端。

注意在服务器与客户端信息交换的过程中,都是使用JSON格式。

 

  • JSON数据转换

在服务器端,当接到到客户端请求后,Transfer类负责把接收到的JSON数据转换成Contract对象。在Transfer里面使用org.json工具包作为JSON的转化工具,org.json工具包可于以下网址下载http://www.json.org/java/index.html

而Implement类包含GetResult(Contract contract )方法,其作就是根据contract对象Package,Class,Method等属性,调用“逻辑转换层”的对应方法,最后把计算结果返还给InputControl。

服务器端接收请求后就会直接调用InputControl对输入的数据进行处理。

 


  
  
  1. //Contract实体类,包含契约的package,class,method,params等多个属性 
  2. package Model; 
  3.  
  4. import org.json.JSONArray; 
  5.  
  6. public class Contract { 
  7. private String package1; 
  8. private String class1; 
  9. private String method; 
  10. private JSONArray params; 
  11. public void setPackage1(String package1) { 
  12. this.package1 = package1; 
  13. public String getPackage1() { 
  14. return package1; 
  15. public void setClass1(String class1) { 
  16. this.class1 = class1; 
  17. public String getClass1() { 
  18. return class1; 
  19. public void setMethod(String method) { 
  20. this.method = method; 
  21. public String getMethod() { 
  22. return method; 
  23. public void setParams(JSONArray params) { 
  24. this.params = params; 
  25. public JSONArray getParams() { 
  26. return params; 
  27.  
  28.  
  29. //把输入的String字符串转化为Contract对象 
  30. //在这里使用org.json工具包作为JSON的转化工具,org.json工具包可于以下网址下载http://www.json.org/java/index.html 
  31. package Common; 
  32. import java.io.File; 
  33. import java.io.IOException; 
  34. import javax.xml.parsers.DocumentBuilder; 
  35. import javax.xml.parsers.DocumentBuilderFactory; 
  36. import javax.xml.parsers.ParserConfigurationException; 
  37. import Model.Contract; 
  38. import org.json.*; 
  39. import org.w3c.dom.Document; 
  40. import org.w3c.dom.Element; 
  41. import org.w3c.dom.NodeList; 
  42. import org.xml.sax.SAXException; 
  43.  
  44. public class Transfer { 
  45. private Transfer(){} 
  46.  
  47. private static String contractName=null
  48. private static Contract contract=new Contract(); 
  49. private static JSONObject jsonObject=null
  50.  
  51. public static Contract GetContract(String data) throws Exception, JSONException, ParserConfigurationException, SAXException, IOException{ 
  52. jsonObject=new JSONObject(data); //把字符串转化为JSONOject对象 
  53. GetContractName(); //获取契约名称 
  54. GetProperty(); //获取契约的package,class,method属性 
  55. GetParams(); //获取契约的参数集 
  56. return contract; 
  57.  
  58. /* 
  59. * 获取契约对应的包名称,类名称,方法名称 
  60. */ 
  61. private static void GetProperty() throws Exception{ 
  62. File file = new File("Contracts.xml"); 
  63. DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 
  64. DocumentBuilder builder = factory.newDocumentBuilder(); 
  65. Document doc = builder.parse(file); 
  66. NodeList nodeList = doc.getElementsByTagName("Contract"); 
  67. Element contractElement=null
  68. for (int i = 0; i < nodeList.getLength(); i++) { 
  69. if(nodeList.item(i).getAttributes().item(0).getNodeValue().equals(contractName)){ 
  70. contractElement=(Element)nodeList.item(i); 
  71. break
  72. if(contractElement!=null){ 
  73. Element outputElement=(Element)contractElement.getElementsByTagName("Output").item(0); 
  74. contract.setPackage1(outputElement.getElementsByTagName("Package").item(0).getTextContent()); 
  75. //获取包名称 
  76. contract.setClass1(outputElement.getElementsByTagName("Class").item(0).getTextContent()); 
  77. //获取类名称 
  78. contract.setMethod(outputElement.getElementsByTagName("Method").item(0).getTextContent()); 
  79. //获取方法名 
  80. else 
  81. throw new Exception("未能找到对象的契约"); 
  82.  
  83. /* 
  84. * 获取契约名称 
  85. */ 
  86. private static void GetContractName() throws JSONException{ 
  87. contractName=jsonObject.getString("ContractName"); 
  88.  
  89. /* 
  90. * 获取输入参数 
  91. */ 
  92. private static void GetParams() throws JSONException{ 
  93. contract.setParams(jsonObject.getJSONArray("Params")); 
  94.  
  95. //调用Contract对象里面包中的类的某个方法,获取计算结果 
  96. package Common; 
  97. import java.lang.reflect.Method; 
  98. import java.util.HashMap; 
  99. import java.util.Map; 
  100. import org.json.JSONArray; 
  101. import Model.*; 
  102.  
  103. public class Implement { 
  104. private Contract contract; 
  105. private String fullName; 
  106. private static Map<String,Object> objects=new HashMap<String,Object>(); //保存对象实体 
  107. private static Map<String,Class> classes=new HashMap<String,Class>(); //保存类名 
  108.  
  109. /* 
  110. * 先获取对应的对象,再用反射模式调用对象的方法,获取计算结果 
  111. */ 
  112. public Object GetResult(Contract contract){ 
  113. this.contract=contract; 
  114. this.fullName=contract.getPackage1()+"."+contract.getClass1(); 
  115.  
  116. try { 
  117. Object manager=GetObject(); 
  118. Class theClass=classes.get(fullName); 
  119. Method method=theClass.getDeclaredMethod(contract.getMethod(),JSONArray.class); 
  120. return method.invoke(manager, contract.getParams()); 
  121. catch (Exception e) { 
  122. // TODO Auto-generated catch block 
  123. e.printStackTrace(); 
  124. return null
  125.  
  126. /* 
  127. * 多次使用反射创建获取对象会损耗一定性能,所以此处使用单体模式获取对应的对象 
  128. */ 
  129. private Object GetObject() throws InstantiationException, IllegalAccessException, ClassNotFoundException{ 
  130. if(!objects.containsKey(fullName)){ 
  131. Class theClass = Class.forName(fullName); 
  132. classes.put(fullName,theClass); 
  133. Object manager=theClass.newInstance(); 
  134. objects.put(fullName, manager); 
  135. return objects.get(fullName); 
  136.  
  137. //直接把接收到的二进制数据转换成String,然后通过Transfer把String转化为Contract对象,最后通过Implement获取运算结果 
  138. package Common; 
  139.  
  140. import java.io.DataInputStream; 
  141. import Model.Contract; 
  142.  
  143. public class InputControl { 
  144. private DataInputStream inputStream; 
  145.  
  146. public InputControl(DataInputStream inputStream){ 
  147. this.inputStream=inputStream; 
  148. /* 
  149. * 直接把接收到的二进制数据转换成String,然后通过Transfer把String转化为Contract对象,最后通过Implement对象获取运算结果 
  150. */ 
  151. public Object GetResult(){ 
  152. byte[] byteMessage=new byte[1024]; //在此处只获取测试数据,在真正运行时应使用分批缓存的方式 
  153. try
  154. int n=inputStream.read(byteMessage); 
  155. String message=new String(byteMessage,"ASCII"); 
  156. Contract contract=Transfer.GetContract(message); 
  157. Implement implement=new Implement(); 
  158. Object result=implement.GetResult(contract); 
  159. return result; 
  160. catch(Exception ex){ 
  161. ex.printStackTrace(); 
  162. return null

最后,系统通过OutputControl类把计算结果返还给客户端。



  
  
  1. //把计算结果返回到客户端 
  2. package Common; 
  3.  
  4. import java.io.DataOutputStream; 
  5.  
  6. public class OutputControl { 
  7. private DataOutputStream outputStream; 
  8.  
  9. public OutputControl(DataOutputStream outputStream){ 
  10. this.outputStream=outputStream; 
  11.  
  12. public void Output(Object data){ 
  13. try
  14. outputStream.writeBytes(data.toString()); 
  15. outputStream.flush(); 
  16. }catch(Exception ex){ 
  17. ex.printStackTrace(); 
  18.  
  19. //运行系统进行测试 
  20. package Common; 
  21.  
  22. import java.io.*; 
  23. import java.net.*; 
  24.  
  25. public class Program { 
  26. private static ServerSocket serverSocket; 
  27.  
  28. public static void main(String[] args) throws ClassNotFoundException { 
  29. // TODO Auto-generated method stub 
  30. Socket socket; 
  31. try { 
  32. serverSocket=new ServerSocket(5100); //激活5100端口 
  33. while(true){ //循环捕捉请求 
  34. socket=serverSocket.accept(); 
  35. DataOutputStream outStream=new DataOutputStream(socket.getOutputStream()); //获取DataOutputStream输出流 
  36. DataInputStream inputStream=new DataInputStream(socket.getInputStream()); //获取DataInputStream输入流 
  37.  
  38. //调用InputControl对象获取运算结果 
  39. InputControl inputControl=new InputControl(inputStream); 
  40. Object result=inputControl.GetResult(); 
  41. //调用OutputControl对象输入运算结果 
  42. OutputControl outputControl=new OutputControl(outStream); 
  43. outputControl.Output(result); 
  44. catch (Exception e) { 
  45. // TODO Auto-generated catch block 
  46. e.printStackTrace(); 
  • 逻辑转换层

现在先开发一个例子作为参考,在完成客户端开发的时候就可以进行测试。这个例子是先在Manager包里面设置好一个类 PersonManager,PersonManager类中包含一个名为GetListByAge的方法。在Contracts.xml文件设置一个名 为GetPersonByAge的契约,客户端就可以通过这个契约在远程调用此方法获取计算结果。



  
  
  1. //设置Person对象 
  2. package Model; 
  3.  
  4. public class Person { 
  5. private int id; 
  6. private String name; 
  7. private int age; 
  8. public void setId(int id) { 
  9. this.id = id; 
  10. public int getId() { 
  11. return id; 
  12. public void setName(String name) { 
  13. this.name = name; 
  14. public String getName() { 
  15. return name; 
  16. public void setAge(int age) { 
  17. this.age = age; 
  18. public int getAge() { 
  19. return age; 
  20.  
  21. //开发PersonManager 
  22. package Manager; 
  23. import java.util.ArrayList; 
  24. import java.util.List; 
  25. import org.json.JSONArray; 
  26. import org.json.JSONException; 
  27. import Model.*; 
  28.  
  29. public class PersonManager { 
  30. /* 
  31. * 测试数据 
  32. */ 
  33. private List<Person> GetList(){ 
  34. List<Person> personList=new ArrayList<Person>(); 
  35. Person person1=new Person(); 
  36. person1.setId(0); 
  37. person1.setAge(23); 
  38. person1.setName("Mike"); 
  39. personList.add(person1); 
  40.  
  41. Person person2=new Person(); 
  42. person2.setId(1); 
  43. person2.setAge(29); 
  44. person2.setName("Leslie"); 
  45. personList.add(person2); 
  46.  
  47. Person person3=new Person(); 
  48. person3.setId(2); 
  49. person3.setAge(21); 
  50. person3.setName("Jack"); 
  51. personList.add(person3); 
  52.  
  53. Person person4=new Person(); 
  54. person4.setId(3); 
  55. person4.setAge(23); 
  56. person4.setName("Rose"); 
  57. personList.add(person4); 
  58. return personList; 
  59.  
  60. /* 
  61. * 获取年龄等于age参数的Person,因为数据将返还给客户端,所以这时把输出数据转化为JSONArray 
  62. */ 
  63. public JSONArray GetListByAge(JSONArray jsonList) throws JSONException{ 
  64. int age=jsonList.getInt(0); //因为输入参数为一个集合params,所以即使只包括一个参数,也是通过要jsonList的第一个参数来获取的。 
  65. List<Person> personList=GetList(); 
  66. List<Person> resultList=new ArrayList<Person>(); 
  67.  
  68. for(int n=0;n<personList.size();n++){ 
  69. if(personList.get(n).getAge()==age) 
  70. resultList.add(personList.get(n)); 
  71.  
  72. JSONArray jsonArray=new JSONArray(resultList); 
  73. return jsonArray; 

然后在Contracts.xml设置绑定


  
  
  1. <Contracts> 
  2. <Contract name="GetPersonByAge"> //契约名称 
  3. <Input> 
  4. <Description>获取Age等于此值的People对象集</Description> //文字说明 
  5. </Input> 
  6. <Output> 
  7. <Package>Manager</Package> //绑定包 
  8. <Class>PersonManager</Class> //绑定类 
  9. <Method>GetListByAge</Method> //绑定处理方法 
  10. </Output> 
  11. </Contract> 
  12. </Contracts> 

绑定以后,在完成客户端开发的时候就可以进行测试。使用这开发模式的好处在于利用JSON作用数据传输的桥梁,解决不同开发平台之间数据难以同步的 问题。使用JSON比XML更容易操作,可以减少传输流量,而且受到各开发语言的支持。使用Contracts.xml在服务器绑定处理方式,遵守了 DIP的开发原则,使服务器的处理方法与客户端发送的请求实现分离。下面开始介绍一下客户端的开发。


客户端开发

客户端的开发的开发相对简单,因为契约是使用   {“ContractName”:“GetPeopleByAge”,“Params”:[23]}    JSON方式进行传送,所以先开发一个MessageEntity实体类来承载契约。


  
  
  1. namespace Model 
  2. [DataContract] 
  3. public class MessageEntity 
  4. //契约名称 
  5. [DataMember] 
  6. public string ContractName 
  7. get; 
  8. set; 
  9.  
  10. //注意参数使用集合的方式来传送 
  11. [DataMember] 
  12. public IList<Object> Params 
  13. get; 
  14. set; 

然后开发一个MessageManager信息管理器来管理契约的传送过程,因为Framework4.0里面,未能对JSON数据中集合的转换提供一个简单函数,所以在MessageManager里面使用了一个Newtonsoft.Json工具包,该工具包里面对JSON的操作有着强大支持,可以在http://www.codeplex.com/官方网站下载


  
  
  1. using System; 
  2. using System.Collections.Generic; 
  3. using System.Linq; 
  4. using System.Text; 
  5. using System.Net.Sockets; 
  6. using System.Runtime.Serialization.Json; 
  7. using System.IO; 
  8. using System.Threading; 
  9. using Model; 
  10. using Newtonsoft.Json; 
  11.  
  12. namespace Common 
  13. public class MessageManager 
  14. private static TcpClient _tcpClient; 
  15.  
  16. //设置tcpClient对象 
  17. public static TcpClient TcpClient 
  18. set { _tcpClient = value; } 
  19.  
  20. //此处只使用静态方法实现数据传送,发送请求后使用Thread.Sleep等待运算结果,这样存在一定风险,也会降低效率 
  21. //在大型的开发当中应该进一步改善,把信息发送与信息接收分开处理 
  22. public static object GetMessage(MessageEntity message, Type type) 
  23. NetworkStream networkStream = _tcpClient.GetStream(); 
  24. //利用DataContractJsonSerializer将MessageEntity对象实现序列化,发送到服务器 
  25. DataContractJsonSerializer jsonSerializer = new DataContractJsonSerializer(typeof(MessageEntity)); 
  26. lock (networkStream) 
  27. jsonSerializer.WriteObject(networkStream, message); 
  28. networkStream.Flush(); 
  29. Thread.Sleep(500); 
  30.  
  31. //获取回传信息,这里设置接收值1024个字节 
  32. //在实际的开发当中应该使用分批缓存的方式实现数据接收 
  33. byte[] messageByte = new byte[1024]; 
  34. int n = 0; 
  35. lock (networkStream) 
  36. n = networkStream.Read(messageByte, 0, 1024); 
  37. if (n == 0) 
  38. return null
  39.  
  40. //根据输入的type对象,把二进制信息转化为对应的对象 
  41. string jsonMessage = Encoding.ASCII.GetString(messageByte); 
  42. //利用Netonsoft.Json工具集将获取的JSON数据转化对象 
  43. object returnValue = JavaScriptConvert.DeserializeObject(jsonMessage, type); 
  44. return returnValue; 
 

下面开发一个GetPersonByAge 契约作为例子


  
  
  1. using System; 
  2. using System.Collections.Generic; 
  3. using System.Text; 
  4. using Model; 
  5. using Common; 
  6.  
  7. namespace DAL 
  8. public class PersonDAL 
  9. /// <summary> 
  10. /// 建立MessageEntity对象,注意输入额定契约名称及数据参数,获取查询结果 
  11. /// </summary> 
  12. /// <param name="age">Person的年龄</param> 
  13. /// <returns>获取年龄等于此值的Person对象集</returns> 
  14. public IList<Person> GetPersonByAge(int age) 
  15. //先建立一个MessageEntity对象,设定其ContractName及参数集合 
  16. //注意ContractName的值必须与服务器端Contracts.xml文件中Contract 项的 name 特性相对应 
  17. MessageEntity messageEntity = new MessageEntity(); 
  18. messageEntity.ContractName = "GetPersonByAge"
  19. messageEntity.Params = new List<Object> { age }; 
  20. //调用MessageManager的GetMessage方法获取计算结果 
  21. IList<Person> personList = (List<Person>)MessageManager.GetMessage(messageEntity, typeof(List<Person>)); 
  22. return personList; 

PersonDAL 类中的GetPersonByAge方法就是把契约封装在MessageEntity当中,再利用MessageManager把契约发送到服务器端获取 运行结果,然后把结果转换为JSON,最后利用Netonsoft.Json工具集的JavaScriptConvert类,把JSON转换成 Person对象。

测试


  
  
  1. Person实体例 
  2. namespace Model 
  3. public class Person 
  4. private int _id; 
  5. private string _name; 
  6. private int _age; 
  7.  
  8. public int id 
  9. get { return _id; } 
  10. set { _id = value; } 
  11.  
  12. public int age 
  13. get { return _age; } 
  14. set { _age = value; } 
  15.  
  16. public string name 
  17. get { return _name; } 
  18. set { _name = value; } 
  19.  
  20.  
  21. 直接调用DAL层 
  22. namespace BLL 
  23. public class PersonBLL 
  24. private PersonDAL personDal; 
  25.  
  26. public PersonBLL() 
  27. personDal = new PersonDAL(); 
  28.  
  29. public IList<Person> GetPersonByAge(int age) 
  30. IList<Person> personList=personDal.GetPersonByAge(age); 
  31. if (personList.Count != 0) 
  32. return personList; 
  33. else 
  34. return new List<Person>(); 
  35.  
  36. 测试 
  37. class Program 
  38. private static TcpClient tcpClient = new TcpClient(); 
  39.  
  40. static void Main(string[] args) 
  41. tcpClient.Connect("127.0.0.1", 5100); 
  42. MessageManager.TcpClient = tcpClient; 
  43.  
  44. PersonBLL personBll = new PersonBLL(); 
  45. IList<Person> personList=personBll.GetPersonByAge(23); 
  46. if (personList.Count != 0) 
  47. Console.WriteLine(personList.Count.ToString()); 
  48. Console.ReadKey(); 
  49. }

注意测试是输入的查询条件转换成JSON后是 {“ContractName”:“GetPeopleByAge”,“Params”:[23]},而这种  “ContractName":  "契约名","Params": {参数,参数,...}    传送格式是固定不可改变的。当获取查询结果  "[{\"id\":0,\"age\":23,\"name\":\"Mike\"},{\"id\":3,\"age\":23,\"name\":\"Rose\"}] 后 ,MessageManager将通过Newtonsoft.Json把返还值转换为List<Person>。


到此处,在下为大家介绍了利用JSON数据实现JAVA与.NET之间TCP/IP相互调用,其实以JSON的方式实现并不是唯一的选择,只是在下 想在惯常的用法之上,利用一下这个另类的方法,至于在开发结构上有不够周全的地方敬请各位点评。至于以.NET为服务器,JAVA为客户端的TCP/IP 通讯实例与此例子极为相像,在此就不作介绍了。

原代码 : (由于上传空间有限,未能将JAVA项目的.metadata一并上传,请运行时先建立JAVA Project项目,再加入原代码即可以成功运行)

下载

 

JAVA与.NET的相互调用——利用JNBridge桥接模式实现远程通讯
JAVA与.NET的相互调用——TCP/IP套接字相互调用的基本架构(附原代码)
JAVA与.NET的相互调用——通过Web服务实现相互调用(附原代码)

对JAVA与.NET开发有兴趣的朋友欢迎加入QQ群:59557329 点击这里加入此群


 

 


本文转自 leslies2  51CTO博客,原文链接:http://blog.51cto.com/79100812/560654


相关文章
|
6月前
|
存储 开发框架 前端开发
前端框架EXT.NET Dotnet 3.5开发的实验室信息管理系统(LIMS)成品源码 B/S架构
发展历史:实验室信息管理系统(LIMS),就是指通过计算机网络技术对实验的各种信息进行管理的计算机软、硬件系统。也就是将计算机网络技术与现代的管理思想有机结合,利用数据处理技术、海量数据存储技术、宽带传输网络技术、自动化仪器分析技术,来对实验室的信息管理和质量控制等进行全方位管理的计算机软、硬件系统,以满足实验室管理上的各种目标(计划、控制、执行)。
67 1
|
5月前
|
网络协议 安全 Java
Java网络编程入门涉及TCP/IP协议理解与Socket通信。
【6月更文挑战第21天】Java网络编程入门涉及TCP/IP协议理解与Socket通信。TCP/IP协议包括应用层、传输层、网络层和数据链路层。使用Java的`ServerSocket`和`Socket`类,服务器监听端口,接受客户端连接,而客户端连接指定服务器并交换数据。基础示例展示如何创建服务器和发送消息。进阶可涉及多线程、NIO和安全传输。学习这些基础知识能助你构建网络应用。
48 1
|
5月前
|
运维 监控 网络协议
由一次线上故障来理解下 TCP 三握、四挥 & Java 堆栈分析到源码的探秘
由一次线上故障来理解下 TCP 三握、四挥 & Java 堆栈分析到源码的探秘
|
1月前
|
存储 消息中间件 前端开发
.NET常见的几种项目架构模式,你知道几种?
.NET常见的几种项目架构模式,你知道几种?
|
6月前
|
网络协议 Java
Java的Socket编程:TCP/IP与UDP深入探索
Java的Socket编程:TCP/IP与UDP深入探索
98 0
|
3月前
|
设计模式 存储 前端开发
揭秘.NET架构设计模式:如何构建坚不可摧的系统?掌握这些,让你的项目无懈可击!
【8月更文挑战第28天】在软件开发中,设计模式是解决常见问题的经典方案,助力构建可维护、可扩展的系统。本文探讨了.NET中三种关键架构设计模式:MVC、依赖注入与仓储模式,并提供了示例代码。MVC通过模型、视图和控制器分离关注点;依赖注入则通过外部管理组件依赖提升复用性和可测性;仓储模式则统一数据访问接口,分离数据逻辑与业务逻辑。掌握这些模式有助于开发者优化系统架构,提升软件质量。
52 5
|
3月前
|
XML 开发框架 .NET
.NET框架:软件开发领域的瑞士军刀,如何让初学者变身代码艺术家——从基础架构到独特优势,一篇不可错过的深度解读。
【8月更文挑战第28天】.NET框架是由微软推出的统一开发平台,支持多种编程语言,简化应用程序的开发与部署。其核心组件包括公共语言运行库(CLR)和类库(FCL)。CLR负责内存管理、线程管理和异常处理等任务,确保代码稳定运行;FCL则提供了丰富的类和接口,涵盖网络、数据访问、安全性等多个领域,提高开发效率。此外,.NET框架还支持跨语言互操作,允许开发者使用C#、VB.NET等语言编写代码并无缝集成。这一框架凭借其强大的功能和广泛的社区支持,已成为软件开发领域的重要工具,适合初学者深入学习以奠定职业生涯基础。
100 1
|
4月前
|
网络协议 Java 数据处理
(一)Java网络编程之计网基础、TCP-IP协议簇、TCP、UDP协议及腾讯QQ通信原理综述
就目前而言,多数网络编程的系列的文章都在围绕着计算机网络体系进行阐述,但其中太多理论概念,对于大部分开发者而言,用途甚微。因此,在本系列中则会以实际开发者的工作为核心,从Java程序员的角度出发,详细解读Java的网络编程核心内容。
|
4月前
|
网络协议 Java 网络安全
Java中的网络编程:TCP详解
Java中的网络编程:TCP详解
|
4月前
|
网络协议 Java
如何在Java中使用Socket编程实现TCP连接?
在Java中,通过Socket编程实现TCP连接非常常见。以下演示了基本的TCP通信流程,可根据具体需求进行扩展。
255 0

热门文章

最新文章