lpr-b:ilserver
no way to compare when less than two revisions
Differenze
Queste sono le differenze tra la revisione selezionata e la versione attuale della pagina.
— | lpr-b:ilserver [19/11/2007 alle 15:12 (18 anni fa)] (versione attuale) – creata Sonia Campa | ||
---|---|---|---|
Linea 1: | Linea 1: | ||
+ | <code java> | ||
+ | package nfs; | ||
+ | import java.io.FileInputStream; | ||
+ | import java.io.FileNotFoundException; | ||
+ | import java.io.FileOutputStream; | ||
+ | import java.io.IOException; | ||
+ | import java.io.InputStream; | ||
+ | import java.io.OutputStream; | ||
+ | import java.net.DatagramPacket; | ||
+ | import java.net.DatagramSocket; | ||
+ | import java.net.SocketException; | ||
+ | import java.util.HashMap; | ||
+ | |||
+ | public class NfsServer { | ||
+ | |||
+ | public static final int port = 23232; | ||
+ | public static int key=0; | ||
+ | private HashMap< | ||
+ | |||
+ | public NfsServer() { | ||
+ | handles = new HashMap< | ||
+ | } | ||
+ | |||
+ | public DatagramPacket open(RemotePacket rp) { | ||
+ | DatagramPacket dp = null; | ||
+ | int mapkey=key++; | ||
+ | String strkey=null; | ||
+ | boolean err=false; | ||
+ | InputStream is=null; | ||
+ | OutputStream os=null; | ||
+ | |||
+ | try { | ||
+ | is = new FileInputStream(rp.getArgs()[0]); | ||
+ | os = new FileOutputStream(rp.getArgs()[0], | ||
+ | } catch (FileNotFoundException e) { | ||
+ | err=true; | ||
+ | } | ||
+ | // a fresh handle is needed for avoiding double entries | ||
+ | strkey = new String(rp.getArgs()[0]+" | ||
+ | if (err){ | ||
+ | dp = RemotePacket.RemotePacket(" | ||
+ | }else{ | ||
+ | handles.put(strkey, | ||
+ | dp = RemotePacket.RemotePacket(" | ||
+ | } | ||
+ | dp.setAddress(rp.dp.getAddress()); | ||
+ | dp.setPort(rp.dp.getPort()); | ||
+ | return dp; | ||
+ | } | ||
+ | |||
+ | public DatagramPacket read(RemotePacket rp) { | ||
+ | DatagramPacket dp = null; | ||
+ | String handleref = rp.getArgs()[0]; | ||
+ | System.out.println(" | ||
+ | StreamRef | ||
+ | if(sr == null) { | ||
+ | dp = RemotePacket.RemotePacket(" | ||
+ | } else { | ||
+ | InputStream is = sr.getIn(); | ||
+ | int len = Integer.parseInt(rp.getArgs()[1]); | ||
+ | byte [] buffer = new byte[len]; | ||
+ | try { | ||
+ | int letti = is.read(buffer, | ||
+ | if (letti==-1) | ||
+ | // the file is empty | ||
+ | letti=0; | ||
+ | byte [] buf = new byte[letti]; | ||
+ | for(int i=0; i<letti; i++) | ||
+ | buf[i] = buffer[i]; | ||
+ | dp = new DatagramPacket(buf, | ||
+ | } catch (IOException e) { | ||
+ | e.printStackTrace(); | ||
+ | dp = RemotePacket.RemotePacket(" | ||
+ | } | ||
+ | } | ||
+ | dp.setAddress(rp.dp.getAddress()); | ||
+ | dp.setPort(rp.dp.getPort()); | ||
+ | return dp; | ||
+ | } | ||
+ | |||
+ | public DatagramPacket close(RemotePacket rp) { | ||
+ | DatagramPacket dp = null; | ||
+ | StreamRef sr = handles.get(rp.getArgs()[0]); | ||
+ | if (sr==null){ | ||
+ | dp = RemotePacket.RemotePacket(" | ||
+ | } else { | ||
+ | InputStream is = sr.getIn(); | ||
+ | OutputStream os = sr.getOut(); | ||
+ | try { | ||
+ | is.close(); | ||
+ | os.close(); | ||
+ | handles.remove(rp.getArgs()[0]); | ||
+ | dp = RemotePacket.RemotePacket(" | ||
+ | } catch (IOException e) { | ||
+ | dp = RemotePacket.RemotePacket(" | ||
+ | } | ||
+ | |||
+ | } | ||
+ | dp.setAddress(rp.dp.getAddress()); | ||
+ | dp.setPort(rp.dp.getPort()); | ||
+ | return dp; | ||
+ | } | ||
+ | |||
+ | |||
+ | private DatagramPacket write(RemotePacket rp) { | ||
+ | // the rp.getArgs() contains the handle and the content to be written | ||
+ | DatagramPacket dp = null; | ||
+ | String handleref = rp.getArgs()[0]; | ||
+ | StreamRef sr = handles.get(handleref); | ||
+ | if (sr==null) { | ||
+ | dp = RemotePacket.RemotePacket(" | ||
+ | } else { | ||
+ | OutputStream os = sr.getOut(); | ||
+ | String msg_err=null; | ||
+ | byte [] buffer = (rp.getArgs()[1]).getBytes(); | ||
+ | try { | ||
+ | os.write(buffer); | ||
+ | os.flush(); | ||
+ | os.close(); | ||
+ | } catch (IOException e) { | ||
+ | msg_err = e.toString(); | ||
+ | } | ||
+ | if (msg_err!=null) | ||
+ | buffer = (" | ||
+ | else | ||
+ | buffer = "OK \n" | ||
+ | |||
+ | dp = new DatagramPacket(buffer, | ||
+ | } | ||
+ | dp.setAddress(rp.dp.getAddress()); | ||
+ | dp.setPort(rp.dp.getPort()); | ||
+ | return dp; | ||
+ | } | ||
+ | |||
+ | |||
+ | /** | ||
+ | * @param args | ||
+ | */ | ||
+ | public static void main(String[] args) { | ||
+ | |||
+ | try { | ||
+ | // create the server socket | ||
+ | DatagramSocket ds = new DatagramSocket(port); | ||
+ | NfsServer processor = new NfsServer(); | ||
+ | // process requests | ||
+ | while (true) { | ||
+ | DatagramPacket dp = new DatagramPacket(new byte[UDPServerComm.LIMIT], | ||
+ | System.out.println(" | ||
+ | ds.receive(dp); | ||
+ | // process the request | ||
+ | |||
+ | RemotePacket rp = new RemotePacket(dp); | ||
+ | System.out.println(" | ||
+ | |||
+ | if(rp.getOp().equals(" | ||
+ | ds.send(processor.open(rp)); | ||
+ | } | ||
+ | if(rp.getOp().equals(" | ||
+ | ds.send(processor.close(rp)); | ||
+ | } | ||
+ | if(rp.getOp().equals(" | ||
+ | ds.send(processor.read(rp)); | ||
+ | } | ||
+ | // go processing next request | ||
+ | if(rp.getOp().equals(" | ||
+ | ds.send(processor.write(rp)); | ||
+ | } | ||
+ | System.out.println(rp.getOp()+" | ||
+ | } | ||
+ | } catch (SocketException e) { | ||
+ | e.printStackTrace(); | ||
+ | } catch (IOException e) { | ||
+ | e.printStackTrace(); | ||
+ | } | ||
+ | |||
+ | } | ||
+ | } | ||
+ | </ |
lpr-b/ilserver.txt · Ultima modifica: 19/11/2007 alle 15:12 (18 anni fa) da Sonia Campa