版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、java进程间通讯机制代码 socket RMI远程调用 共享内存 管道进程间利用进程间利用socket来通信来通信客户端每隔500毫秒向服务器发送一个奇数,服务器将已收到的奇数乘以2再发回给客户。客户端程序import java.io.*;import .*;public class client public static void main(String args) String s = null; Socket mysocket; DataInputStream in = null; DataOutputStream out = null; try mysocket = new Soc
2、ket(127.0.0.1, 4331); in = new DataInputStream(mysocket.getInputStream(); /*mysocket可以使用getInputStream()方法获得一个输入流,然后用这个输入流读取服务器放入“线路”的信息,还可以使用getOutputStream()方法获得一个输出流,然后用这个输出流将信息写入“线路”*/out = new DataOutputStream(mysocket.getOutputStream(); for(int k=1; k10; k=k+2) out.writeUTF( + k); s=in.readUTF
3、(); System.out.println(客户收到: + s); Thread.sleep(500); catch(Exception e) System.out.println(服务器已断开 + e); 服务器端程序import java.io.*;import .*;public class server public static void main(String args) ServerSocket server = null; Socket you = null; String s = null; DataOutputStream out = null; DataInputStr
4、eam in = null; try server = new ServerSocket(4331); catch(IOException e) System.out.println(e); /有备注try System.out.println(等待客户呼叫); you = server.accept(); out = new DataOutputStream(you.getOutputStream(); in = new DataInputStream(you.getInputStream(); while(true) s = in.readUTF(); int m=Integer.pars
5、eInt(s); /out.writeUTF(你好:我是服务器); out.writeUTF(你说的数 + m + 乘2后是: + 2*m); System.out.println(服务器收到: + s); Thread.sleep(500); catch(Exception e) System.out.println(客户以断开 + e); /有备注先运行服务器端程序,再运行客户端程序RMIRMI远程方法调用远程方法调用RMI(Remote Method Invocation)是一种基于Java的分布式编程模型,为java程序提供远程访问服务接口。它允许允许在一个java虚拟机上的对象调用允
6、许在另一台java虚拟机上的对象的方法,就像调用本地方法一样。/创建远程接口及声明远程方法(HelloInterface.java)import java.rmi.*; public interface HelloInterface extends Remote public String say() throws RemoteException; /* 远程接口必须扩展java.rmi.remote*/*远程接口方法必须抛出* java.rmi.RemoteException*/实现远程接口及远程方法(继承UnicastRemoteObject)(Hello.java)import java
7、.rmi.*;import java.rmi,server.*; public class Hello extends UnicastRemoteObject implements HelloInterface private String message; public Hello(String msg) throws RemoteException Message = msg; /* 远程接口方法的实现 */public String say() throws RemoteException System.out.println(CalledbyHelloClient); return m
8、essage; /备注/启动RMI注册服务,并注册远程对象(HelloServer.java) import java.rmi.Naming; import java.rmi.registry.LocateRegistry; public class HelloServer /* 启动RMI注册服务并进行对象注册 */ public static void main(String args) try LocateRegistry.createRegistry(1099); HelloInterface hello = new Hello(Hello, world!); Naming.rebin
9、d(Hello, hello); /如果要把hello实例注册到另一台启动了RMI注册服务的机器上 /Naming.rebind(/192.168.1.105:1099/Hello, hello); System.out.println(Hello Server is ready); catch(Exception e) System.out.println(Hello Server failed: + e); /备注/客户端查找远程对象,并调用远程方法(HelloClient) import java.rmi.Naming; public class HelloClient /* 查找远程对
10、象并调用远程方法 */ public static void main(String argv) try HelloInterface hello = (HelloInterface) Naming.lookup(Hello); /如果要从另一台启动了RMI注册服务的机器上查找hello实例 /HelloInterface hello=(HelloInterface)Naming.lookup(/192.168.1.105:1099/Hello); /调用远程方法 System.out.println(hello.say(); catch(Exception e) System.out.pri
11、ntln(HelloClient exception: + e); 客户端查找远程对象,并调用远程方法,在客户端输出Hello, world! 在服务器端输出Called by HelloClient内存映射 在 Windows 中内存映射文件可以是脱离物理文件而存在的一块命名的内存区域,使用相同的内存映射名就能在不同的进程中共享同一片内存。然后,Java NIO 的内存映射文件(MappedByteBuffer)总是与某个物理文件相关的,因为不管你是从 FileInputStream、FileOutputStream 还是 RandomAccessFile 得来的 FileChannel,再
12、 map() 得到的内存映射文件 MappedByteBuffer,如果在构造 FileInputStream、FileOutputStream、RandomAccessFile 对象时不指定物理文件便会有 FileNotFoundException 异常。 所以 Java NIO 来实现共享内存的办法就是让不同进程的内存映射文件关联到同一个物理文件,因为 MappedByteBuffer 能让内存与文件即时的同步内容。严格说来,称之为内存共享是不准确的,其实就是两个 Java 进程通过中间文件来交换数据,用中间文件使得两个进程的两块内存区域的内容得到及时的同步。 知道了实现原理之后,下面用代
13、码来演示两个进程间用内存映射文件来进行数据通信。 代码 WriteShareMemory.java 往映射文件中依次写入 A、B、C . Z。 ReadShareMemory.java 逐个读出来,打印到屏幕上。代码对交换文件 swap.mm 的第一个字节作了读写标志,分别是 0-可读,1-正在写,2-可读。RandomAccessFile 得到的 Channel 能够灵活的进行读或写,并且不会破坏原有文件内容,而 FileInputStream 或 FileOutputStream 取得的 Channel 则很难达到这一功效,所以使用了 RandomAccessFile 来获得 FileCh
14、annel。WriteShareMemory.java 往映射文件中依次写入 A、B、C . Z。public class WriteShareMemorypublic static void main(String args) throws Exception RandomAccessFile raf = new RandomAccessFile(D:/1.mm, rw); FileChannel fc = raf.getChannel();MappedByteBuffer mbb = fc.map(MapMode.READ_WRITE, 0, 1024);/获得一个只读的随机存取文件对象/
15、获得相应的文件通道/获得共享内存缓冲区,可读写import java.io.RandomAccessFile;import java.nio.MappedByteBuffer;import java.nio.channels.FileChannel;import java.nio.channels.FileChannel.MapMode;for(int i=0; i1024; i+) mbb.put(i, (byte)0); for(int i=65; i91; i+) int index = i-63;int flag = mbb.get(0); if(flag != 0) i-;conti
16、nue;mbb.put(0, (byte)1); mbb.put(1, (byte)(index); System.out.println(程序 WriteShareMemory: + System.currentTimeMillis() + : 位置: + index + 写入数据: + (char)i);mbb.put(index, (byte)i);mbb.put(0, (byte)2);Thread.sleep(513); /清除文件内容/从文件的第二个字节开始,依次写入A-Z字母,第一个字节指明了当前操作的位置/可读标志第一个字节为0;/正在写数据,标志第一个字节为1/写数据的位置R
17、eadShareMemory.java 逐个读出来,打印到屏幕上。import java.io.RandomAccessFile;import java.nio.MappedByteBuffer;import java.nio.channels.FileChannel;import java.nio.channels.FileChannel.MapMode;public class ReadShareMemory public static void main(String args) throws Exception RandomAccessFile raf = new RandomAcce
18、ssFile(D:/1.mm, rw);FileChannel fc = raf.getChannel();MappedByteBuffer mbb = fc.map(MapMode.READ_WRITE, 0,1024);int lastIndex = 0;for(int i=1; i 1000) break;ops.write(helprn+(new Integer(i).toString().getBytes(); /写入字符串catch(Exception e) e.printStackTrace();public void run() try InputStream in = p.getInputStream(); BufferedReader bfr =
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年深海养殖产业园区建设项目可行性研究报告及总结分析
- 2025年食品加工行业自动化升级可行性研究报告及总结分析
- 2026年宜昌科技职业学院单招职业技能测试必刷测试卷及答案解析(夺冠系列)
- 2026年宁夏工商职业技术学院单招职业倾向性测试必刷测试卷及答案解析(夺冠系列)
- 2026年哈尔滨应用职业技术学院单招职业倾向性考试必刷测试卷及答案解析(夺冠系列)
- 2026年合肥滨湖职业技术学院单招综合素质考试题库及答案解析(夺冠系列)
- 2026年共青科技职业学院单招职业技能考试题库及答案解析(名师系列)
- 2026年安徽邮电职业技术学院单招职业适应性考试题库带答案解析
- 2026年新疆博尔塔拉蒙古自治州单招职业适应性测试必刷测试卷及答案解析(夺冠系列)
- 2026年廊坊职业技术学院单招职业适应性考试题库及答案解析(夺冠系列)
- DBJ15-22-2021-T 锤击式预应力混凝土管桩工程技术规程(广东省)
- CJT 3008.3-1993 城市排水流量堰槽测量标准巴歇尔水槽
- DL-T5706-2014火力发电工程施工组织设计导则
- (高清版)JTG 5211-2024 农村公路技术状况评定标准
- GA/T 1466.3-2023智能手机型移动警务终端第3部分:检测方法
- 思想道德与法治智慧树知到期末考试答案章节答案2024年上海杉达学院
- MOOC 工程经济与项目管理-兰州交通大学 中国大学慕课答案
- MOOC 创业管理-江苏大学 中国大学慕课答案
- 高中英语读后续写教学模式的行动研究
- 企业申请参展书
- 碳化硅与氮化镓功率器件
评论
0/150
提交评论