当前位置:文档之家› 基于java的进程通信

基于java的进程通信

1仲恺农业工程学院实验报告纸计算机科学与工程 (院、系) 网络工程 专业 083 班 组 《操作系统》 实验二 进程通信一.实验目的:1、 理解进程消息通信的概念,如何实现两个创建进程之间的数据传递。

2、 理解进程共享变量的进程通信。

二.实验内容:1、 选择Window 或Linux ,并选择该操作系统中一种进程通信的方式。

2、 查找该进程通信的API 使用方式,设计出一个合适的应用程序。

3、 采用高级程序语言实现该应用程序。

4、 测试进程通信程序,能够满足微机操作系统中进程之间的通信。

三.实验步骤和过程1、 进程通信的知识点:(1)、进程通信的概念:进程之间互相交换信息的工作称为进程通信IPC(2)、进程通信的方式:信号(signal )通信机制; 共享存储区(sharedmemory)通信机制;共享文件(shared file)通信机制;消息传递(message passing)通信机制。

(3)、进程通信机制:管道通信机制,共享主存通信机制,消息传递通信机制。

2、程序设计环境(1)、Widows7操作系统,eclipse 平台!(2)、套接字(socket )通信套接字通信,其中一个运行在客户端,称之为ClientSocket ,另一个运行于服务器端面,称为ServerSocket 。

根据连接启动的方式以及本地要连接的目标,套接字之间的连接过程可以分为三个步骤:服务器监听、2 客户端请求、连接确认。

服务器监听是指服务端套接字并不定位具体的客户端套接字,而是处于等待连接的状态,实时监控网络状态。

客户端请求是由客户端的套接字提出连接请求,要连接的目标是服务器端套接字。

为此,客户端的套接字必须首先描述它要连接的服务器的套接字,指出服务器套接字的地址和端口号,然后再向服务器端套接字提出连接请求。

连接确认是当服务器端套接字监听到或者说接收到客户端套接字的连接请求时,它就响应客户端套接字的请求,建立一个新的线程,把服务器端套接字的信息发送给客户端,一旦客户端确认了此连接,连接即可建立。

而服务器端继续处于监听状态,继续接收其他客户端的连接请求。

使用套接字进行数据处理有两种基本模式:同步和异步。

同步模式:同步模式的特点是在通过Socket 进行连接、接收、发送数据时,客户机和服务器在接收到对方响应前会出于阻塞状态,即一直等到收到对方请求进才继续执行下面的语句。

可见,同步模式只适用于数据处理不太多的场合。

当程序执行的任务很多时,长时间的等待可能会让用户无法忍受。

异步模式:异步模式的特点是在通过Socket 进行连接、接收、发送操作时,客户机或服务器不会处于阻塞方式,而是利用callback 机制进行连接、接收、发送处理,这样就可以在调用发送或接收的方法后直接返回,并继续执行下面的程序。

可见,异步套接字特别适用于进行大量数据处理的场合。

使用同步套接字进行编程比较简单,而异步套接字编程则比较复杂。

3Socker的通信过程(3)、套接字进程通信用到的类如下:InetAddress, Socket, 和 ServerSocket。

InetAddress对象描绘了32位或128位IP地址,Socket对象代表了客户程序流套接字,ServerSocket代表了服务程序流套接字,所有这三个类均位于包中。

InetAddress类InetAddress类在网络API套接字编程中扮演了一个重要角色。

参数传递给流套接字类和自寻址套接字类构造器或非构造器方法。

InetAddress描述了32位或64位IP地址,要完成这个功能,InetAddress类主要依靠两个支持类Inet4Address 和 Inet6Address,这三个类是继承关系,InetAddrress是父类,Inet4Address 和 Inet6Address是子类。

getByName(String host)方法返回一个InetAddress对象,该对象包含了4一个与host 参数指定的主机相对应的IP 地址,对于指定的主机如果没有IP 地址存在,那么方法将抛出一个UnknownHostException 异常对象。

如下:public void actionPerformed(ActionEvent e)//事件处理程序{b yte buffer[]=input .getText().trim().getBytes();String s=input .getText();try { InetAddress address=InetAddress.getByName ("127.0.0.1"); //获取本机地址DatagramPacket data_pack=newDatagramPacket(buffer,buffer.length , address,666);DatagramSocket mail_data=new DatagramSocket();out .append("进程1 说:\n"+" "+s+"\n");mail_data.send(data_pack);input .setText("");}catch (Exception e1){}}创建了一个Socket 对象,那么它可能通过调用Socket 的 getInputStream()方法从服务程序获得输入流读传送来的信息,也可能通过调用Socket 的 getOutputStream()方法获得输出流来发送消息。

在读写活动完成之后,客户程序调用close()方法关闭流和流套接字。

如本程序:ServerSocket server ; //服务端Socket Client ;//客户端InputStream DataIn ;//OutputStream DataOut ;Thread thread ;DatagramPacket 类在使用自寻址包之前,你需要首先熟悉DatagramPacket 类,地址信息和自寻址包以字节数组的方式同时压缩入这个类创建的对象中DatagramPacket 有数个构造函数,即使这些构造函数的形式不同,但通常情况下他们都有两个共同的参数:byte [] buffer 和 int length ,5 buffer 参数包含了一个对保存自寻址数据包信息的字节数组的引用,length 表示字节数组的长度最简单的构造函数是DatagramPacket(byte [] buffer, int length),这个构造函数确定了自寻址数据包数组和数组的长度,但没有任何自寻址数据包的地址和端口信息,这些信息可以后面通过调用方法setAddress(InetAddress addr)和setPort(int port)添加上。

构造函数的时候同时包括地址和端口号,可以使用DatagramPacket(byte [] buffer, int length, InetAddress addr, int port)函数如本程序:public void actionPerformed(ActionEvent e)//事件处理程序{S tring s=input .getText();byte buffer[]=input .getText().trim().getBytes();try { InetAddress address=InetAddress.getByName ("127.0.0.1"); DatagramPacket data_pack=newDatagramPacket(buffer,buffer.length, address,888);DatagramSocket mail_data=new DatagramSocket();out .append("进程2 说:\n"+" "+s+"\n");mail_data.send(data_pack);input .setText("");}(4)、本程序运行的主窗口结果截图如下:服务端6 public JC2( ){ super ("Lizhidong2");Container c=getContentPane();c.setLayout(null );thread =new Thread(this );setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE );JPanel panel=new JPanel();JPanel panel2=new JPanel();JScrollPane js=new JScrollPane(out );js.setBounds(10,10,380,200);panel.setBounds(0,220,400,50);out .setBackground(Color.yellow );out .setLineWrap(true );panel.add(label );panel.add(input );input .addActionListener(this );c.add(js);c.add(panel);setBounds(400,150,400,280);setVisible(true );setResizable(false );Thread thread=new Thread(this );thread.start();}客户端7public JC1( ){ super ("lizhidong1");Container c=getContentPane();c.setLayout(null );setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE );JPanel panel=new JPanel();JPanel panel2=new JPanel();JScrollPane js=new JScrollPane(out );js.setBounds(10,10,380,200);panel.setBounds(0,220,400,50);out .setBackground(Color.cyan );out .setLineWrap(true );panel.add(label );panel.add(input );input .addActionListener(this );c.add(js);c.add(panel);setBounds(600,150,400,280);setVisible(true );setResizable(false );Thread thread=new Thread(this );thread.start();//线程负责接收数据包}(5)、进行通信测试本程序我主要在一台pc 机模拟两台pc 机通信(两台pc 机也可以进行通信,已经实验过),首先,把电脑的防火墙关闭,否则有些电脑是进行不了通信的。

相关主题