`

进程通道通讯,实现传转对象

阅读更多
Main.java
/*
 * 主程序,用于调用exe
 *
 */
public class Main
{

	public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException
	{
		disport();
	}
	
	public static void disport() throws IOException, ClassNotFoundException, InterruptedException
	{
		Message message = new MyMessage();
		message.setCmd(10000);
		
		Process process = Runtime.getRuntime().exec("java -cp c:/exe.jar; com.java.exe.Exe");
		//发送
		OutputStream out = process.getOutputStream();
		out.write(ObjectTran.objectToByteArray(message));
		out.flush();
		out.close();
		
		
		//接收
		InputStream in = process.getInputStream();
		InputStream isr = new BufferedInputStream(in);
		ByteArrayOutputStream bout = new ByteArrayOutputStream(); 
		
		byte[] b = new byte[1];
		while((isr.read(b)) != -1)
		{
			bout.write(b);
		}
		byte[] allB = bout.toByteArray();
		bout.flush();
		bout.close();
		Object obj = ObjectTran.byteArrayToObject(allB);
		if(obj instanceof Entity)
		{
			Entity en = (Entity)obj;
			System.out.println(en.getName());
			System.out.println(en.getAge());
		}
		
	}
}


Exe.java
/*
 * 模仿exe程序
 *
 */
public class Exe
{

	public static void main(String[] args) throws IOException, ClassNotFoundException
	{
		exe();
	}

	
	public static void exe() throws IOException, ClassNotFoundException
	{
		//接收
		InputStream in = System.in;
		InputStream isr = new BufferedInputStream(in);
		ByteArrayOutputStream out = new ByteArrayOutputStream(); 
		
		byte[] b = new byte[1];
		while((isr.read(b)) != -1)
		{
			out.write(b);
		}
		out.flush();
		out.close();
		byte[] allB = out.toByteArray();
		
		
		//处理
		Object obj = ObjectTran.byteArrayToObject(allB);

		if(!(obj instanceof Message))
		{
			return;
		}
		
		Message message = (Message)obj;
		
		int cmd = message.getCmd();
		Entity en = new Entity();
		
		if(cmd == 10000)
		{
			en.setAge(20);
			en.setName("admin");
		}
		
		//发送
		OutputStream sout = System.out;
		sout.write(ObjectTran.objectToByteArray(en));
		sout.flush();
		sout.close();
	}
}


ObjectTran.java
/** 转换工具,byte[]与object互转 **/
public class ObjectTran
{
	/**
	* 将Object转为byte[]
	**/
	public static byte[] objectToByteArray(Object obj) throws IOException
	{
		ByteArrayOutputStream out = new ByteArrayOutputStream(); 
		ObjectOutputStream ot = new ObjectOutputStream(out); 
		ot.writeObject(obj); 
		ot.flush(); 
		ot.close(); 
		return out.toByteArray(); 
	}
	
	/**
	* 将byte[]转为Object
	**/
	public static Object byteArrayToObject(byte[] b) throws IOException, ClassNotFoundException
	{
		ByteArrayInputStream in = new ByteArrayInputStream(b); 
		ObjectInputStream oi = new ObjectInputStream(in); 
		Object o = oi.readObject(); 
		oi.close(); 
		return o; 

	}
	
	
	/** 测试 **/
	public static void main(String[] args) throws IOException, ClassNotFoundException
	{
		Entity entity = new Entity();
		entity.setAge(11);
		entity.setName("xie");
		byte[] b = objectToByteArray(entity);
		
		Object obj = byteArrayToObject(b);
		Entity e = (Entity)obj;
		System.out.println(e.getName());
		System.out.println(e.getAge());
	}

}


分享到:
评论

相关推荐

    windows 进程间通讯大全

    OLE是一种更高级别的进程间通信技术,用于实现对象在不同应用程序间的链接和嵌入。 - **特点**:支持对象级别的数据共享,可以嵌入来自其他应用程序的对象。 - **优点**:提高了应用程序的互操作性。 - **缺点**:...

    c# Remoting 实现进程间互相调用 并传递消息

    C# Remoting是.NET Framework提供的一种跨进程通信技术,它允许不同进程间的对象互相调用方法,实现分布式系统中的组件交互。在这个场景中,我们关注的是如何利用C# Remoting来实现在不同进程之间传递消息并进行互...

    VB实现进程间通信的源码

    在VB中,实现进程间通信有多种方法,包括管道(Pipes)、内存映射(Memory Mapped Files)、消息队列(Message Queues)、套接字(Sockets)、COM对象、Windows消息等。这里提供的源码可能采用了其中的一种或几种...

    易语言源码易语言单方进程通讯源码.rar

    在这个"易语言源码易语言单方进程通讯源码.rar"压缩包中,我们关注的是易语言实现的单方进程通信的源代码。 进程通信是计算机系统中一个重要的概念,指的是不同进程之间交换数据或协调工作的方式。在多任务环境下,...

    VC++中进程间相互通信十一种方法

    消息管道提供了一种双向通信通道,可用于进程间的通信。匿名管道仅限于同一进程的线程之间使用,而命名管道则可以在任意两个进程之间建立通信。可以通过`ReadFile()`函数读取管道中的数据。 ##### 6. **邮件槽 ...

    Android-安卓跨进程跨app通信框架

    7. **自定义通道**:除了使用Android系统提供的组件外,框架还可能引入自定义的通道,如通过Socket或HTTP/HTTPS等方式实现跨进程通信,以满足更复杂的需求。 在"jarryleo-MagicMessenger-4900b5a"这个文件中,很...

    行业文档-设计装置-一种基于字节流的进程间通讯方法.zip

    标题中的“行业文档-设计装置-一种基于字节流的进程间通讯方法”指的是一个关于IT领域的技术文档,专门探讨了在操作系统环境下,不同进程如何通过字节流进行通信的技术。这种通信方式是多线程或多进程编程中的一个...

    c# WPF 进程通信简易历程

    2. **编码和解码数据**:由于进程之间的内存是隔离的,所以数据需要转换为可以在通道上传输的形式,例如序列化对象。 3. **发送和接收数据**:发送进程将编码后的数据写入通道,接收进程从通道读取数据并解码。 4. *...

    基于OPC技术的多规约通讯网关设计与实现.pdf

    数据采集模块由多个IO Server进程组成,每个进程负责管理不同规约的通道,通道下管理相同规约的设备,通过地址进行区分。OPC标准接口实现模块则提供给客户端统一的数据访问接口,使得客户端能够轻松地对远程设备进行...

    Java基于socket的进程间通信 聊天小程序

    Java基于Socket的进程间通信(IPC)是一种网络编程技术,常用于实现客户端和服务器之间的通信。在这个场景下,我们讨论的是一个简单的聊天小程序,它利用了Java的Socket库来搭建客户端与服务器之间的桥梁,实现数据...

    基于java的网络通讯系统设计与实现(论文+系统)下载.zip

    在本项目中,我们主要探讨的是如何利用Java技术来设计并实现一个网络通讯系统。Java是一种广泛应用于网络编程的语言,其跨平台性、强大的库支持以及面向对象的特性使其成为构建网络通信系统的理想选择。这篇论文结合...

    Wince Serial Communication Wince 下的进程间通信

    本文将深入探讨在Wince环境下如何实现进程间的通信(Inter-Process Communication, IPC),以及CeChat作为示例程序的相关知识点。 **1. Windows CE中的串行通信** 串行通信在Wince中主要通过通用异步接收发送器/...

    remoting简单通讯

    总结来说,C# Remoting是一种用于实现跨进程通信的技术,通过创建服务器和客户端对象,我们可以实现在不同环境下的对象交互。虽然在现代.NET开发中已不再首选,但了解其工作原理对于理解更先进的通信技术仍有帮助。

    Remoting 通讯方面 实例+源码

    总之,Remoting是.NET框架中一种强大的分布式系统通信工具,它可以跨越进程和网络边界,实现对象间的无缝交互。通过深入研究提供的实例和源码,开发者可以更好地掌握Remoting的工作原理和应用场景,提升在分布式系统...

    Remoting实现双向通信

    Remoting技术是.NET Framework提供的一种跨进程通信机制,它允许对象在不同的应用程序域(AppDomain)之间进行交互,甚至跨越网络。在这个特定的场景中,我们关注的是"双向通信",这是一种高级的Remoting特性,使得...

    .NET下使用remoting技术实现的即时通信/聊天程序源代码

    .NET框架下的Remoting技术是微软提供的一种用于在应用程序之间创建通信机制的方法,它允许不同进程间的对象交互,甚至是跨网络的交互。这个标题所指的项目是一个基于C#语言实现的即时通信或聊天程序,利用了.NET ...

    一个进程间通讯同步的C#框架引荐

    1. **封装性**:框架通过MSMQ消息队列,实现了发送消息的线程无需关心消息的目标是同一进程的其他线程还是远程机器,简化了开发者的实现逻辑。 2. **简单性**:框架提供了一致的API接口,使得向其他进程发送消息只...

    Java中利用管道实现线程间的通讯

    PipedInputStream作为输入端,PipedOutputStream作为输出端,两者之间建立连接,形成一个数据传输的通道。 管道的创建与使用: 创建管道时,首先要创建一个PipedOutputStream实例,然后创建一个PipedInputStream,...

    Remoting双向通信V4.0.rar

    总结起来,"Remoting双向通信V4.0.rar"的压缩包可能包含了一个完整的客户端-服务器示例,展示了如何设置通道、激活远程对象、实现接口、管理对象生命周期以及处理安全性和性能问题。通过研究这个示例,开发者可以...

Global site tag (gtag.js) - Google Analytics