diff --git a/ws2012/P2P/uebungen/11/src/node/Node.java b/ws2012/P2P/uebungen/11/src/node/Node.java index d5ab17d9..62c05356 100644 --- a/ws2012/P2P/uebungen/11/src/node/Node.java +++ b/ws2012/P2P/uebungen/11/src/node/Node.java @@ -25,6 +25,7 @@ import routingtable.IRoutingTable; import routingtable.RoutingTableImpl; public class Node { + private final static Logger LOGGER = Logger.getLogger(Node.class.getName()); /** @@ -421,31 +422,34 @@ public class Node { private boolean sendLeave(NodeIdentifier n) { return send(n, MessageType.LEAVE, null, false, null); } + + public void storeFile(File file){ + files.add(file); + } private void sendFile(NodeIdentifier nodeID, File file) { - // calculate chunk size - int CHUNK_SIZE = BUFFER_SIZE - 15; - - int FILE_SIZE = (int) file.length(); - - boolean eof = false; - - int NUMBER_OF_CHUNKS = 0; - byte[] temp = null; - - int totalBytesRead = 0; - - Identifier fileID = new Identifier(10, file.getName().getBytes()); - - try { - InputStream inStream = new BufferedInputStream(new FileInputStream( - file)); - - while (totalBytesRead < FILE_SIZE) { - int bytesReamaining = FILE_SIZE - totalBytesRead; - if (bytesReamaining < CHUNK_SIZE) { - CHUNK_SIZE = bytesReamaining + 1; + //calculate chunk size + int CHUNK_SIZE = BUFFER_SIZE - 15; + + int FILE_SIZE = (int)file.length(); + + boolean eof = false; + + int NUMBER_OF_CHUNKS = 0; + byte[] temp = null; + + int totalBytesRead = 0; + + Identifier fileID = new Identifier(10, file.getName().getBytes()); + + try { + InputStream inStream = new BufferedInputStream(new FileInputStream(file)); + + while(totalBytesRead < FILE_SIZE){ + int bytesReamaining = FILE_SIZE-totalBytesRead; + if(bytesReamaining < CHUNK_SIZE){ + CHUNK_SIZE = bytesReamaining+1; eof = true; } temp = new byte[CHUNK_SIZE]; @@ -481,7 +485,5 @@ public class Node { // TODO Auto-generated catch block e.printStackTrace(); } - } - -} +} \ No newline at end of file diff --git a/ws2012/P2P/uebungen/11/src/node/UDPHandler.java b/ws2012/P2P/uebungen/11/src/node/UDPHandler.java index b8c4be9c..62a3e920 100644 --- a/ws2012/P2P/uebungen/11/src/node/UDPHandler.java +++ b/ws2012/P2P/uebungen/11/src/node/UDPHandler.java @@ -1,5 +1,7 @@ package node; +import java.io.File; +import java.io.FileWriter; import java.io.IOException; import java.net.InetSocketAddress; import java.nio.ByteBuffer; @@ -18,6 +20,9 @@ public class UDPHandler implements Runnable { private ByteBuffer buffer = ByteBuffer.allocate(BUF_SIZE); private Node node; + + + private String[] tempData; public UDPHandler(Node node) { this.node = node; @@ -203,25 +208,65 @@ public class UDPHandler implements Runnable { private void receiveData(NodeIdentifier fromID, Identifier rpcID) { - StringBuilder sb = new StringBuilder(); + StringBuilder sb = new StringBuilder(); - while (buffer.hasRemaining()) { - sb.append(buffer.get()); - } + while (buffer.hasRemaining()) { + sb.append(buffer.get()); + } + + String data = sb.toString(); + + String parts[] = data.split("-"); + + String fileAndChunk[] = parts[0].split("|"); + + String fileID = fileAndChunk[0]; + int chunkID = Integer.parseInt(fileAndChunk[1]); + + data = parts[1]; + + if(data.charAt(data.length()) == '!'){ //last chunk + //file zusammensetzen und im zielnode speichern + File file = new File("fileID"); + FileWriter fw; + try { + + fw = new FileWriter(file); + for(int i = 0; i < tempData.length; i++){ + fw.write(tempData[i]); + } + fw.flush(); + + + //store file in node + node.storeFile(file); + + + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + + + + }else{ + tempData[chunkID] = data; + } + + - String data = sb.toString(); - - String parts[] = data.split("-"); - - // This should be the answer to a prior FIND_NODE -> mark this RPC ID as - // received - node.receivedRPC(fromID, rpcID); - - LOGGER.log(Level.INFO, "Received [DATA] [{0}] from Node {1})", - new Object[] { data.toString(), fromID }); + // This should be the answer to a prior FIND_NODE -> mark this RPC ID as + // received + node.receivedRPC(fromID, rpcID); + LOGGER.log(Level.INFO, "Received [DATA] [{0}] from Node {1})", + new Object[] { data.toString(), fromID }); + + } + + private void receivePong(NodeIdentifier fromID, Identifier rpcID) { LOGGER.log(Level.INFO, "Received [PONG] from {0}", new Object[] { fromID });