疯狂java


您现在的位置: 疯狂软件 >> 新闻资讯 >> 正文

基于局域网络应用Java语言实现远程智能终端的控制之二


 

在该程序段中,首先定义一个客户端socket,通过该agent socket与远程控制机remote control computer建立连接,并且指定程序使用的端口号,该端口号应大于1024,以避免与系统的端口号发生冲突;然后定义输出和输入流osis ,输出流是从客户机向服务器发送信息的通道,输入流是服务器向客户机传递命令和参数的途径;再定义数据缓存区,用于把服务器传过来的命令和参数与其它程序段进行交互。在整个程序段中用try catch语句进行异常捕获。
  服务器段的程序编制应与客户端程序的编制相适应,由于一个远程控制机可以控制多台现场工控机,所以服务器程序必须采用多线程机制,这也是Java语言的一大特色。服务器端的程序编写如下:
  public class serverclass
  {public static void main(String args[])
  { boolean listen;
  try {
    ServerSocket serversocket =new ServerSocket(5555);
    }catch(IOException e){};
       while(listen)
  {
  Socket agentsocket=serversocket.accept();
  }catch(IOException e){};
  new serverthread(agentsocket).start();
  ..........
  }}
  class serverthread extends Thread{
  Socket socket=null;
  serverthread(Socket socket)
  {super("serverthread");
  this.socket=socket;}
  public void run(){
      try{
  DataInputStream  is=new  DataInputStream(new BufferedOutputStream (socket. getOutputStream()));
  PrintStream os=new PrintStream (new BufferedOutputStream (socket.getOutputStream (),5555),false);
  ..........
  }catch(IOException e){}; }
  该程序段由两个类组成:主类和线程类。主类负责建立服务器套接字server socket,端口号必须与客户机的端口号一致,然后通过server socketaccept方法创建一个套接字接口,专门处理与客户机的通信;线程类用于创建一个新的线程,负责处理各个现场工控机的输入和输出请求。在线程类程序段中,首先创建一个构造方法,用于初始化一个新的线程,然后再定义一个输入和输出流。该服务器程序的设计是以各客户程序用同一个端口号向服务器发出服务请求,服务器程序在端口处侦听各个客户的请求,创建多个线程,依次处理。当然各个客户端也可以采用不同的端口号向服务器发出请求,服务器相应地也创建不同端口号的线程与端口号一致的客户端进行通信。
  远程控制主机服务器程序必须具有与数据库进行动态交互的能力。数据库中存放着大量的现场数据以及控制现场操作的参数和命令等。服务器程序中的某一线程体负责对数据库的存取、修改和维护等操作,Java语言通过JDBC实现与数据库的连接,该功能类的实现方法如下:
  public class database
  {public void drivedata()
  {String url="JDBC:odbc:component";
    ..........
  try{
  Class.forName("sun.jdbc.odbc.JDBCODBCDriver");
  Connection con=DriverManager.getConnection(url);
    ..........
  }catch(SQLException se){};
  }
  该程序段最主要的功能是加载JDBC数据库驱动程序,使得Java语言能够通过驱动程序访问数据库。
 
4 利用Java语言的本地方法技术
 
  由于Java语言的跨平台特性,所以使得Java语言无法操作硬件。对智能节点的控制只能采用第三方语言进行,例如C或汇编语言。而整个工控机的通信部分由Java语言编写,为实现远程主机对智能节点的控制,就必须实现Java语言与其它语言的结合。令人欣慰的是Java语言扩充了这方面的功能,可以与CC++语言完美无缺地结合起来,这虽然在某种程度上牺牲了移植性,却使Java语言能够和具体的环境打交道,具备了驱动硬件的能力。在本文所讨论的例子中,PCL839卡的应用和驱动程序是用C语言开发的,Java语言把C语言编制的程序做成本地方法体,从而实现对PCL839卡的控制。
  对智能节点的驱动程序用C语言编写,程序中所采用的函数大部分是研华公司开发的C库函数,利用这些库函数可以开发出高效的应用程序,驱动步进电机完成各种操作。因此把这些程序集成为Java本地方法体,成为用Java语言实现远程控制的关键技术。其程序段如下:
  int pcl839dirve()
   { …………………………
     int i ;
     clrscr();
     set_base(0x2c0); /* 设置pcl839的基地址*/
  set_mode(CH1,DIR); /* 设置pcl839通道1 "Direction" mode */
  set_mode(CH2,DIR); /* 设置pcl839通道2 "Direction" mode */
  set_mode(CH3,PUS); /* 设置pcl839通道3"Pulse" mode */
  set_speed(CH123,600,3000,600); /* 设置pcl839通道速度 */
  pmove(CH123 , P_DIR,FH,4000 , N_DIR,FH,2000 , P_DIR,FH,4000);
  waitrdy(CH123); /* 等待所有通道就绪*/
  cmove(CH123 , N_DIR,FH , N_DIR,FH , N_DIR,FH);
  ………………………/*进行具体的现场操作,以下的程序语句仅作为演示*/
    printf("按任何键降速...");
    getch();
    printf(" ");
    slowdown(CH123); /* 把通道1,2,3降速到低速状态*/
    for(i=2999;i>-1;i--)
     { cprintf("%d ",i);
      delay(1);
     }
    stop(CH123); /* 通道停止运行*/
    return(0);
  }
  对于工控机,Java程序的编写必须集成本地方法。对于本地方法的集成采取以下步骤:首先在一个Java程序中定义一个本地的方法,编译该Java代码;然后当用JDK环境下的JavaH命令创建一个C语言的头文件时,必须注意其中的类结构和函数定义,接着创建一个Stub文件,Stub文件中包含与其C结构紧密联系在一起的C代码;Stub文件建立以后,编写相应的C代码,在原有的C代码前面必须加上《stubpreamble.h》和《drive.h》两个头文件;最后再由
VC++等集成开发环境将C语言程序编译成DLL程序,这样就实现了本地方法的集成。对于工控机的本地程序按以上步骤完成以后,工控机的主程序编制如下:
  public class main
  {public static void main(String args[])
  { .............
  /*负责与远程控制主机通信部分的程序段
  new drive().pcl839drive();
    .............
  }}
  public class dirve
  {public native void pcl839drive();
  .........
  static{
  System.loadLibrary("drive");
  .........} }
  该段程序由主类和本地方法类组成,主类除完成通信部分的程序外,还必须实例化本地方法类,并且调用本地方法;本地方法类在定义本地方法时,必须加上关键词native,并且程序段中有一段静态代码,该静态代码通过系统函数为本地方法类加载drive库。
  通过采用Java语言编程技术,就可以实现本地方法的集成和网络的通信,有效地把控制主机和远程主机通过网络连接起来,以实现远程控制。该套方案是在已有本地局域网络的基础上建成的,充分利用了Java网络编程和集成本地方法的技术,具有经济实惠和高效的特点。由于Java的平台无关性,使得Java在与本地方法的集成中隐藏了大量的技术细节。因而进一步对Java的关键技术开展研究,充分和高效地利用这一富有特色的语言,实现对底层智能节点的控制,达到网络监控的目的,无疑是一个非常有意义的课题。

(转载)