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 ที่ทำงานอีกที ก็ถ้าจะนำไปใช้ก็แก้เพิ่มที่ตรงนี้ได้เลย คร้าบบบบ….