From 303042078c16eabd9f98ec7c2f13d0d3823ecf9d Mon Sep 17 00:00:00 2001 From: senft-lap Date: Thu, 15 Nov 2012 20:10:38 +0100 Subject: [PATCH] Switched to real network communication, not just calling methods on objects --- ws2011/BP/Auftraggebertreffen/.DS_Store | Bin 6148 -> 0 bytes ws2011/BP/Datenbank Backups/.DS_Store | Bin 6148 -> 0 bytes ws2011/BP/QS-Dokument/.DS_Store | Bin 6148 -> 0 bytes ws2011/BP/Wiki-Stuff/.DS_Store | Bin 6148 -> 0 bytes ws2011/Compiler I/Triangle-2.1-esa3/.DS_Store | Bin 6148 -> 0 bytes .../Triangle-2.1-esa3/Triangle/.DS_Store | Bin 6148 -> 0 bytes .../Compiler I/Uebungen/2. Uebung/.DS_Store | Bin 6148 -> 0 bytes .../Compiler I/Uebungen/3. Uebung/.DS_Store | Bin 6148 -> 0 bytes ws2011/FOC/Folien/.DS_Store | Bin 6148 -> 0 bytes .../Klausurvorbereitung/Klausuren/.DS_Store | Bin 6148 -> 0 bytes ws2011/Semantic Web/Folien/.DS_Store | Bin 6148 -> 0 bytes ws2011/Semantic Web/Praesentation/.DS_Store | Bin 6148 -> 0 bytes ws2011/Semantic Web/Uebungen/.DS_Store | Bin 6148 -> 0 bytes .../Uebungen/1. Bonus Aufgabe/.DS_Store | Bin 12292 -> 0 bytes .../Dokumentation in TeX/.DS_Store | Bin 6148 -> 0 bytes .../1. Bonus Aufgabe/SemanticWebApp/.DS_Store | Bin 6148 -> 0 bytes .../SemanticWebApp/logic/.DS_Store | Bin 6148 -> 0 bytes .../Uebungen/2. Bonus Aufgabe/.DS_Store | Bin 6148 -> 0 bytes .../uebungen/4/src/common/MessageType.java | 6 +- .../P2P/uebungen/4/src/network/Network.java | 21 +- ws2012/P2P/uebungen/4/src/peer/Node.java | 254 ++++++++++++------ ws2012/P2P/uebungen/4/src/peer/Peer.java | 52 ---- ws2012/P2P/uebungen/4/src/peer/UDPListen.java | 12 - 23 files changed, 191 insertions(+), 154 deletions(-) delete mode 100644 ws2011/BP/Auftraggebertreffen/.DS_Store delete mode 100644 ws2011/BP/Datenbank Backups/.DS_Store delete mode 100644 ws2011/BP/QS-Dokument/.DS_Store delete mode 100644 ws2011/BP/Wiki-Stuff/.DS_Store delete mode 100644 ws2011/Compiler I/Triangle-2.1-esa3/.DS_Store delete mode 100644 ws2011/Compiler I/Triangle-2.1-esa3/Triangle/.DS_Store delete mode 100644 ws2011/Compiler I/Uebungen/2. Uebung/.DS_Store delete mode 100644 ws2011/Compiler I/Uebungen/3. Uebung/.DS_Store delete mode 100644 ws2011/FOC/Folien/.DS_Store delete mode 100644 ws2011/FOC/Klausurvorbereitung/Klausuren/.DS_Store delete mode 100644 ws2011/Semantic Web/Folien/.DS_Store delete mode 100644 ws2011/Semantic Web/Praesentation/.DS_Store delete mode 100644 ws2011/Semantic Web/Uebungen/.DS_Store delete mode 100644 ws2011/Semantic Web/Uebungen/1. Bonus Aufgabe/.DS_Store delete mode 100644 ws2011/Semantic Web/Uebungen/1. Bonus Aufgabe/Dokumentation in TeX/.DS_Store delete mode 100644 ws2011/Semantic Web/Uebungen/1. Bonus Aufgabe/SemanticWebApp/.DS_Store delete mode 100644 ws2011/Semantic Web/Uebungen/1. Bonus Aufgabe/SemanticWebApp/logic/.DS_Store delete mode 100644 ws2011/Semantic Web/Uebungen/2. Bonus Aufgabe/.DS_Store delete mode 100644 ws2012/P2P/uebungen/4/src/peer/Peer.java delete mode 100644 ws2012/P2P/uebungen/4/src/peer/UDPListen.java diff --git a/ws2011/BP/Auftraggebertreffen/.DS_Store b/ws2011/BP/Auftraggebertreffen/.DS_Store deleted file mode 100644 index 5008ddfcf53c02e82d7eee2e57c38e5672ef89f6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6148 zcmeH~Jr2S!425mzP>H1@V-^m;4Wg<&0T*E43hX&L&p$$qDprKhvt+--jT7}7np#A3 zem<@ulZcFPQ@L2!n>{z**++&mCkOWA81W14cNZlEfg7;MkzE(HCqgga^y>{tEnwC%0;vJ&^%eQ zLs35+`xjp>T0H1@V-^m;4Wg<&0T*E43hX&L&p$$qDprKhvt+--jT7}7np#A3 zem<@ulZcFPQ@L2!n>{z**++&mCkOWA81W14cNZlEfg7;MkzE(HCqgga^y>{tEnwC%0;vJ&^%eQ zLs35+`xjp>T0{5`S=tOhJkA11N!tfC~}{I(K|F%sxO^28oIS%}Tp- zx8Avnr|@P0l;!^R0$2c;(+%-zVQTi=d}0TgDMUKY=y8ud9&m@pN%i*$utX#!+!3u`I{S8GASShq<|EV0#e|23Rv%@&5r^VrGONW z0-p-l_o31aTjCJtpAH5e0f;lE-MIEyf>7i4Gqe&^Vo*zt7$xY;*Q{%aLtxNR z{AQk$HzB^>UOJs3--bz*vF9*eONC#vT&@ diff --git a/ws2011/BP/Wiki-Stuff/.DS_Store b/ws2011/BP/Wiki-Stuff/.DS_Store deleted file mode 100644 index 5008ddfcf53c02e82d7eee2e57c38e5672ef89f6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6148 zcmeH~Jr2S!425mzP>H1@V-^m;4Wg<&0T*E43hX&L&p$$qDprKhvt+--jT7}7np#A3 zem<@ulZcFPQ@L2!n>{z**++&mCkOWA81W14cNZlEfg7;MkzE(HCqgga^y>{tEnwC%0;vJ&^%eQ zLs35+`xjp>T0Lw?BqE+%vRc@D(q5x}L2;K2RbRNCi@XR3H^d1zH87MRwCRl%7-| z6}WH(^!rd~$~Aa&woeBa8v)1@x(&RxS%O^DL9W50Gd+ZODcMUUMhx+C`b*^1;L+L3 zAu)VNoGdY+h@H;;i={)VbFQgCD)3VQoxO>f_WuR#kNID75~)BcaHa~#q+j-PzFhRy y<~6m~7TN>t2o#@YfX0zTDMy$xp>K9#Ny9`I%Z#CA6jO*mt{CH_3EhrWPkUm0Yb-JmW(G z`vEsfoh>ayzLCyf+^5K>@5vc(2AlzBVCoFWMMjxl8G7psI0MeWHv@7$M5C8Cp0(EtAU8!qJjf8t+ew8$TZ_{bS>2L2fXVYc3^SNy1axBmD%xoac!l`0~B popdPd4;}#=$T@PalQtivPrsD0Gn6c1*Kndg1e6eOoPj@J;1i&(HKG6j diff --git a/ws2011/Compiler I/Uebungen/2. Uebung/.DS_Store b/ws2011/Compiler I/Uebungen/2. Uebung/.DS_Store deleted file mode 100644 index 11b060236f7e378940bd143eacacf82cf87081ac..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6148 zcmeHKF-`+P474E44usx}|@GVI`9SQa}nw0VyB_ey0F?FKjwXRFnczKnk1`;P;`yiM?=0j86wb zi~zt1(qUM~ECFmx0DIw(hz!h=3QVfkh~Y^`zExc>91@dm9yjATb+gxm;&D6jEy~S% zqM{U#0_O@`=XTEizlQ%X|DThzlLAuUUn$^|)n>KCD^+hDy&QXOgFnMr^9iS69TbFU k$G~XE*svYnMN!r@u5sQAhs2;GA9SGp3{V%D6!>cej_BAL5&!@I diff --git a/ws2011/Compiler I/Uebungen/3. Uebung/.DS_Store b/ws2011/Compiler I/Uebungen/3. Uebung/.DS_Store deleted file mode 100644 index 5008ddfcf53c02e82d7eee2e57c38e5672ef89f6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6148 zcmeH~Jr2S!425mzP>H1@V-^m;4Wg<&0T*E43hX&L&p$$qDprKhvt+--jT7}7np#A3 zem<@ulZcFPQ@L2!n>{z**++&mCkOWA81W14cNZlEfg7;MkzE(HCqgga^y>{tEnwC%0;vJ&^%eQ zLs35+`xjp>T0H1@V-^m;4Wg<&0T*E43hX&L&p$$qDprKhvt+--jT7}7np#A3 zem<@ulZcFPQ@L2!n>{z**++&mCkOWA81W14cNZlEfg7;MkzE(HCqgga^y>{tEnwC%0;vJ&^%eQ zLs35+`xjp>T0ew z%}sHR&CJ*Pmm9OCnGJBFeK5?8=k%FfRK|gDJY%#s+uQ5?ZhW3qA5V}w*b`XqcK4gV z-HltE@rPa0zrwJRNdYM!1*Cu!kOJo@z}^cRt`ZfcfE17dKML^s(BQ;gI3>oX10hBL z-~#C|tYek{HYR|*a7si5=1B!6)oaA?q$A&|t`|;;NjHz1@tnHZYeMn39r+gJ<~>nS z3P^!N1uk>DWdFZ~pP2s-N!m#PDe$ip@Wtj~v&Jh`Z=Jmydu@Y1!ddePr(qowglNaW iXvf&F9j~G&>l)WM?}bxh(2);1P=5xfi%bgqwF2K*z#D)7 diff --git a/ws2011/Semantic Web/Folien/.DS_Store b/ws2011/Semantic Web/Folien/.DS_Store deleted file mode 100644 index 5008ddfcf53c02e82d7eee2e57c38e5672ef89f6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6148 zcmeH~Jr2S!425mzP>H1@V-^m;4Wg<&0T*E43hX&L&p$$qDprKhvt+--jT7}7np#A3 zem<@ulZcFPQ@L2!n>{z**++&mCkOWA81W14cNZlEfg7;MkzE(HCqgga^y>{tEnwC%0;vJ&^%eQ zLs35+`xjp>T0H1@V-^m;4Wg<&0T*E43hX&L&p$$qDprKhvt+--jT7}7np#A3 zem<@ulZcFPQ@L2!n>{z**++&mCkOWA81W14cNZlEfg7;MkzE(HCqgga^y>{tEnwC%0;vJ&^%eQ zLs35+`xjp>T0~C)V+`7M&om&79UK&;b900IT33E0MUkJrXS0raVghIU|f)S(;gM`zS zY?h?7d?P2}>0jm<5~wym9R zXD|w*sTZZAFurW{qiJgp_5y!$rR>B{(%ADSDstf`eT*o(9YsU5yC%Cc2$TM`Q=H9e zjYdfx93Ra~a#pWbO7gJQn9ps?vYl6JZ@+wU-u55nk58HARN&uF$*#c#JfrdB^1}Fb z7~n5i6frUb%m6d6?hKei)7oD5h4T8C0cPOW4AA)?Q3+jxnMQSV;6R^`6fY2xpiOrP zLTS)7m}$faiqNHqx>T4ehS25cmnP3Om}%7IAk@tG9y7BrHx!{}N553*AY6?+G6T%O zG6Q-2=urPZ`~LpFT*Obz05h;w42VLr)%0*lrnjyvj(V*`y+I|RyiDUq2^y*uV=lGg cBB~PfOEM5$gPBJ3pzw!)qJaly;7=KN2lK&AI{*Lx diff --git a/ws2011/Semantic Web/Uebungen/1. Bonus Aufgabe/.DS_Store b/ws2011/Semantic Web/Uebungen/1. Bonus Aufgabe/.DS_Store deleted file mode 100644 index a98b0ae95b396d72d3008421e9f527228399427a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12292 zcmeI1&ud&&6vxkZk~a4;t==w5lUmBFfg0>YMq7<7p-zXSGbXB!8sZOBh!W0)`@ZMhbI-i{ zKKJp?eRGKj*Szr{2#x zA@-|!r~5{w%gVK7 z=Xs;nU1X25=hL*s_W97en#A43i)Q!g>g3TvR9q`Wt5Z|OLUiQtt7~goDQ&)1yPthw z`qX^w%GK3tYi{HOeqLSK8T667`^XR#0zyCtY+(Z79jNkK_#Wlfgn$tEX9Vo~A>wMa z6m;O#y*l_{mygyzY}FRF?NZTd6tom{;FUdG;6qt`D8eTOd^op9pJUE%h~8my(D1Fzh|MHT`MgB*mwW)lece>CKO zw+`6sG063VfDrg^3HO= w#VeIYy40})8oC|+8VaKm5duO$2nYcoAOwVf5D)@FKnMr{As_^Vz!oR)8+F&axBvhE diff --git a/ws2011/Semantic Web/Uebungen/1. Bonus Aufgabe/Dokumentation in TeX/.DS_Store b/ws2011/Semantic Web/Uebungen/1. Bonus Aufgabe/Dokumentation in TeX/.DS_Store deleted file mode 100644 index 5008ddfcf53c02e82d7eee2e57c38e5672ef89f6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6148 zcmeH~Jr2S!425mzP>H1@V-^m;4Wg<&0T*E43hX&L&p$$qDprKhvt+--jT7}7np#A3 zem<@ulZcFPQ@L2!n>{z**++&mCkOWA81W14cNZlEfg7;MkzE(HCqgga^y>{tEnwC%0;vJ&^%eQ zLs35+`xjp>T0(m9zPJd`rQqp-maPPDb+3S}8<#}2cz_=WV-_<4LU ziGyOj4bd}LXjDfBbgBdZY=Bt_=vYf&jxgvMEHr`#gzHp5oytv#!F4*=g^BYF78-Rr z<7#D?$E^HSyl}NT*o6vb+|x)sF+dEI8K~=_gZKX>{4$kAemR9k!~iky#~9#^{-E!} zN140z+vnk3E1=y&L&3NL6%f!%j{q3pInq*2?H8y+oM*7mh_j$wr32DKKoLS6G4KNn Fd;(@&LbU(@ diff --git a/ws2011/Semantic Web/Uebungen/1. Bonus Aufgabe/SemanticWebApp/logic/.DS_Store b/ws2011/Semantic Web/Uebungen/1. Bonus Aufgabe/SemanticWebApp/logic/.DS_Store deleted file mode 100644 index ad226433da83f71206841f2ac3a03fde5014fdc2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6148 zcmeHK!AiqG5PefCv3E@4DVYRICOCaoB?Oxk1)WR ztuok)=&dv03^)S~1NwbPsEVm!9Wi`5*n}ehu}^al_VtHRV-myEu#U(Xio{T23>72J)G9sgnCU?QNKE36T(g?#q`xud`t~Od!ij;YFJ04h2lQ~fd+4! Ifgfey6Gb*)5C8xG diff --git a/ws2011/Semantic Web/Uebungen/2. Bonus Aufgabe/.DS_Store b/ws2011/Semantic Web/Uebungen/2. Bonus Aufgabe/.DS_Store deleted file mode 100644 index e476de074c45f97443f6c61c80e8db2f251e6814..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6148 zcmeH~u};H442FM0he{0X$at^78=R_kVCcjP&=v$pfp!3iFYKmS3HbM+ z&|PcOJ~cia9O4K-oiH56d7LGv#RJsZv`=M(W?4$jQfo&H%W}p`%d1WM)GUX^&b&|C z+1d%kVt2+%q{C{eMiCH!A%W9e&b|My=s%qQhecY6fC&660ybG*Ef;*H)>}s}=e@Sj tujwDg+(_pTt(Y3Em Should be unique if we don't consider peers behind a NAT. - private int id; + private static final int BUF_SIZE = 256; - private String name; + private DatagramChannel channel; + private ByteBuffer buf; - private List neighbours = new ArrayList(); + private String name = "Not initialized"; - public Node(int id, String name) { - this.id = id; - this.name = name; + private List neighbors = new ArrayList(); + + private Thread thread; + private UDPListen udpListen; + + public Node() { + try { + channel = DatagramChannel.open(); + channel.socket().bind(null); + buf = ByteBuffer.allocate(BUF_SIZE); + + this.name = channel.getLocalAddress().toString(); + + udpListen = new UDPListen(); + thread = new Thread(udpListen); + thread.start(); + + LOGGER.info("Initialized node " + name); + } catch (IOException e) { + e.printStackTrace(); + } } /** - * Add one single neighbour + * Create another peer, mutually link creator and spawn. * - * @param neighbour + * @return + * @throws IOException */ - public void addSingleNeighbour(Node neighbour) { + public Node spawn() throws IOException { + LOGGER.info("Name: " + getName() + ", Spawning new node."); - Iterator it = this.neighbours.iterator(); + // create a new node + Node newNode = new Node(); - if (!it.hasNext()) { // list of neighbours is empty - this.neighbours.add(neighbour); - } else { - // check if neighbour is already in list - while (it.hasNext()) { - if (it.next().getId() == neighbour.getId()) { - return; + buf.clear(); + buf.put(MessageType.INVITE); + buf.flip(); + + try { + channel.send(buf, newNode.getAddress()); + } catch (IOException e) { + e.printStackTrace(); + } + + neighbors.add(newNode.getAddress()); + + return newNode; + } + + public SocketAddress getAddress() { + try { + return channel.getLocalAddress(); + } catch (IOException e) { + LOGGER.severe("Address not set yet."); + } + return null; + } + + private byte[] addrToByte(SocketAddress addr) { + // TODO Wäre cool, die IP nicht einfach als String zu schicken. + // Was machen mit IPV4 vs IPV6? + String s = addr.toString(); + return s.getBytes(); + } + + /** + * Circularly link all neighbors, remove itself form all neighbors and exit. + */ + public void leave() { + LOGGER.info("Name: " + getName() + ", Leaving..."); + + for (int i = 0; i < neighbors.size(); i++) { + + if (neighbors.size() > 1) { + buf.clear(); + buf.put(MessageType.NEW_NEIGHBOR_IPV6); + if (i == 0) { + + buf.put(addrToByte(neighbors.get(1))); + buf.put(addrToByte(neighbors.get(neighbors.size() - 1))); + + } else if (i == neighbors.size() - 1) { + + buf.put(addrToByte(neighbors.get(0))); + buf.put(addrToByte(neighbors.get(i - 1))); + + } else { + + buf.put(addrToByte(neighbors.get(i - 1))); + buf.put(addrToByte(neighbors.get(i + 1))); + } + buf.flip(); + try { + channel.send(buf, neighbors.get(i)); + } catch (IOException e) { + e.printStackTrace(); } } - this.neighbours.add(neighbour); - } - printInfos(); - } - /** - * Add a list of new neighbours - * - * @param neighbours - */ - public void addMultiNeighbours(List neighbours) { - Iterator it = neighbours.iterator(); - while (it.hasNext()) { - addSingleNeighbour(it.next()); - } - } + buf.clear(); + buf.put(MessageType.LEAVE); + buf.flip(); - /** - * Checks if actual node has neighbour with given id -> remove it - * - * @param node - */ - public void removeNeighbour(Node node) { - for (int i = 0; i < this.neighbours.size(); i++) { - Node tmp = this.neighbours.get(i); - if (tmp.id == node.id) { - this.neighbours.remove(i); + try { + channel.send(buf, neighbors.get(i)); + } catch (IOException e) { + e.printStackTrace(); } } - printInfos(); - } - - public boolean hasNeighbours() { - return (this.neighbours.size() > 0); - } - - /** - * checks if actual node has neighbour with given id - * - * @param id - * @return - */ - public boolean hasNeighbour(int id) { - for (int i = 0; i < neighbours.size(); i++) { - Node tmp = neighbours.get(i); - if (tmp.id == id) { - return true; + try { + if (thread != null) { + udpListen.terminate(); + thread.join(); } + } catch (InterruptedException e) { + e.printStackTrace(); } - return false; } - public int getId() { - return this.id; - } - - public List getNeighbours() { - return this.neighbours; + public boolean hasNeighbors() { + return (this.neighbors.size() > 0); } public String getName() { return this.name; } - /** - * TODO: Wenn die richtig implementiert ist, ist die - * {@link #removeNeighbour(Node) removeNeighbour} ein Einzeiler. - */ - public boolean equals(Object o) { - return false; - } - public void printInfos() { StringBuilder result = new StringBuilder(128); result.append("Name: " + this.name + ", Neighbours: "); - for (int i = 0; i < this.neighbours.size(); i++) { - result.append(this.neighbours.get(i).name + ", "); - + for (int i = 0; i < this.neighbors.size(); i++) { + result.append(this.neighbors.get(i).toString() + ", "); } LOGGER.info(result.toString()); } -} + public class UDPListen implements Runnable { + private volatile boolean running = true; + + public void run() { + while (running) { + SocketAddress receivedFrom = null; + buf.clear(); + + try { + receivedFrom = channel.receive(buf); + } catch (IOException e) { + e.printStackTrace(); + } + + buf.flip(); + + byte messageType = buf.get(); + + switch (messageType) { + case MessageType.INVITE: + LOGGER.info(name + " received invite from " + + receivedFrom.toString()); + break; + + case MessageType.LEAVE: + + neighbors.remove(receivedFrom); + + break; + + case MessageType.NEW_NEIGHBOR_IPV4: + LOGGER.info(name + " received new IPV4 neighbor" + + receivedFrom.toString() + ": " + + new String(buf.array())); + + break; + case MessageType.NEW_NEIGHBOR_IPV6: + LOGGER.info(name + " received new IPV6 neighbor" + + receivedFrom.toString() + ": " + + new String(buf.array())); + break; + + default: + LOGGER.info(name + " received unknown command from " + + receivedFrom.toString() + ": " + + new String(buf.array())); + } + } + } + + public void terminate() { + running = false; + } + } +} \ No newline at end of file diff --git a/ws2012/P2P/uebungen/4/src/peer/Peer.java b/ws2012/P2P/uebungen/4/src/peer/Peer.java deleted file mode 100644 index 8549eace..00000000 --- a/ws2012/P2P/uebungen/4/src/peer/Peer.java +++ /dev/null @@ -1,52 +0,0 @@ -package peer; - -import java.util.List; -import java.util.Random; -import java.util.logging.Logger; - -public class Peer { - - private final static Logger LOGGER = Logger.getLogger(Node.class.getName()); - - private Node node; - - public Peer(String name) { - this.node = new Node(new Random().nextInt(), name); - } - - public Node getNode() { - return this.node; - } - - /** - * Create another peer, mutually link creator and spawn. - */ - public void spawn(String name) { - LOGGER.info("Name: " + node.getName() + ", Spawning " + name); - - // create a new node - Node spawnNode = new Node(new Random().nextInt(), name); - spawnNode.addSingleNeighbour(this.node); - - // link new node to actual node - this.node.addSingleNeighbour(spawnNode); - } - - /** - * Circularly link all neighbours, remove itself form all neighbours and - * exit. - */ - public void leave() { - LOGGER.info("Name: " + node.getName() + ", Leaving..."); - - List neighbours = this.node.getNeighbours(); - - for (int i = 0; i < neighbours.size(); i++) { - // add all neighbours - neighbours.get(i).addMultiNeighbours(neighbours); - // remove itself - neighbours.get(i).removeNeighbour(this.node); - } - } - -} diff --git a/ws2012/P2P/uebungen/4/src/peer/UDPListen.java b/ws2012/P2P/uebungen/4/src/peer/UDPListen.java deleted file mode 100644 index 026a1b7e..00000000 --- a/ws2012/P2P/uebungen/4/src/peer/UDPListen.java +++ /dev/null @@ -1,12 +0,0 @@ -package peer; - -public class UDPListen extends Thread { - - public UDPListen(int port) { - - } - - public void run() { - - } -} \ No newline at end of file