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