From 61415577c03169c8eab09ad7ebbd815c071d0bb0 Mon Sep 17 00:00:00 2001 From: Nischal D Date: Sun, 5 Oct 2025 18:49:07 +0530 Subject: [PATCH] FIX/Fix the BroadCast File Transfer --- .classpath | 10 - .project | 28 -- .settings/org.eclipse.core.resources.prefs | 2 - .settings/org.eclipse.jdt.core.prefs | 11 - bin/Main/Main.class | Bin 3339 -> 0 bytes bin/discovery/CentralRegistry.class | Bin 4626 -> 0 bytes bin/discovery/FileData.class | Bin 4266 -> 0 bytes bin/discovery/Handshake.class | Bin 4630 -> 0 bytes bin/discovery/Node.class | Bin 2019 -> 0 bytes .../messages/CentralRegistryRequest.class | Bin 1157 -> 0 bytes .../messages/CentralRegistryResponse.class | Bin 1234 -> 0 bytes bin/discovery/messages/FileRequest.class | Bin 522 -> 0 bytes bin/discovery/messages/FileResponse.class | Bin 683 -> 0 bytes bin/discovery/messages/TransferRequest.class | Bin 590 -> 0 bytes bin/discovery/messages/TransferResponse.class | Bin 680 -> 0 bytes bin/module-info.class | Bin 153 -> 0 bytes bin/p2p/ConnectionHandlerParallel.class | Bin 4678 -> 0 bytes bin/p2p/ConnectionHandlerSequential.class | Bin 4235 -> 0 bytes bin/p2p/FileTransfer.class | Bin 3998 -> 0 bytes bin/p2p/ObjectTransfer.class | Bin 1208 -> 0 bytes bin/utils/FileTransfer.class | Bin 4643 -> 0 bytes config.properties | 10 + src/Main/Main.java | 15 +- src/p2p/BroadCastTransfer.java | 304 ++++++++++++++---- src/p2p/ObjectTransfer.java | 38 ++- src/utils/Config.java | 35 ++ 26 files changed, 320 insertions(+), 133 deletions(-) delete mode 100644 .classpath delete mode 100644 .project delete mode 100644 .settings/org.eclipse.core.resources.prefs delete mode 100644 .settings/org.eclipse.jdt.core.prefs delete mode 100644 bin/Main/Main.class delete mode 100644 bin/discovery/CentralRegistry.class delete mode 100644 bin/discovery/FileData.class delete mode 100644 bin/discovery/Handshake.class delete mode 100644 bin/discovery/Node.class delete mode 100644 bin/discovery/messages/CentralRegistryRequest.class delete mode 100644 bin/discovery/messages/CentralRegistryResponse.class delete mode 100644 bin/discovery/messages/FileRequest.class delete mode 100644 bin/discovery/messages/FileResponse.class delete mode 100644 bin/discovery/messages/TransferRequest.class delete mode 100644 bin/discovery/messages/TransferResponse.class delete mode 100644 bin/module-info.class delete mode 100644 bin/p2p/ConnectionHandlerParallel.class delete mode 100644 bin/p2p/ConnectionHandlerSequential.class delete mode 100644 bin/p2p/FileTransfer.class delete mode 100644 bin/p2p/ObjectTransfer.class delete mode 100644 bin/utils/FileTransfer.class diff --git a/.classpath b/.classpath deleted file mode 100644 index 52f234a..0000000 --- a/.classpath +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - diff --git a/.project b/.project deleted file mode 100644 index 858ec5e..0000000 --- a/.project +++ /dev/null @@ -1,28 +0,0 @@ - - - p2pfilesharing - - - - - - org.eclipse.jdt.core.javabuilder - - - - - - org.eclipse.jdt.core.javanature - - - - 1759349142872 - - 30 - - org.eclipse.core.resources.regexFilterMatcher - node_modules|\.git|__CREATED_BY_JAVA_LANGUAGE_SERVER__ - - - - diff --git a/.settings/org.eclipse.core.resources.prefs b/.settings/org.eclipse.core.resources.prefs deleted file mode 100644 index 99f26c0..0000000 --- a/.settings/org.eclipse.core.resources.prefs +++ /dev/null @@ -1,2 +0,0 @@ -eclipse.preferences.version=1 -encoding/=UTF-8 diff --git a/.settings/org.eclipse.jdt.core.prefs b/.settings/org.eclipse.jdt.core.prefs deleted file mode 100644 index 6f94d6a..0000000 --- a/.settings/org.eclipse.jdt.core.prefs +++ /dev/null @@ -1,11 +0,0 @@ -eclipse.preferences.version=1 -org.eclipse.jdt.core.compiler.codegen.targetPlatform=23 -org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve -org.eclipse.jdt.core.compiler.compliance=23 -org.eclipse.jdt.core.compiler.debug.lineNumber=generate -org.eclipse.jdt.core.compiler.debug.localVariable=generate -org.eclipse.jdt.core.compiler.debug.sourceFile=generate -org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled -org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=warning -org.eclipse.jdt.core.compiler.release=enabled -org.eclipse.jdt.core.compiler.source=23 diff --git a/bin/Main/Main.class b/bin/Main/Main.class deleted file mode 100644 index 92ad32b187335d8de4610e153ac500a1f61abc9b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3339 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 diff --git a/bin/discovery/Node.class b/bin/discovery/Node.class deleted file mode 100644 index 0900bd90616c00bbb5ead696a0d865fa09fa17ab..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2019 zcma)+-A)rh6vzM5mbSFZ*Fsy1iiilMAXQXQ%ZJ*8&{(kv1TVZ=+6kLbM&|f#*ntj5Z)54}* z=P^VW2HzSdMxkL?dxclKZ+Xp&A<8f!cTKyn#U0aVnD30;24{#Kaqg7s40@#%w&gjd zwO3?_i(fa5!=_`^->ce=$H2;zVA-@xZQQyHkn=aFhJl9MHid$zhKo%*4m;VuX~b7&m!l5N!t@3raeljVAb<&o$Y0gTJwY`u~Xygrs$zw(R%ZueWwBw&8-`VHaCfp|+Xu%-#ctrXoeP26r$;=%{Y{&{8kb_b zVn0R6Xf(D=j~54`co@er!=f0C_iB1prrGq|`1!1~zRJ~>E$(iGePGbamc^Y?!*E^h z#<0e4yQ?rkQe$|=F!pa(8b?(Z+@y&K)6;_pLSlrdNkU?P;I>9fSGVGYseF&XCIAIYTC&iku<)RmNTwK8Vu0kIv|)+ynF;#4v`Cg^p|V z%LA1O*D*$4!e5XuX$h8)v;<99T7oAcX>^}vgM5U)E@|`|0%9on;{t_FF`#oJNYOur zG@YN3r)w(GKb=ucCj6`gT1D2L{5K4LAtMAKCn`5b+k$(V!M8B!2d|R10FTPzw2G0C zyJIBzhRl#wUQO{)Up!rSAV{hcWFin`Di|cy2{J_>)0cpV+KUQI2ZCfeLGpnhxnPh? zC&)a36fOY~S1&+jkf*n3zxJ!ie(t!Mg+P#5%=y8stGRliL)6tQ63EgeAfodG$em_I zsSS|u9)(N*w*fd6vF))Fwz=&C_r$A)}bR^X-Zy<$q5_1BEAKhE}O1-KT42;7_ z;W`#|+_>UFtrvu{ZQv%Bi0XAiftkK&n(>y3L+X}xyOPE&tm;@1$X$39D;v0tH37Y& zI$AD4%-GfYMpx8LCaaDsce?F8>A&lHoUM8dyH&U8J3SvH6XBr~2$W)G{Aai{Ry)|I zy11zW1C!W{xzdqpXjcRdW>c)|xXY>iJ?%8MkWt}*frlsyj0ZAQBYSNJhe=3 zF;4RI1sXFz(K^SJRXRn^+Bn6Gm7P7s{5LFECzv_Ia(|cO?kj)Ru+F&1=L13|2$aGU zAv2gpmiZh^?o3vf`rs(S;)ygUQIv>wN|qLh*%*lVz_Z3$;X({`+_|D-$e!mVfjrsg z$UaXE1;*`&RJ;n^RT`S{lW diff --git a/bin/discovery/messages/CentralRegistryResponse.class b/bin/discovery/messages/CentralRegistryResponse.class deleted file mode 100644 index 3647f13a48b675ab22565ac720ebf1b0818a680a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1234 zcma))UsKaS6vfZBp^+N?7Azot3ewVsLKNOac@W2^4m#A~#ivjf43j2IlEUD-U&VJF z(HUp-1NfmF&nBe}3ZtEA_U_)@dw+Y*{`~dr2Y?-H>c|L~hfdh?&t!06wPhIE$1=2b zq!$IYyC;vGFbXdAWO(X(q12%XjGowMw&mL1vGwxcM7AOwIf03I)$y&S3>@2a-q{DP z6v&007K;iL8vSF>eBYI}wBrutvQl(dc<3-IVkal}3k0mVYctDY^L`q<5( z(vB?u1M!!x@Qn-QQ#{g5jw(NdVSYzA`@p%zaohZgQFHAQ1ylQu$x9T?&nRZ=O>^}U z)1Ppk)9Ei*Orm0TqZbz#ePo3UR`{*38(3MxIHLl_Fo7vdVh%;-r?81>JjD#E++`-6 zQDdZj+gK&Bh@(2zSW&I5lR9Cxy3Fr6&oXDl%>Rwshn(kw1>dWNc@|$FW{GHve1l7D zw;aQjk`_HUs|RNxfm1R*>>{0ak;*YrUCDR5Zhep$UCprlBUZ>@<2MwF3G@H} diff --git a/bin/discovery/messages/FileRequest.class b/bin/discovery/messages/FileRequest.class deleted file mode 100644 index 8c9e1b48b4a74bd968357748b1ae908884a3356f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 522 zcmZuu+fKqj5IxgYxs{8E_e=0eKx02Z;|s$} zVkR6<_#@|LFqST(tAtvDs=(>VPzg`Hh=C^wSD=pv9w#xdZr%> zN36l*y#j+Ri{g(UEh+KDvTcrw9Nlw<$-dlrL#cH#$6D)jj`dfD3~aEi!eU!st7j^r e#A}n0`htcnY;(i~u)}RAIqh;I-FS~91N+~&x^!m% diff --git a/bin/discovery/messages/FileResponse.class b/bin/discovery/messages/FileResponse.class deleted file mode 100644 index 67275d8e10c35ddb255ad0cf3e41c30b8cebc16f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 683 zcmZvZO;6iE5Qg8e-6W(Y-_QnVLkfq)E%k*PRS!+Y0Yy|ws@ylpk}h&=u$@Td#9!(m zLh7MEpg#&RyP+WxJ$UD1-<^3p^Y{Mu9{?R3W?>N;W0j1exr~4MQ<)@UA`|~q1+piT zt0+ul77n3wDdxftL^$!k4KL*=%_2jnnXHQZzKoR!)QuPhl2GW$>zPba6;95hF(*ph zrye?UVl=w^c%^YJxF?rflWK~uA{8vp#g8QlUye6V6&|6-={d z@$>gMmSt>fEl2JYEutT@}jn z*>ou5@5|9ty3t4k1Ht3sQ9UM|^oL3a%{7YuZi0W)<~b1Pf{^b=vv?#mE}^W=zlD9& z|A!`X*!;bK!zaV?%1NUd%Xr2zu(7-l6#2fy(Jd@~1?+ftD0}Z0sCge2*!GSVcD7 Ijw1^P4}KMv;s5{u diff --git a/bin/discovery/messages/TransferRequest.class b/bin/discovery/messages/TransferRequest.class deleted file mode 100644 index 222d55d0ca1851582fab9d64061444874caae3f5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 590 zcmZ`$+fKqz5S&x02v$VE`xW8?RAWCtGoA5ECE#06)q& ztwxE74?Vj(+1Z`hzJI*F0XRb?4MU*P(_z;itKiWYsxXuT6*{dzdSPD$H|k-e!YB<> zAb%&v(s89XaIQLcs!McMpp>B6cbY2D($!D0<0^sNH&c6qOTR}T-}qefwI4(R z;zGcv_c&^*rLJ9dE+fgd*%R&Q=v1IuooYyCOw~Vxi&~qb&$uFs6qYP3pdgT{*4i0x zhlP1qakgS1jk!2mvyeenV6mY+bvYV#RM7fzQE2#G>9!@E(bYF-Mz=Z?*q>Vd-`!&M zP384eK#P4^H18A3*`_}Vx+>O8Nq>%g6kil&3QO^uNnR@D9}}_8B+^3?1>NO{FS2rB zz+^1hFUZ@66BO-(36|~c309wp8(8PN!igZ;Br`*9j@%;h*dS_u@v(_5R-A-w?iES4 RLynPTyVMXX+hb**{0TYYfFS?? diff --git a/bin/discovery/messages/TransferResponse.class b/bin/discovery/messages/TransferResponse.class deleted file mode 100644 index 81667862c6324b83f52037ddfe02e98138e272b2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 680 zcmZ`$%Sr<=6g`=at=6%v)>nPM3Uw4`Be+mpC|ggj~m$Mq}GNHRz>jM}VJ!I_9959I@|hk_w@DsJ0CCo*assU{@~)t^2l zvu$e(ee=7$-@~yF-suRfC5$ zPDYRkpGh~ll$xRZOVz(V(_Gp3+c+D1IYe@AtUK8=)s7qDKpLCJdVgxec!fn0oTAkS zmv)+f{+k*7_N3YDNmJO9egb*AFHrOdhh70w{xgRC*$zhiwGPJp^$sTelH0-56WuzP zF*Qij?op2+;?7x?BC(V(j9I$b>@r~v^Awr-1yaB)S|sFHv_xuB78yN8?=nRWRz3jT C@|H6I diff --git a/bin/module-info.class b/bin/module-info.class deleted file mode 100644 index 79cac06890f91d786a2f9e44834271b31f383703..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 153 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 R?*E0ib>93d{*Hgb{6EKzjI{s& diff --git a/bin/p2p/ConnectionHandlerSequential.class b/bin/p2p/ConnectionHandlerSequential.class deleted file mode 100644 index 0a302141543e8e5193f2fd7e056d57949b6f55a4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4235 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 diff --git a/bin/p2p/FileTransfer.class b/bin/p2p/FileTransfer.class deleted file mode 100644 index fe896c95cb5e039d309ab3a2cf93eec9544240ee..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3998 zcma)9`&%4W8Ga8eJG;w}1Og-zH6<-1+&9LUwo4mZZVgI+1VT&GREOOYSXg#8GXs=* zsm7XU)p)D6sh75iky>LlH39}rI(f(vgj@f3~IWKJu0q)M23uZKBrl+FAlQS~z3IrcZrjzb*f%4{- zae+XOm5>pXBdntWL4lov$+R4rpPQ8Sm^qn}0yTqH+)Ry|c2cdgn*nz^>8P`wb$n3s+l!7l7pF4qdwl`x|j<;A&9Obw|pt)Pw8#b(T)y*DqF^7azW-) z{hl#Ake3yA5XDF@?^EGIR(AIq2{d*6s>bnb}3^6_?(8% zZmP4ItFo)E?M(rMx7sC(u$6d{4PsCnsW?r7^gIlXhl`(mxqqi7!}YKRA9sB z1#%oHs^qR>1hZ9D!-jB1$2guA*fVF&${s5nH{GX`?lgZnu95K(${x-Gy)TG4U;)l zUKo8Z#AU`!T4@~#ukm=QMqM*L%W{a5UJN{MdSEy&uVGrCp+JhBl<7D_mfLU5rxST8 zfzbIZ=Tw_2h-V{aZ`jgV2t*OiURxr9w!9$FR&=m^S$K_!{V(Wvy@t&5%@&oNqQvCP zW{0xn=h-4W?H|dOUxG9iP*Jj36+M-wC_6#Ma@jwVX3D3wplFtkn?azaDlhjZ&5YOL zHS|RAWxS-}D}19yE*9G<$HuKq2PUd_0 zMSMeb%}ZNqFCWNOt*X0!Q{aJZ_4?@v<1${+F^>h+j=rPgyQ;^lwyiV|nR6uB_XHj+ zp(fXn^DbV&50r~P6lnfP?SZYn24y%C#ufZn$4~GYvGQ*U!F%E=eyZUOhM+D17H685 zGiyO*Hzn;+b;)_K>G&CbPM@&EciP8B?#%3>;34y)E7gt`GR}2GCEmc6UGRxgXi)C1ZOettd zs{`AM#D%(#p%gP`wD&VoW?=R znw`%S-_qHhQv}+k2gjB&vV{2ABKd5SDDKl)6+LDuHJWr~*UljR5W*c6cyIRoOC}o5 z^Hyu{Pz&MD0!F{d#3UMW5_}i)MMMa9Nrld6?mBd$f;a2{iD`QcRyrE~%9pwOGF2*e z4S#3V|9?^TNk36Iz{{hYR~I;vxd?L9xQcQXoGV&a5xT`6Wr%Q8$KbC@j=C?vxr(bW zc3>xW_;A@i1U!j%*0F1X3TjTSqi&*Y1$+4aiB%jJ>S$j>W5*g=V*w*@51p}!bsU~p z#gSOh2)3@^Q%1#Y99u!`D$b~%PfWxjcaMe3kA;>IGa_}NBQed;jNlr2ucH2aoG`RC z4Bf#Pu!3inak#K`&f9u9BurfPOF&!%2 zA?)V3gS*u*P=ozkH=-78Ecc_RM+|$=$Jf$xJe|TmEb>+MMM}NGy;qss*YFVaHsLxB zVHqu6R-U6a;2k6}!&&{BMT(hI9?T(4UkqG=g$#XY#20Y^HuKpA7Y_d`Xm?h%Rbp`t z9kiHY&aYGA1uXH27pd_L1UFbPl^TXM?A5SKL!E|l4V@Z$u@D-yVuP-gmf$manVM~6 z3R=R@O533Ye%$2GK(l6mQS#L<%aa3)MyJ2;t>H_g$i<1a_Eo$*Bw_)f2vIjdChXzA zqKqO23Dc-BZ&l#m!{u1W2;IiFR`BgucpXliI5Ro!7lX=j|S;}uR z-%Z3|k)GEQiA$UpIjVUF*Eh(bMUHCr*HhVbj#b_KfC4`k0>p0z-Y$yGkBbDZ^vn?n|hxhzTIR|4{oB@V^YQ&-{W42`j|&@X@R*7;9dNhdu7!A z7CH4UdC`RDJx&E_rO)G(Mq9_psox+(okyv4hUlEaLHw4Q)O%w+e#gB^>eoDW1w3}m zLffD_x<{?U-gr^NHSf=-*<}y(D;yQg*b_>MDneZQ4=TGkRaI@!+d#3L#}_*Odj?j9 fTX>&yE!S&Q_$O~%_r|~A1D>eQihKAQ{sH5ED=!Ae diff --git a/bin/p2p/ObjectTransfer.class b/bin/p2p/ObjectTransfer.class deleted file mode 100644 index 84ba96ae3d22c555e8d4feb11f231bbe32e4e446..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1208 zcmZWoYflqF6g?N(t}M%=FWzbq!L}f)__hcpjU*%$K0rwP=28Y&EW6D<(4VDWXd;O} zz#nD2v%77lkWFTG=H7G8y>n*%{`>t0Kph`73=wkejkdXed?A{_p=UY%sqi$U2$L7q zm1VXp=PZd5GMlzz2U~>Ua^;ASs=Fsb$1p|=q>&*^G;Bxgg_p;|JG72lg2@|h(`p@A zo-NnOW-2(heL|seSGh*eec_zM^$=Fdji?Mq1m=O;{3e20yrI-pleOrdel$fpuwBR3 zkR#+HnC+Uo`@M*U0%5Kjh$Z&JpdAJWfhVj>9aEUmFwKqJ5;ZW3Io>`KfeIkZlq+#P ztfWS2I`UYM$8w)An>2Adr*b5-9vUcNkudt*vjfp>yqI7H`;_@h1|G}9PM@|y|C~+n zqjMo-?;I5e-N;yJMAVW>M=)Had%{A$l?XM^5Mj&{O<`a4N?g9{O>!8jiiUMUsV`n{ zS-!vL20L!(oG8{j<8vCcX4e^TX2ZY>yd;dX2}+1Ct$3gW*a8!;r3G)KPrcsM6zPD8 zcLv@=-aNhpy_;9)vZ~FnOLo61!hDZ4_D$txz5_S(nqtS6FCiaibf4I|>=ldPx5RG| zJhG$6@Tl?1y2O) zYl&`#=PaH^%DaplVnp@^rc{33!K(%fzx~OZaWi_9u*hUfk=RrWNW`RXoA|(Dgslj( F{U0$q9vuJx diff --git a/bin/utils/FileTransfer.class b/bin/utils/FileTransfer.class deleted file mode 100644 index a1ce32e6dc72be026b35ec1d969016e5dbe779e8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4643 zcmaJ_`FB)T9sk^9CU55Dg)ET33lye>mINlmwm|5l1tA4VOadhkjL^!<%u6ybnK#b7 z2@UQGh)Y$pYDJ2*ig9ZdtO+KSxQ2>r-CFnM9Q_wOhaZfed*6h-Eakwt_r80-_q%>R z-??z(f8*BxwBTPFiUg|iZZef?+>=b%2eVc>*Jo!n1OzIMTSHc3%1ZY)?(02n$6bMv z2b1ZfyIr8TuD)9!(BdR)9mNP62%VbYp}VB zsaj>=4y+bfK4_h=Tby*k8&n^eXOV4IAj1u*J@2?@`X5bM6pRj z1B*19HFeKGBVH%4q~CUZ^3*hAf?oR$nswCUKAGS91y&S1o+l#fvxTQKzQ|JU%ey{j zHls}n-obv%MD4F{MKl|jY94$B=da1e)RVK7Ow z1nb(`>f59fhYh?5Jw&^7;+C4$Dl)T0+Bs_AQAy8WJmus_*m@k*aSXj0tQlk~69)&f z&PmBr194DMnUzR%gM+zqS%P1k~X`C z;+8Q_O%jnJbv84+X z9oZ!i?j3gR+yR9XL5bO(=c^5sl&So7SQ*u_HJqW|oSjZcdjfTSP8Cwr>iOg^od=AM zNuqyTcJhT11iOY$_&S9Q-yf?)){_Q4g-9~j{IXr9Ni<15&DLdWo4#=%b2EHtjt0seF#M&*R&& z5xgK>JbyfLxxRcVHM~iRvkRP))Cr-5754ystNAJz?Pt?r zbh!eUD!}j_BRc}C;CUHwor07)`!j*k#cnfWf}4@Lf}{21 zVk@s@TT&K(mU0^YCUEzHGA~v*4gU~WeS1-&-K#S0v&Sm@xV+qQ+!^_2|IW7Uj711F&Cs5H-JBF%Q;0mg1$FUL^ z#TpR{idcym7{%Q&Z36W@rZ$R=W4JdKn!x5BuC~U)ydbx?UB!dr*ro27p;7E^(s@#& zkE2!XRaW4|P|O&ibl5bCtII~wUZYo+owl3w8a@2vMXWMIJTQ%Gr)%`9*nf5u-91~& zik_K%nTj@!6bvarc}ttZaT$U=g5KNSqF_h~^44tyc^tfgJ~KFq+N zk{YY1eHjj5IeM@HeFVcG)*!>vQ>epxxqcQKX+J6s^A+EZO(Ml-`_s5rJcs+lWj^yH z@=j4N(S?(ET-m*XVeYZ1iXprWZ|7TTy)f_&ypuTGf|u|vyj#U}7Vn{rFl`^g`|y7H zIf$J&jWg7jp>H3czB2y01-un~sK!}*5J7sdOs$IWAzHkImD9XXCNw;x;h6ecF|&wj zsMoMLpy9*h%1ueM+)XurA>?Xpqt6geqn*0mSQ6cXfuaOsSLf^?L z9G+$hilmS_TgE^?f+svm7ELfH7Ex>yogx;PK(uGW$}xO27M#Gj9toyTj^Q)0k_nve ziH_kyOd~NijN@sAj0s$nyU)ZFu)olxh)FJdsU|#*5f6eTH6+g0JSvuwKW2$pT3l_6 z;(1AnZj-b533|vB(qvRTeLQ04if>U@@212SGdd&+I3Mrw6$=8x;nCv7o$Pv=(yDB!W zNsJ%?`UKw-z-q?)0_O_6ihpwsim(WChFB}s-XcI70R=QsY8!7nz}wA)?{@y#f!+M~ z+hP9S#ADb48*TjO#C|^eA0eRI2*-o8b4aX1x40jNMHAsV3;JysC)A~_Z3_N`7*`YA zE25?U;zfc!NPAcDJzQhEt|JX5@qH3uJNDrR_#ug~8+#S}!?aze;9p7)$`$AhQpE69 z^kAt1eX#=lFqTeJ%pkt}K#XcQr{TPYi?bj7~EiEO~XIB!%rKJ+Z z#f8fX$V=H#e#D52@MHXh^ELweXB7Im8h@$AU#syqYW$rV|DeWK)%d5v{$F@o=gq(3 J@AxOo{{yN|e}4b~ diff --git a/config.properties b/config.properties index 2ee1808..e5a37f1 100644 --- a/config.properties +++ b/config.properties @@ -1,2 +1,12 @@ test.dir=./src/test downloads.dir=./src/downloads + +#Defaults +beacon.port=12344 +broadcast.group=255.255.255.255 +broadcast.port=12345 +broadcast.chunk_bytes=1024 +broadcast.max_rounds=3 +broadcast.nack_port=50011 +broadcast.nack_delay_ms=200 +broadcast.wait_nacks_ms=250 diff --git a/src/Main/Main.java b/src/Main/Main.java index 0c5e865..6b120f5 100644 --- a/src/Main/Main.java +++ b/src/Main/Main.java @@ -113,7 +113,7 @@ public static void main(String[] args) throws IOException { Scanner scanner = new Scanner(System.in); - System.out.print("Enter command (upload or download ): "); + System.out.print("Enter command (upload | download | broadcastfile | broadcastrecieve ): "); while (true) { @@ -149,14 +149,11 @@ public static void main(String[] args) throws IOException { break; case "broadcastfile": - FileData f = new FileData(argument); - - System.out.println("The File Hash of the File to be broadcasted is " + f.getFileHash()); - System.out.println("Type broadcast to enter broadcasting period"); - - userInput = scanner.nextLine().trim(); - BroadCastTransfer.BroadcastFile(f , Handshake.getClient() , argument); - break; + + FileData f = new FileData(argument); + System.out.println("The File Hash of the File to be broadcasted is " + f.getFileHash()); + BroadCastTransfer.BroadcastFile(f , Handshake.getClient() , argument); + break; case "broadcastrecieve": BroadCastTransfer.RecieveFile(argument); diff --git a/src/p2p/BroadCastTransfer.java b/src/p2p/BroadCastTransfer.java index 16a9ebe..a104860 100644 --- a/src/p2p/BroadCastTransfer.java +++ b/src/p2p/BroadCastTransfer.java @@ -11,6 +11,16 @@ import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; +import java.nio.ByteBuffer; +import java.util.ArrayList; +import java.util.List; +import java.util.HashMap; +import java.util.Map; +import java.util.Set; +import java.util.TreeSet; +import java.util.Random; +import java.nio.charset.StandardCharsets; + import discovery.FileData; import discovery.Node; @@ -20,11 +30,49 @@ public class BroadCastTransfer { - public static int broadcastListeningPort = 12345; - private static int BUFFER_SIZE = 1024; - public static int broadCastCountDefault = 1; //anybody that misses the beacon would miss the file transfer + public static int broadcastListeningPort = Config.getBroadcastPort(); + private static int BUFFER_SIZE = 1024; + public static int broadCastCountDefault = 3; //anybody that misses the beacon would miss the file transfer public static int congestionControlSleepTime = 30; public static int congestionControlSleepPacketCount = 400; + + static final byte FLAG_DATA = 0x01; + static final byte FLAG_EOB = 0x02; // End Of Broadcast (marker after first pass) + + // Make a packet with header and data + static ByteBuffer makePkt(int sessionId, int seq, int total, byte flag, byte[] data) + { + int body = (data == null ? 0 : data.length); + ByteBuffer bb = ByteBuffer.allocate(1 + 4 + 4 + 4 + body); + bb.put(flag); // 1 + bb.putInt(sessionId); // 4 + bb.putInt(seq); // 4 + bb.putInt(total); // 4 + if (body > 0) bb.put(data); + bb.flip(); + return bb; + } + + // Parse a received packet + static class Parsed + { + byte flag; int sid; int seq; int total; byte[] data; + } + static Parsed parsePkt(byte[] buf, int len) + { + ByteBuffer bb = ByteBuffer.wrap(buf, 0, len); + Parsed p = new Parsed(); + p.flag = bb.get(); + p.sid = bb.getInt(); + p.seq = bb.getInt(); + p.total = bb.getInt(); + int remain = bb.remaining(); + p.data = new byte[remain]; + bb.get(p.data); + return p; + } + + public static void BroadcastFile(FileData f, Node client , String filePath) { try { @@ -42,62 +90,155 @@ public static void BroadcastFile(FileData f, Node client , String filePath) { socket.setBroadcast(true); // Enable broadcasting // Define the broadcast address - InetAddress broadcastAddress = InetAddress.getByName("255.255.255.255"); + InetAddress broadcastAddress = InetAddress.getByName(Config.getBroadcastGroup()); + + //NACK Listener + int nackPort = Config.getBroadcastNackPort(); + int waitNacksMs = Config.getBroadcastWaitNacksMs(); + int maxRounds = Config.getBroadcastMaxRounds(); + + DatagramSocket nackSocket = new DatagramSocket(nackPort); + nackSocket.setSoTimeout(waitNacksMs); // Open the file to read File file = new File(filePath); FileInputStream fileInputStream = new FileInputStream(file); - byte[] buffer = new byte[BUFFER_SIZE]; + + byte[] buf = new byte[BUFFER_SIZE]; + List slices = new ArrayList<>(); int bytesRead; + while ((bytesRead = fileInputStream.read(buf)) != -1) { + byte[] chunk = new byte[bytesRead]; + System.arraycopy(buf, 0, chunk, 0, bytesRead); + slices.add(chunk); + } + fileInputStream.close(); + + int totalPackets = slices.size(); // Total number of packets to send + int sessionId = (int)(System.nanoTime() & 0x7fffffff); // Random session ID // Send the file in chunks - int sequenceNumber = 0; + //int sequenceNumber = 0; long totalSize = f.getFileSize(); long sentSize = 0; - while ((bytesRead = fileInputStream.read(buffer)) != -1) { + + for (int sequenceNumber =0; sequenceNumber < totalPackets; sequenceNumber++) + { + byte[] chunk = slices.get(sequenceNumber); // Create a packet with the chunk and sequence number ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); DataOutputStream dataOutputStream = new DataOutputStream(byteArrayOutputStream); dataOutputStream.writeInt(sequenceNumber); // Add sequence number - dataOutputStream.write(buffer, 0, bytesRead); // Add the chunk + dataOutputStream.write(chunk); // Add the chunk byte[] packetData = byteArrayOutputStream.toByteArray(); + ByteBuffer pkt = makePkt(sessionId, sequenceNumber, totalPackets, FLAG_DATA, packetData); // Create packet with header + // Send the packet - DatagramPacket packet = new DatagramPacket(packetData, packetData.length, broadcastAddress, BroadCastTransfer.broadcastListeningPort); + DatagramPacket packet = new DatagramPacket(pkt.array(), pkt.remaining(), broadcastAddress, BroadCastTransfer.broadcastListeningPort); socket.send(packet); - sentSize += bytesRead; - sequenceNumber++; + sentSize += chunk.length; UserExperience.printProgressBar(sentSize, totalSize); - if(sequenceNumber%BroadCastTransfer.congestionControlSleepPacketCount == 0) { + if(sequenceNumber%BroadCastTransfer.congestionControlSleepPacketCount == 0 && sequenceNumber != 0) { // Congestion control Thread.sleep(BroadCastTransfer.congestionControlSleepTime); } } // Send an end-of-file packet - ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); - DataOutputStream dataOutputStream = new DataOutputStream(byteArrayOutputStream); - dataOutputStream.writeInt(-1); // Special sequence number to indicate EOF - byte[] eofPacketData = byteArrayOutputStream.toByteArray(); - DatagramPacket eofPacket = new DatagramPacket(eofPacketData, eofPacketData.length, broadcastAddress, BroadCastTransfer.broadcastListeningPort); - socket.send(eofPacket); + { + ByteBuffer eob = makePkt(sessionId, -1, totalPackets, FLAG_EOB, null); // EOB packet + DatagramPacket eofPacket = new DatagramPacket(eob.array(), eob.remaining(), broadcastAddress, BroadCastTransfer.broadcastListeningPort); + socket.send(eofPacket);// Send EOB packet + } + + System.out.println("File broadcast complete (pass 1). Listening for NACKs..."); + + // Listen for NACKs and resend missing packets + + for (int round = 0; round < maxRounds; round++) + { + long deadline = System.currentTimeMillis() + waitNacksMs; + Set toRetransmit = new TreeSet<>(); + while (System.currentTimeMillis() < deadline) + { + try + { + byte[] nbuf = new byte[2048]; + DatagramPacket ndp = new DatagramPacket(nbuf, nbuf.length); + nackSocket.receive(ndp); + + String msg = new String(ndp.getData(), 0, ndp.getLength(), StandardCharsets.UTF_8); + // Expected: "NACK;;" + if (!msg.startsWith("NACK;")) continue; + String[] parts = msg.split(";", 3); + if (parts.length < 2) continue; + int sid = Integer.parseInt(parts[1].trim()); + if (sid != sessionId) continue; + + if (parts.length == 3 && !parts[2].isEmpty()) { + String[] seqs = parts[2].split(","); + for (String s : seqs) { + s = s.trim(); + if (!s.isEmpty()) toRetransmit.add(Integer.parseInt(s)); + } + } + } catch (IOException e) { + // timeout or transient; break the inner wait loop + break; + } + } + + if (toRetransmit.isEmpty()) { + System.out.println("No NACKs in round " + (round + 1) + ". Done."); + break; + } + + System.out.println("Round " + (round + 1) + " retransmitting: " + toRetransmit); + + // Re-broadcast missing chunks + for (int seq : toRetransmit) { + if (seq < 0 || seq >= totalPackets) continue; + byte[] chunk = slices.get(seq); - System.out.println("File broadcast complete."); + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + DataOutputStream dos = new DataOutputStream(baos); + dos.writeInt(seq); + dos.write(chunk); + byte[] legacyPayload = baos.toByteArray(); + + ByteBuffer pkt = makePkt(sessionId, seq, totalPackets, FLAG_DATA, legacyPayload); + DatagramPacket dp = new DatagramPacket(pkt.array(), pkt.remaining(), broadcastAddress, BroadCastTransfer.broadcastListeningPort); + socket.send(dp); + } + + // Re-send EOB to trigger final hole checks at receivers + ByteBuffer eob = makePkt(sessionId, -1, totalPackets, FLAG_EOB, null); + socket.send(new DatagramPacket(eob.array(), eob.remaining(), broadcastAddress, BroadCastTransfer.broadcastListeningPort)); + } + + System.out.println("Broadcast (with repairs) complete."); // Clean up - fileInputStream.close(); socket.close(); - } catch (IOException | InterruptedException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - - } + nackSocket.close(); + + } catch (IOException | InterruptedException e) { + e.printStackTrace(); + } + } + + public static void RecieveFile(String fileHash) { BroadcastBeacon beacon = (BroadcastBeacon)ObjectTransfer.recieveObjectBroadcast(); - + if (beacon == null) // + { + System.err.println("Failed to receive beacon (null). Is the sender running and on the same LAN?"); + return; + } + long totalSize = beacon.file.getFileSize(); if(beacon.file.getFileHash().equals(fileHash)) { @@ -107,43 +248,86 @@ public static void RecieveFile(String fileHash) { // Open the file to write String outputFilePath = new java.io.File(Config.getDownloadsDir(), beacon.file.getFileName()).getPath(); - FileOutputStream fileOutputStream = new FileOutputStream(outputFilePath); - byte[] buffer = new byte[BUFFER_SIZE]; + //FileOutputStream fileOutputStream = new FileOutputStream(outputFilePath); + byte[] bigBuf = new byte[65535]; // Max UDP packet size long recvSize = 0; + + // Buffer chunks by sequence number (so out-of-order doesn’t corrupt the file) + Map bufferBySeq = new HashMap<>(); + int expectedTotal = -1; + int sessionId = -1; + + // For NACKs + int nackPort = Config.getBroadcastNackPort(); + int nackDelayMs = Config.getBroadcastNackDelayMs(); + Random jitter = new Random(); // Receive packets and write to file while (true) { - DatagramPacket packet = new DatagramPacket(buffer, buffer.length); + DatagramPacket packet = new DatagramPacket(bigBuf, bigBuf.length); socket.receive(packet); + // Parse reliability header + Parsed p = parsePkt(packet.getData(), packet.getLength()); + if (sessionId == -1) sessionId = p.sid; + // Extract sequence number and data - ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(packet.getData()); - DataInputStream dataInputStream = new DataInputStream(byteArrayInputStream); - int sequenceNumber = dataInputStream.readInt(); - - if (sequenceNumber == -1) { - // End-of-file packet received - System.out.println("End of file received."); - break; - } - - // Write the chunk to the file - int bytesRead = packet.getLength() - 4; // Subtract 4 bytes for the sequence number - byte[] chunk = new byte[bytesRead]; - dataInputStream.readFully(chunk); - fileOutputStream.write(chunk); - recvSize += bytesRead; - - UserExperience.printProgressBar(recvSize, totalSize); - - } - - // Clean up - fileOutputStream.close(); - socket.close(); - } catch (Exception e) { - e.printStackTrace(); - } - - } - } + if (p.flag == FLAG_DATA) { + ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(p.data); // FIXED: p.data + DataInputStream dataInputStream = new DataInputStream(byteArrayInputStream); + int sequenceNumber = dataInputStream.readInt(); + int payloadLen = p.data.length - 4; + byte[] chunk = new byte[payloadLen]; + dataInputStream.readFully(chunk); + + if (!bufferBySeq.containsKey(sequenceNumber)) { + bufferBySeq.put(sequenceNumber, chunk); + recvSize += chunk.length; + UserExperience.printProgressBar(recvSize, totalSize); + } + + if (expectedTotal < 0) expectedTotal = p.total; + + } else if (p.flag == FLAG_EOB) { + if (expectedTotal < 0) expectedTotal = p.total; + + List missing = new ArrayList<>(); + for (int i = 0; i < expectedTotal; i++) { + if (!bufferBySeq.containsKey(i)) missing.add(i); + } + + if (missing.isEmpty()) { + try (FileOutputStream fos = new FileOutputStream(outputFilePath)) { + for (int i = 0; i < expectedTotal; i++) { + fos.write(bufferBySeq.get(i)); + } + } + System.out.println("End of file received (complete)."); + socket.close(); + return; + } else { + int delay = jitter.nextInt(Math.max(1, nackDelayMs)); + try { Thread.sleep(delay); } catch (InterruptedException ignored) {} + + missing.removeIf(bufferBySeq::containsKey); + + if (!missing.isEmpty()) { + String body = String.join(",", missing.stream().map(String::valueOf).toArray(String[]::new)); + String msg = "NACK;" + sessionId + ";" + body; + byte[] m = msg.getBytes(StandardCharsets.UTF_8); + DatagramPacket ndp = new DatagramPacket(m, m.length, InetAddress.getByName(Config.getBroadcastGroup()), nackPort); + DatagramSocket ns = new DatagramSocket(); + ns.setBroadcast(true); + ns.send(ndp); + ns.close(); + } + } + } + } + + } catch (Exception e) { + e.printStackTrace(); + } + } + } + } diff --git a/src/p2p/ObjectTransfer.java b/src/p2p/ObjectTransfer.java index 7269ef4..c2f57ff 100644 --- a/src/p2p/ObjectTransfer.java +++ b/src/p2p/ObjectTransfer.java @@ -6,8 +6,16 @@ import java.net.InetAddress; import java.net.Socket; +import utils.Config; + public class ObjectTransfer { - public static int broadCastListeningPort = 12345; + + public static int broadCastListeningPort = Config.getBeaconPort(); + private static final String BROADCAST_GROUP = Config.getBroadcastGroup(); + + private static final int MAX_UDP_PAYLOAD = 65507; + private static final int RECV_BUFFER = 65535; + public static void sendObject(Socket socket, Object object) throws IOException { // Create an ObjectOutputStream to send the object ObjectOutputStream outputStream = new ObjectOutputStream(socket.getOutputStream()); @@ -26,7 +34,7 @@ public static Object receiveObject(Socket socket) throws IOException, ClassNotFo } public static void sendObjectBroadcast(Object obj) { - try { + try { // Serialize the object ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); ObjectOutputStream objectOutputStream = new ObjectOutputStream(byteArrayOutputStream); @@ -36,27 +44,31 @@ public static void sendObjectBroadcast(Object obj) { objectOutputStream.close(); byteArrayOutputStream.close(); + // + if (serializedObject.length > MAX_UDP_PAYLOAD) { + System.err.println("[ObjectTransfer] Serialized object too large for a single UDP packet (" + + serializedObject.length + " > " + MAX_UDP_PAYLOAD + ")."); + return; + } + // Create a UDP socket - DatagramSocket socket = new DatagramSocket(); + try(DatagramSocket socket = new DatagramSocket()){ socket.setBroadcast(true); // Enable broadcasting // Define the broadcast address and port - InetAddress broadcastAddress = InetAddress.getByName("255.255.255.255"); - + InetAddress broadcastAddress = InetAddress.getByName(BROADCAST_GROUP.trim()); // Create a DatagramPacket with the serialized object DatagramPacket packet = new DatagramPacket(serializedObject, serializedObject.length, broadcastAddress, ObjectTransfer.broadCastListeningPort); // Send the packet socket.send(packet); + } System.out.println("Object broadcasted successfully!"); - - // Close the socket - socket.close(); - } catch (Exception e) { - e.printStackTrace(); + }catch (Exception e){ + e.printStackTrace(); + } } - } public static Object recieveObjectBroadcast() { try { @@ -64,7 +76,7 @@ public static Object recieveObjectBroadcast() { DatagramSocket socket = new DatagramSocket(ObjectTransfer.broadCastListeningPort); // Listen on the same port // Buffer to store incoming data - byte[] buffer = new byte[1024]; + byte[] buffer = new byte[RECV_BUFFER]; DatagramPacket packet = new DatagramPacket(buffer, buffer.length); // Receive the packet @@ -73,7 +85,7 @@ public static Object recieveObjectBroadcast() { System.out.println("Object received!"); // Deserialize the object - ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(packet.getData()); + ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(packet.getData(), 0, packet.getLength()); ObjectInputStream objectInputStream = new ObjectInputStream(byteArrayInputStream); Object receivedObject = objectInputStream.readObject(); objectInputStream.close(); diff --git a/src/utils/Config.java b/src/utils/Config.java index 6b1608d..fcad39c 100644 --- a/src/utils/Config.java +++ b/src/utils/Config.java @@ -24,6 +24,41 @@ public final class Config { private Config() {} + // Getters for broadcast properties + public static String getBroadcastGroup() + { + return PROPERTIES.getProperty("broadcast.group","255.255.255.255").trim(); + } + public static int getBroadcastPort() + { + return Integer.parseInt(PROPERTIES.getProperty("broadcast.port","50010")); + } + public static int getBroadcastChunkBytes() + { + return Integer.parseInt(PROPERTIES.getProperty("broadcast.chunk_bytes","4096")); + } + public static int getBroadcastMaxRounds() + { + return Integer.parseInt(PROPERTIES.getProperty("broadcast.max_rounds","3")); + } + public static int getBroadcastNackPort() + { + return Integer.parseInt(PROPERTIES.getProperty("broadcast.nack_port","50011")); + } + public static int getBroadcastNackDelayMs() + { + return Integer.parseInt(PROPERTIES.getProperty("broadcast.nack_delay_ms","200")); + } + public static int getBroadcastWaitNacksMs() + { + return Integer.parseInt(PROPERTIES.getProperty("broadcast.wait_nacks_ms","250")); + } + public static int getBeaconPort() + { + return Integer.parseInt(PROPERTIES.getProperty("beacon.port", "12344")); + } + + // Getters for directory paths public static String getTestDir() { String dir = PROPERTIES.getProperty("test.dir", DEFAULT_TEST_DIR); ensureDirectory(dir);