Home | Back


mRPCxe string communication

Monday, 13 March 2006



ผมได้เขียนโปรแกรมที่ใช้สำหรับส่งข้อมูล String ที่มีความยาวไม่จำกัดเพื่อใช้ในโปรแกรมงานวิจัยผม ก็เลยเอา source มาลงไว้หน่อย เผื่อวันหลังได้เอามาใช้ใหม่

File : mRPCxe.java

package mRPCxe;

import java.net.*;
import java.io.*;

/**
*
* @author anayo
*/
public class mRPCxe {

   /** Creates a new instance of mRPCxe */
   public mRPCxe() {
   }

   public static String read(DataInputStream in, DataOutputStream out) {
       String dat="";
       try{
           while(true){
               String buf = DataInputStream.readUTF(in);
               String header = buf.substring(0, 1);
               String body = buf.substring(1);
               dat=dat+body;
               if(header.equals("a")==true){
                   out.writeUTF("x");
                   continue;
               }else if(header.equals("z")==true){
                   break;
               }
           }
       }catch(Exception e){e.printStackTrace();
       }

       return dat;
   }

   public static void write(DataInputStream in, DataOutputStream out, String str) {
       int wsize=1000;
       try{
           int countPacket=(int)(java.lang.Math.ceil((float)str.length()/(float)wsize));
           int pos=0;
           String buf;
           while(true){
               countPacket--;
               if(countPacket>0){
                   buf=str.substring(pos, pos+wsize);
                   pos=pos+wsize;
                   out.writeUTF("a"+buf);
                   String res = DataInputStream.readUTF(in);
                   if(res.equals("x")) continue;
               }else{
                   buf=str.substring(pos, str.length());
                   out.writeUTF("z"+buf);
                   break;
               }
           }
       }catch(Exception e){ e.printStackTrace();
       }
   }

   public static String ClientSend(String tx,String host,int port) {
       String ret="";
       try{
           Socket sk = new Socket(host,port);
           DataInputStream in = new DataInputStream(sk.getInputStream());
           DataOutputStream out = new DataOutputStream(sk.getOutputStream());
           mRPCxe.write(in, out, tx);
           ret = mRPCxe.read(in, out);
           return ret;
       }catch(Exception e){ e.printStackTrace(); }
       return ret;
   }
}

ในการใช้งานถ้าเป็นฝั่ง client ก็ใช้คำสั่ง ClientSend เพื่อใช้ส่งข้อมูล string ให้กับ server ในส่วนทางฝั่ง server ผมก็ได้เขียนโปรแกรมที่รอรับ connection แล้วสร้าง thread ขึ้นมาทำงานครับ

File : ServerConsole.java

package mObjKB;

/**
*
* @author anayo
*/
public class ServerConsole {

  /** Creates a new instance of ServerConsole */
  public ServerConsole() {
      System.out.println("Object-Property Knowledge Server Console start.....\n");
      new ServerSock().start();
  }

  public static void main(String args[]) {
      new ServerConsole();
  }
}

File : ServerSock.java

package mObjKB;

import java.net.*;
import java.io.*;

/**
*
* @author anayo
*/
public class ServerSock extends Thread{

  /** Creates a new instance of ServerSock */
  public ServerSock() {
  }

  public void run() {
      ServerSocket srv;
      try{
          srv = new ServerSocket(8595);
          while(true){
              Socket serviceSK = srv.accept();
              System.out.println("\nRespond job ...");
              new ServerSockRespond(serviceSK).start();
          }
      }catch(Exception e){ e.printStackTrace(); }
  }
}

File : ServerSockRespond.java

package mObjKB;

import java.net.*;
import java.io.*;

import mTest.*;

/**
*
* @author anayo
*/
public class ServerSockRespond extends Thread{

  Socket respond;
  /** Creates a new instance of ServerSockRespond */
  public ServerSockRespond(Socket res) {
      respond = res;
  }

  public void run() {
      try{
           DataInputStream in = new DataInputStream(respond.getInputStream());
           DataOutputStream out = new DataOutputStream(respond.getOutputStream());
           String dat = mRPCxe.mRPCxe.read(in, out);
           String reDat = operate(dat);
           mRPCxe.mRPCxe.write(in, out, reDat);
      }catch(Exception e){ e.printStackTrace(); }
  }

  public String operate(String tx) {
      String ret = "";
      if(tx.equals("")==true) return ret;
      String[] cmd;
      String com;
      String data;
      cmd = tx.split(":", 2);
      com=cmd[0];
      if(cmd.length==1){
          data="";
      }else{
          data=cmd[1];
      }
      if(com.equals("lowlevel")==true){
          System.out.println("Command: lowlevel");
          ret=new mObjKB.lowlevel.respond().operate(data);
      }
      else if(com.equals("testWeb")){
          System.out.println("Command: testWeb");
          ret=web.testWeb(data);
      }else{
          System.out.println("Command Fail");
          ret="lowlevel:Unknown Executor";
      }
      return ret;
  }
}

ในส่วนของไฟล์ ServerSockRespond.java จะมี method ที่ชื่อ operate จะทำหน้าที่แปลคำสั่งแล้วเรียก module ที่ทำงานอีกที ก็ถ้าจะนำไปใช้ก็แก้เพิ่มที่ตรงนี้ได้เลย คร้าบบบบ….



Home | Back