📄 sftp.java
字号:
// K bytes per second calcul long elapsedTime = System.currentTimeMillis() - stime; // protect agains div by 0 if (elapsedTime == 0) elapsedTime = 1; long kbpsec = (long)(((long)fileSize)/elapsedTime); float secs = (float)(((float)elapsedTime)/1000.0); println("\nSent: " + fileSize + " bytes in " + secs + " secs[" + kbpsec + "Kbytes/sec]"); try { fs.close(); } catch (Exception ex) { printStackTrace( "Close failed for " + fileName, ex ); } pipeOut.close(); return ShellApp.appNoError; } private int registerNewUser(String[] args) { boolean secure = true; if( (args.length == 3) && ("-insecure".equals(args[2])) ) secure = false; else if ((args.length != 2)) { return syntaxError(); } String name = args[1]; // Always secure String type = null; if( secure ) type = PipeService.UnicastSecureType; else type = PipeService.UnicastType; // Check if there is already a registered user of the // same name. PipeAdvertisement adv = findUserAdv(name); if (adv != null) { consoleMessage("Sorry, user " + name + " is already registered"); return ShellApp.appMiscError; } try { // Create a pipe advertisement for this pipe. adv = (PipeAdvertisement) AdvertisementFactory.newAdvertisement(PipeAdvertisement.getAdvertisementType()); } catch( Exception all ) { printStackTrace( "Advertisement document could not be created", all ); return ShellApp.appMiscError; } ShellObject obj = env.get("stdgroup"); // extract the advertisement PeerGroup group = (PeerGroup) obj.getObject(); adv.setPipeID( IDFactory.newPipeID( (PeerGroupID) group.getPeerGroupID() ) ); adv.setName(SftpNameTag + "." + name); adv.setType (type); try { // Save the document into the public folder discovery.publish(adv); discovery.remotePublish(adv); } catch (Exception e2) { printStackTrace( "Advertisement could not be saved", e2 ); return ShellApp.appMiscError; } println("User : " + name + " is now registered"); return ShellApp.appNoError; } // Make sure "name" is the advertised name private boolean checkUserAdv(PipeAdvertisement adv, String name) { if (adv == null) return false; if (adv.getName() == null) return false; String str = adv.getName(); if (str.startsWith(SftpNameTag) && str.endsWith(name)) { return true; } return false; } private PipeAdvertisement findUserAdv(String name) { Enumeration each = null; // First look in the local storage try { each = discovery.getLocalAdvertisements(DiscoveryService.ADV, PipeAdvertisement.NameTag, SftpNameTag+".*"); if ((each != null) && (each.hasMoreElements())) { PipeAdvertisement adv = null; while (each.hasMoreElements()) { try { adv = (PipeAdvertisement) each.nextElement(); if (adv.getName().endsWith(name)) { if (checkUserAdv(adv, name)) { return adv; } } } catch(Exception e) { continue; } if (checkUserAdv(adv, name)) { return adv; } } } } catch (Exception e) { printStackTrace( "Exception locating advertisement", e ); } // Now, search remote discovery.getRemoteAdvertisements(null, DiscoveryService.ADV, PipeAdvertisement.NameTag, SftpNameTag + "." + name, 2, null); // Wait a bit in order to get an answer. int i = 0; while (true) { try { if (i>MAXRETRIES) { println(""); break; } Thread.sleep(WaitingTime); print("."); i++; } catch (Exception e) { printStackTrace( "Exception locating advertisement", e); } // Look in the local storage again try { each = discovery.getLocalAdvertisements(DiscoveryService.ADV, PipeAdvertisement.NameTag, SftpNameTag + "." + name); if ((each != null) && (each.hasMoreElements())) { PipeAdvertisement adv = null; while (each.hasMoreElements()) { try { adv = (PipeAdvertisement) each.nextElement(); } catch(Exception e) { continue; } if (checkUserAdv(adv, name)) { return adv; } } } } catch (Exception e) { printStackTrace( "Exception locating advertisement", e ); } } // adv not found return null; } private void runDaemon(String name, PipeAdvertisement adv) { userAdv = adv; userName = name; thread = new Thread(this, "Jftpd:Jftpd Deamon" ); thread.start(); // Store this object ShellObject obj = env.add(EnvName + "." + name + "@" + (getGroup().getPeerGroupAdvertisement()).getName(), new ShellObject("Sftpd Deamon for " + name + "@" + (getGroup().getPeerGroupAdvertisement()).getName(), this)); } private void stopDaemon(String name) { String dname = EnvName + "." + name + "@" + (getGroup().getPeerGroupAdvertisement()).getName(); ShellObject obj = env.get(dname); if (obj == null) { consoleMessage( "Daemon(" + dname + ") for " + name + " not found"); return; } sftp d = null; try { d = (sftp) obj.getObject(); d.thread.interrupt(); env.remove(dname); } catch (Exception e) { printStackTrace( "cannot stop daemon for " + name, e ); } } public void run() { try { InputPipe pipeIn = null; try { pipeIn = getGroup().getPipeService().createInputPipe(userAdv); } catch (Exception e) { return ; } if (pipeIn == null) { consoleMessage( "cannot open InputPipe"); return; } // Listen on the pipe Message msg = null; // Message counter int i = 0; // Receive a file File f = null; FileOutputStream fout = null; String fileName = null; int fsize = 0; int offset = 0; long stime = 0; while (true) { try { msg = pipeIn.waitForMessage(); if (msg == null) { if (Thread.interrupted()) { // We have been asked to stop consoleMessage( "stop listening for user " + userName); pipeIn.close(); return; } println("NULL msg"); continue; } } catch (Exception e) { // This exception probaly happened because the // deamon has been interrupted. In any case, that // shows that sftpd cannot receive messages anyway. // clean up. pipeIn.close(); return; } // Get the first tag InputStream ip = null; String senderName = "Anonymous"; // Get the file information // i == 0 on start or restart if (i++ == 0) { fout = null; // used as a flag String fileInfo = (msg.getMessageElement(FileInfo)).toString(); if (fileInfo == null) { // Something is broken pipeIn.close(); consoleMessage( "bad message received. Stopping daemon for user :" + userName); env.remove(EnvName + "." + userName + "@" + (getGroup().getPeerGroupAdvertisement()).getName()); return; } // open the file for output. // fileInfo == "filename\nfilesize" int j = fileInfo.indexOf("\n"); fileName = fileInfo.substring(0, j); String ofile = fdir + fileName; try { f = new File(ofile); if (f.exists()) { f.delete(); } if (f.createNewFile()) { fout = new FileOutputStream(f); } } catch (Exception e) { printStackTrace( "Could not create output file " + ofile, e ); consoleMessage("Will receive but not write the data"); fout = null; } // file size String filesize = fileInfo.substring(j+1); Integer isize = new Integer(filesize); fsize = isize.intValue(); // start at BOF offset = 0; stime = System.currentTimeMillis(); } // Get sender information senderName = (msg.getMessageElement(SenderName)).toString(); if (i == 1) { println("\nReceive " + fileName + "[" + fsize + " bytes] from " + senderName); } // write data to file byte[] data = (msg.getMessageElement(JftpData)).getBytes(false); if (data == null) { println("sftpd: user " + senderName + " sent empty data"); continue; } if (fout != null) { fout.write(data, 0, data.length); } // See if the file transfer is done offset += data.length; if (offset == fsize) { println("! Done"); i = 0; if (fout != null) fout.close(); // elapsed time and bytes per sec. long elapsedTime = System.currentTimeMillis() - stime; // div by 0 check if (elapsedTime == 0) elapsedTime = 1; long kbpsec = (long)(((long)fsize)/elapsedTime); float secs = (float)(((float)elapsedTime)/1000.0); println("Received: " + fsize + " bytes in " + secs + " secs[" + kbpsec + "Kbytes/sec]"); } else { print("!"); } } } catch( Throwable all ) { printStackTrace( "Uncaught Throwable in thread :" + Thread.currentThread().getName(), all ); } } public String getDescription() { return "Send a file to another peer"; } public void help() { println("NAME"); println(" sftp - send a file to another peer "); println(" "); println("SYNOPSIS"); println(" "); println(" sftp -register <userName>"); println(" sftp -login <userName>"); println(" sftp -logout <userName>"); println(" sftp -s <user> <userName> <fileName>"); println(" "); println("DESCRIPTION"); println(" "); println("The 'sftp command implements a secure file transfer"); println("where one peer can send a file to a second."); println("to use 'sftp'. The user needs to register himself. This is done"); println("via the following steps:"); println("Step 1: Register via 'sftp -register <username>' command. This command"); println(" creates a secure sftp advertisement for that user. This has to"); println(" be done only once, the first time the user registers with"); println(" sftp. The system remembers it across reboot."); println(" "); println("Step 2: Login via 'sftp -login <username>' command. This command"); println(" login the user and start a listener daemon. This has to"); println(" to be done everytime the peer is restarted."); println(" "); println("Step 3: User can securely send a file to another user via the command"); println(" 'sftp -s <myusername> <destusername> <filename>'. This will send the"); println(" file <filename> to the dest. The file is written on the sftp"); println(" subdirectory of the directory where the shell is started."); println(" "); println(" JXTA>sftp -s moi mike photo.gif"); println(" sftp is connected to user mike"); println(" Sending file photo.gif, size = 55692 bytes"); println(" "); println("To stop receiving any more files the user can stop the sftp"); println("listener daemon by entering the command 'sftp -logout <username>'"); println(" "); println("OPTIONS"); println(" "); println(" -register register a new user name "); println(" -login log user and set default user"); println(" -logout logout"); println(" -s specify current user, and file names"); println(" "); println("EXAMPLE"); println(" "); println(" JXTA>sftp -register me"); println(" JXTA>sftp -login me"); println(" JXTA>sftp -s me you /tmp/nihow.jpg"); println(" "); println("This example shows how a new user 'me' can register and log into sftp,"); println("and send a file to the user 'you'. User 'you' needs to be similarly"); println("registered and logged on. The above file is written as sftp/nihow.jpg"); println(" "); println("SEE ALSO"); }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -