Annotation of OpenXM/src/OpenMath/ORG/openxm/tam/OpenXM.java, Revision 1.6
1.1 tam 1: /**
1.6 ! tam 2: * $OpenXM: OpenXM/src/OpenMath/ORG/openxm/tam/OpenXM.java,v 1.5 2000/10/11 08:32:15 ohara Exp $
1.1 tam 3: */
4: package ORG.openxm.tam;
5:
6: import java.io.*;
7: import java.net.*;
8:
9:
10: /**
1.3 tam 11: * OpenXM サーバとの接続を行なうクラス.
1.1 tam 12: * クライアント側が使用する.
1.3 tam 13: * 接続するサーバ毎に一つの OpenXM クラスが必要.
1.1 tam 14: */
15: public class OpenXM{
1.4 tam 16: private OpenXMstream control = null, stream = null;
1.1 tam 17: final protected boolean debug = false;
18:
1.3 tam 19: /**
20: * OpenXM サーバとの接続を TCP/IP ソケットを用いて行なう.
21: * マシン名 host のポート番号 CtrlPort にコントロールを,
22: * ポート番号 StreamPort にデータ用の接続を行なう.
23: */
1.1 tam 24: public OpenXM(String host,int CtrlPort,int StreamPort) throws IOException{
1.6 ! tam 25: control = new OpenXMstream(host,CtrlPort);
! 26:
! 27: try{
! 28: Thread.sleep(100); // We need a few wait for starting up server.
! 29: }catch(InterruptedException e){
! 30: System.err.println(e.getMessage());
! 31: }
! 32:
! 33: stream = new OpenXMstream(host,StreamPort);
! 34:
! 35: control.sendByteOrder();
! 36: stream.sendByteOrder();
! 37: }
! 38:
! 39: /**
! 40: * コマンド command を立ち上げ、
! 41: * OpenXM サーバとの接続を TCP/IP ソケットを用いて行なう.
! 42: * マシン名 host のポート番号 CtrlPort にコントロールを,
! 43: * ポート番号 StreamPort にデータ用の接続を行なう.
! 44: */
! 45: public OpenXM(String command,String host,int CtrlPort,int StreamPort)
! 46: throws IOException{
! 47: Runtime.getRuntime().exec(command);
1.4 tam 48: control = new OpenXMstream(host,CtrlPort);
1.1 tam 49:
50: try{
51: Thread.sleep(100); // We need a few wait for starting up server.
52: }catch(InterruptedException e){
53: System.err.println(e.getMessage());
54: }
55:
1.4 tam 56: stream = new OpenXMstream(host,StreamPort);
1.1 tam 57:
58: control.sendByteOrder();
59: stream.sendByteOrder();
60: }
61:
62: /**
1.3 tam 63: * 接続の初期化を行なう. 現在は未実装.
1.1 tam 64: */
65: public synchronized void resetConnection(){
66: debug("control: stopping computer process...");
67: debug("control: sending SYNC BALL.");
68: }
69:
70: /**
1.3 tam 71: * OpenXM メッセージをデータストリームに送信する.
72: * このメソッドはメッセージのボディの部分だけでよい.
73: * ヘッダ部分は自動で付加される.
1.2 tam 74: */
1.1 tam 75: public void send(OXbody object) throws IOException,MathcapViolation{
76: stream.send(object);
77: }
78:
79: /**
1.3 tam 80: * データストリームから OpenXM メッセージを受け取る.
1.1 tam 81: */
82: public OXmessage receive() throws IOException{
83: return stream.receive();
84: }
85:
86: /**
1.3 tam 87: * データストリームの MathCap を mathcap に設定する.
88: * 以後, 送信するオブジェクトは mathcap に合っているかどうか
89: * チェックが入る. 実際にチェックが入るかどうかは
90: * OXbody クラスの派生クラスの実装による.
91: * mathcap に反したオブジェクトを送ろうとした時には,
92: * 以後 MathcapViolation が発生することが期待される.
1.1 tam 93: */
94: public void setMathCap(CMO_MATHCAP mathcap){
95: stream.setMathCap(mathcap);
96: }
97:
98: private final void debug(String str){
99: if(debug){
100: System.err.println(str);
101: }
102: }
103:
104: public static void main(String[] argv){
105: String hostname = "localhost";
106: int ControlPort = 1200, DataPort = 1300;
107: Runnable process = null;
108: Thread thread;
109: OpenXM ox;
110:
111: for(int i=0;i<argv.length;i++){
112: if(argv[i].equals("-h")){
1.5 ohara 113: System.err.println("");
1.1 tam 114: System.exit(0);
115: }else if(argv[i].equals("-host")){
116: hostname = argv[++i];
117: }else if(argv[i].equals("-data")){
118: DataPort = Integer.valueOf(argv[++i]).intValue();
119: }else if(argv[i].equals("-control")){
120: ControlPort = Integer.valueOf(argv[++i]).intValue();
121: }else{
122: System.err.println("unknown option :"+ argv[i]);
123: System.exit(1);
124: }
125: }
126:
127: try{
128: ox = new OpenXM(hostname,ControlPort,DataPort);
129:
130: thread = new Thread(process);
131: thread.start();
132: }catch(UnknownHostException e){
133: System.err.println("host unknown.");
134: System.err.println(e.getMessage());
135: return;
136: }catch(IOException e){
137: System.err.println("connection failed.");
138: System.err.println("IOException occuer !!");
139: System.err.println(e.getMessage());
140: return;
141: }
142:
143: try{
144: //サーバ側へ文字列を送信します。
145: ox.send(new SM(SM.SM_mathcap));
146: ox.send(new SM(SM.SM_popString));
147:
148: //ox.send(new CMO_STRING("print(\"Hello world!!\");\n"));
149: //ox.send(new SM(SM.SM_executeStringByLocalParser));
150:
151: //ox.send(new CMO_STRING("def sub(B,A){return B-A;}"));
152: //ox.send(new SM(SM.SM_executeStringByLocalParser));
153: //ox.send(new SM(SM.SM_popString));
154:
155: //ox.send(new CMO_STRING("diff((x+2*y)^2,x);\0 1+2;"));
156: //ox.send(new SM(SM.SM_executeStringByLocalParser));
157: //ox.send(new SM(SM.SM_popString));
158:
159: //ox.send(new CMO_ZZ("1"));
160: ox.send(new CMO_ZZ("-2"));
161: //ox.send(new CMO_INT32(2));
162: //ox.send(new CMO_STRING("sub"));
163: //ox.send(new SM(SM.SM_executeFunction));
164: ox.send(new SM(SM.SM_popCMO));
165:
166: { int[] array = {1,2};
167: ox.send(new CMO_MONOMIAL32(array,new CMO_ZZ("-2")));
168: }
169: ox.send(new SM(SM.SM_popCMO));
170:
171: ox.send(new SM(SM.SM_popString));
172: //ox.send(new SM(SM.SM_popString));
173:
174: ox.send(new SM(SM.SM_control_kill));
175:
176: //os.flush();
177:
178: //サーバ側から送信された文字列を受信します。
179: while(true){
180: ox.receive();
181: }
182:
183: }catch(Exception e){
184: e.printStackTrace();
185: }
186:
1.5 ohara 187: System.err.println("breaking...");
1.1 tam 188:
189: try{
190: // close connection
191: ox.stream.close();
192: ox.control.close();
193: }catch(IOException e){
194: e.printStackTrace();
195: }
196: }
197: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>