package nfs; import java.io.BufferedReader; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintStream; import java.net.DatagramPacket; public class RemotePacket { public final static int MAXPACKET = 1024; String op = null; String [] args = null; DatagramPacket dp = null; public static DatagramPacket RemotePacket(String op, String ... params) { /* creates a datagram packet given a number of parameters */ ByteArrayOutputStream baos = new ByteArrayOutputStream(); PrintStream ps = new PrintStream(baos); // print the operation type ps.println(op); // print the lenght of byte involved ps.println(params.length); // print the parameters for(int i=0; i<params.length; i++) ps.println(params[i]); ps.println("ENDPACKET"); ps.flush(); byte [] buffer = baos.toByteArray(); DatagramPacket dp1 = new DatagramPacket(buffer, 0, buffer.length); return dp1; } public RemotePacket(DatagramPacket dp) { /* building of a remote packet from a datagram packet by separating * - the operation requested (READ, WRITE, OPEN, CLOSE) * - the arguments related to the operation (filenames, handlers, etc.) * */ try { this.dp = dp; byte [] buffer = dp.getData(); ByteArrayInputStream bais = new ByteArrayInputStream(buffer); BufferedReader br = new BufferedReader(new InputStreamReader(bais)); /*arguments of the command line are separated by \n*/ this.op = br.readLine(); int numargs = Integer.parseInt(br.readLine()); if(numargs>0) { this.args = new String[numargs]; for(int i=0; i<numargs; i++) { this.args[i] = br.readLine(); } } } catch(IOException e) { e.printStackTrace(); } return; } public String getOp() { return op; } public String [] getArgs() { return args; } public String toString() { String s = op+"::"; for(int i=0;i<args.length;i++) s = s+" "+args[i]; return s; } }