00001 /* 00002 * $Id: RCCommunicator_8java-source.html,v 1.2 2002/07/07 20:59:52 stork Exp $ 00003 * 00004 * $Log: RCCommunicator_8java-source.html,v $ 00004 * Revision 1.2 2002/07/07 20:59:52 stork 00004 * update dokumenation 00004 * 00005 * Revision 1.20 2002/07/05 18:34:08 stork 00006 * update dokumentation 00007 * 00008 * Revision 1.19 2002/07/04 16:28:45 stork 00009 * input buffer to 2kB 00010 * 00011 * Revision 1.17 2002/07/04 16:19:13 stork 00012 * reactivate log comments 00013 * 00014 * Revision 1.15 2002/07/04 14:00:46 stork 00015 * remove send buffer size 00016 * 00017 * Revision 1.14 2002/07/04 13:48:07 transier 00018 * save last sent command 00019 * 00020 * Revision 1.13 2002/07/04 13:37:05 stork 00021 * set send buffer to 0 00022 * 00023 * Revision 1.11 2002/07/04 12:54:45 stork 00024 * new buffer size 00025 * 00026 * Revision 1.10 2002/07/03 17:22:48 stork 00027 * +fix too small buffer for server messages 00028 * +add some debug messages 00029 * 00030 * Revision 1.9 2002/06/27 20:26:39 stork 00031 * add + update dokumentation 00032 * 00033 * Revision 1.8 2002/06/22 20:15:41 stork 00034 * add some more dokumentation 00035 * 00036 * Revision 1.7 2002/06/08 14:39:20 stork 00037 * add log support 00038 * 00039 * Revision 1.6 2002/06/07 18:13:42 stork 00040 * remove comments 00041 * 00042 * Revision 1.5 2002/05/30 15:37:16 stork 00043 * improve handling when server dies before we 00044 * 00045 * Revision 1.4 2002/05/29 21:05:21 stork 00046 * update say methode 00047 * 00048 * Revision 1.3 2002/05/25 22:05:12 stork 00049 * tests and minor bugfixes 00050 * 00051 * Revision 1.2 2002/05/21 20:57:14 stork 00052 * first communicator version 00053 * 00054 * Revision 1.1.1.1 2002/05/21 20:32:05 stork 00055 * empty project 00056 * 00057 */ 00058 import java.util.*; 00059 import java.net.*; 00060 import java.io.*; 00061 00067 public class RCCommunicator 00068 implements RCEventType, RCSender,RCType, RCView, RCPlayMode { 00070 public String Host; 00071 public int ServerPort; 00072 public String Team; 00073 public int PlayerNumber; 00074 public RCPlayMode PlayMode; 00075 public boolean Goalie; 00076 public DatagramSocket Sock; 00077 public InetAddress Address; 00079 private RCParser Parser; 00080 private RCWorld World; 00081 00091 public RCCommunicator ( String Team, RCWorld World, boolean Goalie, String Host, int Port ){ 00092 String InitMsg; 00093 00094 /* create a new parser */ 00095 Parser = new RCParser(Team); 00096 this.Team = Team; 00097 this.Goalie = Goalie; 00098 this.Host = Host; 00099 this.ServerPort = Port; 00100 this.World = World; 00101 /* do the network stuff*/ 00102 try{ 00103 /* try to resolve the Hostname */ 00104 Address = InetAddress.getByName(Host); 00105 /* create a new socket */ 00106 Sock = new DatagramSocket(); 00107 Sock.setSoTimeout(10000); 00108 00109 /* "connect" to server */ 00110 if( Goalie == false ) 00111 InitMsg = "(init "+Team+"(version 7.0))"; 00112 else 00113 InitMsg = "(init "+Team+"(version 7.0) (goalie))"; 00114 this.send(InitMsg); 00115 00116 // wait for response from server 00117 byte[] Response = new byte[4096]; 00118 DatagramPacket rp = new DatagramPacket(Response, Response.length); 00119 Sock.receive(rp); /* save server port */ 00120 ServerPort = rp.getPort(); 00121 String ResponseMsg = new String(rp.getData()); 00122 00123 if( ResponseMsg.startsWith("(error") == true ){ 00124 // shit happens 00125 System.out.println(ResponseMsg); 00126 System.exit(1); 00127 }else{ 00128 /* analyse the server response */ 00129 String Message = ResponseMsg.substring(6, ResponseMsg.length()-1); 00130 StringTokenizer tk = new StringTokenizer(Message); 00131 if( tk.nextToken().compareTo("l") == 0 ){ 00132 // left to right 00133 World.Side = LEFT; 00134 }else{ 00135 // right to left 00136 World.Side = RIGHT; 00137 } 00138 this.PlayerNumber = Integer.parseInt(tk.nextToken()); 00139 World.PlayerNumber = this.PlayerNumber; 00140 } 00141 00142 // set position 00143 this.move((World.X1+World.X2)/2, 00144 (World.Y1+World.Y2)/2); 00145 00146 }catch(Exception e){ 00147 World.Log.Log("Player-"+World.PlayerNumber+" : Resolve error "+e.toString()); 00148 System.out.println("RESOLVE:"+ e.toString()); 00149 } 00150 } 00151 00158 public boolean receive ( ){ 00159 00160 try{ 00161 byte[] data = new byte[2048]; 00162 /* get new message */ 00163 DatagramPacket p = new DatagramPacket(data, data.length); 00164 this.Sock.receive(p); 00165 /* parse the message */ 00166 Parser.pushMessage(new String(p.getData()), World); 00167 }catch(Exception e){ 00168 //System.out.println(e.toString()); 00169 // System.exit(1); 00170 return false; 00171 } 00172 return true; 00173 } 00174 00180 public void turn ( double Movement ){ 00181 this.send("(turn "+Movement+")"); 00182 } 00183 00189 public void dash ( double Power ){ 00190 this.send("(dash "+Power+")"); 00191 } 00192 00199 public void kick ( double Power, double Direction ){ 00200 this.send("(kick "+Power+" "+Direction+")"); 00201 } 00202 00208 public void catchit ( double Direction ){ 00209 this.send("(catch "+Direction+")"); 00210 } 00211 00218 public void move ( double x, double y ){ 00219 this.send("(move "+x+" "+y+")"); 00220 } 00221 00227 public void turn_neck ( double Angle ){ 00228 this.send("(turn_neck "+Angle+")"); 00229 } 00230 00237 public void say ( String Message ){ 00238 this.send("("+World.MsgStart+"say "+Message+")"); 00239 } 00240 00244 public void sence_body ( ){ 00245 this.send("(sence_body)"); 00246 } 00247 00254 public void send(String Message){ 00255 /* create a new packet */ 00256 DatagramPacket p = new DatagramPacket(Message.getBytes(), Message.length()); 00257 p.setPort(this.ServerPort); 00258 p.setAddress(this.Address); 00259 try{ 00260 /* send a new packet */ 00261 Sock.send(p); 00262 }catch(IOException e){ 00263 System.out.println(e.toString()); 00264 System.exit(1); 00265 } 00266 } 00267 } 00268