Changeset 843
- Timestamp:
- 02/05/14 15:30:07 (10 years ago)
- Location:
- trunk
- Files:
-
- 6 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/org/expeditee/gui/FrameUtils.java
r784 r843 1831 1831 // continue; 1832 1832 // } 1833 out.getParentFile().mkdirs(); 1833 copyFile(file, out, true); 1834 } 1835 } 1836 1837 /** 1838 * @param src 1839 * @param dst 1840 * @throws IOException 1841 */ 1842 public static void copyFile(File src, File dst, boolean overWrite) throws IOException { 1843 if(!overWrite && dst.exists()) 1844 return; 1845 dst.getParentFile().mkdirs(); 1834 1846 FileOutputStream fOut = null; 1835 1847 FileInputStream fIn = null; 1836 1848 try { 1837 1849 // System.out.println(out.getPath()); 1838 fOut = new FileOutputStream( out);1839 fIn = new FileInputStream( file);1850 fOut = new FileOutputStream(dst); 1851 fIn = new FileInputStream(src); 1840 1852 byte[] bBuffer = new byte[1024]; 1841 1853 int nLen; … … 1854 1866 } 1855 1867 } 1856 1857 }1858 1868 } 1859 1869 -
trunk/src/org/expeditee/items/Picture.java
r793 r843 26 26 27 27 import org.expeditee.gui.FrameGraphics; 28 import org.expeditee.gui.FrameIO; 28 29 import org.expeditee.gui.FrameMouseActions; 30 import org.expeditee.gui.FrameUtils; 29 31 import org.expeditee.stats.Logger; 30 32 … … 740 742 return _fileName; 741 743 } 744 745 public String getPath() { 746 return _path; 747 } 748 749 /** 750 * Copies the image to the default images folder and updates the reference to it in Expeditee 751 * Used for correcting image references for FrameShare 752 */ 753 public void moveToImagesFolder() { 754 File f = new File(getPath()); 755 // if the file is not in the default images folder, copy it there 756 if(! f.getParentFile().equals(new File(FrameIO.IMAGES_PATH))) { 757 try { 758 File f2 = new File(FrameIO.IMAGES_PATH + f.getName()); 759 FrameUtils.copyFile(f, f2, false); 760 f = f2; 761 } catch (IOException e) { 762 e.printStackTrace(); 763 f = null; 764 } 765 } 766 _path = f.getPath(); 767 _fileName = f.getName(); 768 updateSource(); 769 } 742 770 743 771 protected String getTagText() { -
trunk/src/org/expeditee/network/FrameShare.java
r838 r843 3 3 import java.io.BufferedReader; 4 4 import java.io.File; 5 import java.io.FileOutputStream;6 5 import java.io.IOException; 7 6 import java.io.InputStream; 7 import java.io.OutputStream; 8 8 import java.io.StringReader; 9 9 import java.io.StringWriter; … … 17 17 import java.util.HashMap; 18 18 import java.util.LinkedList; 19 import java.util.List; 19 20 import java.util.Map; 20 21 … … 27 28 import org.expeditee.io.FrameReader; 28 29 import org.expeditee.io.FrameWriter; 30 import org.expeditee.items.Item; 31 import org.expeditee.items.Picture; 29 32 import org.expeditee.items.Text; 30 33 import org.expeditee.settings.network.NetworkSettings; … … 61 64 62 65 private FrameShare(int port) { 63 66 this(); 64 67 _port = port; 65 68 … … 253 256 254 257 /** 255 * Send s an image to the server,256 * So that other users can view the image on the server frames257 * 258 * @ param imageName259 * @param peerName258 * Send a list of images that may need to be uploaded 259 * Then wait for a response (in form of a list of shorts denoting which files to keep) 260 * Then send each file in sequence 261 * @author jts21 262 * 260 263 */ 261 p ublic void sendImage(String imageName, String peerName){264 private class ImageSender extends Thread { 262 265 266 private List<File> imageFiles; 267 private Peer peer; 268 269 public ImageSender(List<File> imageFiles, Peer peer) { 270 super("ImageSender"); 271 this.imageFiles = imageFiles; 272 this.peer = peer; 273 } 274 275 @Override 276 public void run() { 277 System.out.println("Sending images to server"); 278 try(Socket socket = new Socket(peer.getAddress(), peer.getPort() + ImageSaver.OFFSET)) { 279 socket.setSoTimeout(NetworkSettings.FrameShareTimeout.get() * 2); 280 OutputStream os = socket.getOutputStream(); 281 // send the list of filenames to the server 282 int numFiles = imageFiles.size(); 283 if(numFiles > 255) { 284 throw new Exception("Too many images on the frame"); 285 } 286 os.write((byte) (numFiles & 0xFF)); 287 // send the list of different files 288 for(File f : imageFiles) { 289 byte[] fileName = f.getName().getBytes(); 290 int fileNameLen = fileName.length; 291 if(fileNameLen > 255) { 292 throw new Exception("Filename too long"); 293 } 294 os.write((byte) ((fileNameLen) & 0xFF)); 295 os.write(fileName); 296 } 297 // the server sends indices of files it wants, send their data 298 InputStream is = socket.getInputStream(); 299 int i = -1; 300 while((i = is.read()) != -1 && i < imageFiles.size()) { 301 File f = imageFiles.get(i); 302 System.out.println("... sending " + f.getName()); 303 ImageServer.sendImage(f, socket); 304 } 305 } catch(Exception e) { 306 e.printStackTrace(); 307 } 308 } 263 309 } 264 310 … … 266 312 try(Socket socket = new Socket(peer.getAddress(), peer.getPort() + ImageServer.OFFSET)) { 267 313 socket.setSoTimeout(NetworkSettings.FrameShareTimeout.get() * 2); 268 byte[] fileName = imageName.getBytes( );314 byte[] fileName = imageName.getBytes(ImageServer.CHARSET); 269 315 int fileNameLen = fileName.length; 270 byte[] data = new byte[2 + fileNameLen]; 271 data[0] = (byte) ((fileNameLen >> 8) & 0xFF); 272 data[1] = (byte) ((fileNameLen) & 0xFF); 273 System.arraycopy(fileName, 0, data, 2, fileNameLen); 274 socket.getOutputStream().write(data); 275 socket.getOutputStream().flush(); 316 OutputStream os = socket.getOutputStream(); 317 os.write((byte) ((fileNameLen) & 0xFF)); 318 os.write(fileName); 319 os.flush(); 276 320 socket.shutdownOutput(); 277 InputStream is = socket.getInputStream(); 278 // file length is the first 4 bytes 279 int fileLen = (is.read() << 24) | (is.read() << 16) | (is.read() << 8) | is.read(); 280 // if the above reads failed, fileLen will be -1 281 if(fileLen <= 0) { 282 return false; 283 } 284 System.out.println("Receiving " + new String(fileName, ImageServer.CHARSET) + " (" + fileLen + " bytes)"); 285 File f = new File(FrameIO.IMAGES_PATH + imageName); 286 f.getParentFile().mkdirs(); 287 FileOutputStream out = new FileOutputStream(f); 288 // file is the remaining bytes of the stream 289 byte[] buf = null; 290 if(fileLen > 1024) { 291 buf = new byte[1024]; 292 while(fileLen > 1024) { 293 is.read(buf); 294 out.write(buf); 295 fileLen -= 1024; 296 } 297 } 298 buf = new byte[fileLen]; 299 is.read(buf); 300 out.write(buf); 301 out.flush(); 302 out.close(); 321 boolean ret = ImageSaver.recvImage(new File(FrameIO.IMAGES_PATH + imageName), socket); 303 322 socket.close(); 304 return true;323 return ret; 305 324 } catch(Exception e) { 306 325 e.printStackTrace(); … … 371 390 372 391 Peer peer = _peers.get(toSave.getPath().toLowerCase()); 392 393 List<File> imageFiles = new LinkedList<File>(); 394 for(Item i : toSave.getItems()) { 395 if(i instanceof Picture) { 396 ((Picture) i).moveToImagesFolder(); 397 File f = new File(((Picture) i).getPath()); 398 if(f != null && f.isFile() && !imageFiles.contains(f)) { 399 imageFiles.add(f); 400 } 401 } 402 } 403 new ImageSender(imageFiles, peer).start(); 404 373 405 String fileContents = ""; 374 406 // Now read the frame from the file contents … … 488 520 if (args.length != 1) { 489 521 490 // Work out the 'program name' (i.e. this class), but done in a general491 // way in case class name is changed at a later date492 StackTraceElement[] stack = Thread.currentThread ().getStackTrace ();493 StackTraceElement main = stack[stack.length - 1];494 String mainClass = main.getClassName ();495 496 System.err.println("Usage: java " + mainClass + " port-number");497 System.exit(1);522 // Work out the 'program name' (i.e. this class), but done in a general 523 // way in case class name is changed at a later date 524 StackTraceElement[] stack = Thread.currentThread ().getStackTrace (); 525 StackTraceElement main = stack[stack.length - 1]; 526 String mainClass = main.getClassName (); 527 528 System.err.println("Usage: java " + mainClass + " port-number"); 529 System.exit(1); 498 530 } 499 531 532 MessageBay.suppressMessages(true); 533 500 534 String port_str = args[0]; 501 535 502 536 try { 503 int port = Integer.parseInt(port_str);504 505 init(port);537 int port = Integer.parseInt(port_str); 538 539 init(port); 506 540 } 507 541 catch (Exception e) { -
trunk/src/org/expeditee/network/ImageSaver.java
r838 r843 5 5 import java.io.IOException; 6 6 import java.io.InputStream; 7 import java.io.OutputStream; 7 8 import java.net.ServerSocket; 8 9 import java.net.Socket; 10 import java.util.ArrayList; 11 import java.util.List; 9 12 10 13 import org.expeditee.gui.FrameIO; 11 14 12 15 public class ImageSaver extends DefaultServer { 16 17 public static boolean recvImage(File file, Socket socket) throws IOException { 18 InputStream is = socket.getInputStream(); 19 // file length is the first 4 bytes 20 int fileLen = (is.read() << 24) | (is.read() << 16) | (is.read() << 8) | is.read(); 21 // if the above reads failed, fileLen will be -1 22 if(fileLen <= 0) { 23 return false; 24 } 25 System.out.println("Receiving " + file.getName() + " (" + fileLen + " bytes)"); 26 file.getParentFile().mkdirs(); 27 FileOutputStream out = new FileOutputStream(file); 28 // file is the remaining bytes of the stream 29 byte[] buf = null; 30 if(fileLen > 1024) { 31 buf = new byte[1024]; 32 while(fileLen > 1024) { 33 is.read(buf); 34 out.write(buf); 35 fileLen -= 1024; 36 } 37 } 38 buf = new byte[fileLen]; 39 is.read(buf); 40 out.write(buf); 41 out.flush(); 42 out.close(); 43 return true; 44 } 13 45 14 46 /** … … 20 52 private static class ImageReceiver extends Thread { 21 53 22 private Socket client;54 private Socket socket; 23 55 24 56 public ImageReceiver(Socket client) { 25 57 super("ImageReceiver"); 26 this. client = client;58 this.socket = client; 27 59 } 28 60 … … 30 62 public void run() { 31 63 try { 32 this.client.shutdownOutput(); 33 InputStream is = this.client.getInputStream(); 34 // file name length is the first 2 bytes 35 int fileNameLen = (is.read() << 8) | is.read(); 36 // file length is the next 4 bytes 37 int fileLen = (is.read() << 24) | (is.read() << 16) | (is.read() << 8) | is.read(); 38 // file name is the remaining bytes of the header, encoded in UTF-8 39 byte[] fileName = new byte[fileNameLen]; 40 is.read(fileName); 41 File f = new File(FrameIO.IMAGES_PATH + new String(fileName, ImageServer.CHARSET)); 42 f.mkdirs(); 43 // file is the remaining bytes of the stream 44 byte[] fileData = new byte[fileLen]; 45 is.read(fileData); 46 // write the file 47 FileOutputStream out = new FileOutputStream(f); 48 out.write(fileData); 49 out.close(); 50 this.client.close(); 64 InputStream is = this.socket.getInputStream(); 65 OutputStream os = this.socket.getOutputStream(); 66 // number of files is the first byte 67 int numFiles = is.read(); 68 if(numFiles == -1) 69 return; 70 // read the filenames 71 File[] files = new File[numFiles]; 72 List<Integer> wantFiles = new ArrayList<Integer>(); 73 for(int i = 0; i < numFiles; i++) { 74 int fileNameLen = is.read(); 75 byte[] fileName = new byte[fileNameLen]; 76 is.read(fileName); 77 files[i] = new File(FrameIO.IMAGES_PATH + new String(fileName, ImageServer.CHARSET)); 78 // pick out which files we want 79 if(!files[i].exists()) { 80 wantFiles.add(i); 81 os.write(i); 82 } 83 } 84 // get the files 85 for(Integer i : wantFiles) { 86 recvImage(files[i], socket); 87 } 88 this.socket.close(); 51 89 } catch (IOException e) { 52 90 e.printStackTrace(); -
trunk/src/org/expeditee/network/ImageServer.java
r838 r843 1 1 package org.expeditee.network; 2 2 3 import java.io.BufferedOutputStream;4 3 import java.io.File; 5 4 import java.io.FileInputStream; 6 5 import java.io.IOException; 7 6 import java.io.InputStream; 7 import java.io.OutputStream; 8 8 import java.net.ServerSocket; 9 9 import java.net.Socket; … … 13 13 14 14 public class ImageServer extends DefaultServer { 15 16 public static void sendImage(File file, Socket socket) throws IOException { 17 OutputStream os = socket.getOutputStream(); 18 // send the file over the socket 19 int fileLen = (int) file.length(); 20 System.out.println("Sending " + file.getName() + " (" + fileLen + " bytes)"); 21 byte[] fileLenBytes = new byte[4]; 22 fileLenBytes[0] = (byte) ((fileLen >> 24) & 0xFF); 23 fileLenBytes[1] = (byte) ((fileLen >> 16) & 0xFF); 24 fileLenBytes[2] = (byte) ((fileLen >> 8) & 0xFF); 25 fileLenBytes[3] = (byte) ((fileLen) & 0xFF); 26 os.write(fileLenBytes); 27 FileInputStream in = new FileInputStream(file); 28 byte[] buf = null; 29 if(in.available() > 1024) { 30 buf = new byte[1024]; 31 while(in.available() > 1024) { 32 in.read(buf); 33 os.write(buf); 34 } 35 } 36 buf = new byte[in.available()]; 37 in.read(buf); 38 os.write(buf); 39 os.flush(); 40 in.close(); 41 } 15 42 16 43 /** … … 22 49 private static class ImageSender extends Thread { 23 50 24 private Socket client;51 private Socket socket; 25 52 26 53 public ImageSender(Socket client) { 27 54 super("ImageSender"); 28 this. client = client;55 this.socket = client; 29 56 } 30 57 … … 32 59 public void run() { 33 60 try { 34 BufferedOutputStream os = new BufferedOutputStream(this.client.getOutputStream()); 35 InputStream is = this.client.getInputStream(); 36 // file name length is the first 2 bytes 37 int fileNameLen = (is.read() << 8) | is.read(); 61 InputStream is = this.socket.getInputStream(); 62 // file name length is the first byte 63 int fileNameLen = is.read(); 64 if(fileNameLen <= 0) 65 return; 38 66 // file name is the remaining bytes of the stream, encoded in UTF-8 39 67 byte[] fileName = new byte[fileNameLen]; 40 68 is.read(fileName); 41 this.client.shutdownInput(); 42 File f = new File(FrameIO.IMAGES_PATH + new String(fileName, ImageServer.CHARSET)); 43 if(f.exists()) { 44 // send the file over the socket 45 int fileLen = (int) f.length(); 46 System.out.println("Sending " + new String(fileName, ImageServer.CHARSET) + " (" + fileLen + " bytes)"); 47 byte[] fileLenBytes = new byte[4]; 48 fileLenBytes[0] = (byte) ((fileLen >> 24) & 0xFF); 49 fileLenBytes[1] = (byte) ((fileLen >> 16) & 0xFF); 50 fileLenBytes[2] = (byte) ((fileLen >> 8) & 0xFF); 51 fileLenBytes[3] = (byte) ((fileLen) & 0xFF); 52 os.write(fileLenBytes); 53 FileInputStream in = new FileInputStream(f); 54 byte[] buf = null; 55 if(in.available() > 1024) { 56 buf = new byte[1024]; 57 while(in.available() > 1024) { 58 in.read(buf); 59 os.write(buf); 60 } 61 } 62 buf = new byte[in.available()]; 63 in.read(buf); 64 os.write(buf); 65 os.flush(); 66 in.close(); 67 } 68 this.client.close(); 69 this.socket.shutdownInput(); 70 sendImage(new File(FrameIO.IMAGES_PATH + new String(fileName, ImageServer.CHARSET)), socket); 71 this.socket.close(); 69 72 } catch (IOException e) { 70 73 e.printStackTrace();
Note:
See TracChangeset
for help on using the changeset viewer.