From cca61c9f562d2c9e2be13ec16abe134d209b54e3 Mon Sep 17 00:00:00 2001 From: O'Shea Date: Thu, 10 Dec 2020 14:03:54 -0500 Subject: [PATCH] Final implementation, ready for presentation! --- .../ChatClientCMD$1.class} | Bin 1293 -> 1302 bytes .../ChatClientCMD$2.class} | Bin 1147 -> 1156 bytes .../ChatClientCMD.class} | Bin 2023 -> 2034 bytes bin/{javaChat => backend}/ChatServer.class | Bin 2122 -> 2117 bytes bin/backend/ClientHandler.class | Bin 0 -> 4746 bytes bin/chatApp/ChatGUI$1.class | Bin 0 -> 744 bytes bin/chatApp/ChatGUI$2.class | Bin 0 -> 747 bytes bin/chatApp/ChatGUI$3.class | Bin 0 -> 541 bytes bin/chatApp/ChatGUI.class | Bin 0 -> 6970 bytes bin/chatApp/ClientGUI$1.class | Bin 0 -> 1648 bytes bin/chatApp/ClientGUI$2.class | Bin 0 -> 1083 bytes bin/chatApp/ClientGUI.class | Bin 0 -> 2327 bytes bin/chatApp/LoginGUI$1.class | Bin 0 -> 753 bytes bin/chatApp/LoginGUI$2.class | Bin 0 -> 753 bytes bin/chatApp/LoginGUI$3.class | Bin 0 -> 545 bytes bin/chatApp/LoginGUI.class | Bin 0 -> 6662 bytes bin/demonstration/ChatDEMO$1.class | Bin 0 -> 780 bytes bin/demonstration/ChatDEMO$2.class | Bin 0 -> 783 bytes bin/demonstration/ChatDEMO$3.class | Bin 0 -> 563 bytes bin/demonstration/ChatDEMO.class | Bin 0 -> 7013 bytes bin/demonstration/ClientDEMO$1.class | Bin 0 -> 1684 bytes bin/demonstration/ClientDEMO$2.class | Bin 0 -> 1119 bytes bin/demonstration/ClientDEMO.class | Bin 0 -> 2388 bytes bin/demonstration/LoginDEMO$1.class | Bin 0 -> 789 bytes bin/demonstration/LoginDEMO$2.class | Bin 0 -> 567 bytes bin/demonstration/LoginDEMO.class | Bin 0 -> 6614 bytes bin/javaChat/ClientGUI$1.class | Bin 1289 -> 0 bytes bin/javaChat/ClientGUI$2.class | Bin 1143 -> 0 bytes bin/javaChat/ClientGUI.class | Bin 2163 -> 0 bytes bin/javaChat/ClientHandler.class | Bin 3773 -> 0 bytes bin/javaChat/UserInterface$1.class | Bin 751 -> 0 bytes bin/javaChat/UserInterface$2.class | Bin 788 -> 0 bytes bin/javaChat/UserInterface$3.class | Bin 788 -> 0 bytes bin/javaChat/UserInterface$4.class | Bin 788 -> 0 bytes bin/javaChat/UserInterface$5.class | Bin 788 -> 0 bytes bin/javaChat/UserInterface$6.class | Bin 568 -> 0 bytes bin/javaChat/UserInterface.class | Bin 9389 -> 0 bytes executables/java chat DEMO.jar | Bin 0 -> 18323 bytes executables/java chat server.jar | Bin 0 -> 6744 bytes executables/java chat.jar | Bin 0 -> 18038 bytes .../ChatClientCMD.java} | 4 +- src/backend/ChatServer.class | Bin 0 -> 1638 bytes src/backend/ChatServer.java | 309 ++++++++++++++++++ src/backend/ClientHandler.class | Bin 0 -> 4117 bytes src/chatApp/ChatGUI$1.class | Bin 0 -> 570 bytes src/chatApp/ChatGUI$2.class | Bin 0 -> 573 bytes src/chatApp/ChatGUI$3.class | Bin 0 -> 455 bytes src/chatApp/ChatGUI.class | Bin 0 -> 6647 bytes src/chatApp/ChatGUI.java | 167 ++++++++++ src/chatApp/ChattingUI$1.class | Bin 0 -> 585 bytes src/chatApp/ChattingUI$2.class | Bin 0 -> 588 bytes src/chatApp/ChattingUI$3.class | Bin 0 -> 464 bytes src/chatApp/ChattingUI.class | Bin 0 -> 6665 bytes src/chatApp/ClientGUI$1.class | Bin 0 -> 1440 bytes src/chatApp/ClientGUI$2.class | Bin 0 -> 884 bytes src/chatApp/ClientGUI.class | Bin 0 -> 2154 bytes src/{javaChat => chatApp}/ClientGUI.java | 60 ++-- src/chatApp/LoginGUI$1.class | Bin 0 -> 578 bytes src/chatApp/LoginGUI$2.class | Bin 0 -> 578 bytes src/chatApp/LoginGUI$3.class | Bin 0 -> 458 bytes src/chatApp/LoginGUI$4.class | Bin 0 -> 575 bytes src/chatApp/LoginGUI$5.class | Bin 0 -> 575 bytes src/chatApp/LoginGUI$6.class | Bin 0 -> 458 bytes src/chatApp/LoginGUI.class | Bin 0 -> 6098 bytes src/chatApp/LoginGUI.java | 182 +++++++++++ src/chatApp/loginDEMO$1.class | Bin 0 -> 583 bytes src/chatApp/loginDEMO$2.class | Bin 0 -> 461 bytes src/chatApp/loginDEMO.class | Bin 0 -> 5624 bytes src/demonstration/ChatDEMO$1.class | Bin 0 -> 599 bytes src/demonstration/ChatDEMO$2.class | Bin 0 -> 602 bytes src/demonstration/ChatDEMO$3.class | Bin 0 -> 470 bytes src/demonstration/ChatDEMO.class | Bin 0 -> 6683 bytes src/demonstration/ChatDEMO.java | 166 ++++++++++ src/demonstration/ClientDEMO$1.class | Bin 0 -> 1469 bytes src/demonstration/ClientDEMO$2.class | Bin 0 -> 913 bytes src/demonstration/ClientDEMO.class | Bin 0 -> 2208 bytes src/demonstration/ClientDEMO.java | 110 +++++++ src/demonstration/LoginDEMO$1.class | Bin 0 -> 607 bytes src/demonstration/LoginDEMO$2.class | Bin 0 -> 473 bytes src/demonstration/LoginDEMO.class | Bin 0 -> 6086 bytes src/demonstration/LoginDEMO.java | 158 +++++++++ src/javaChat/ChatServer.java | 237 -------------- src/javaChat/UserInterface.java | 288 ---------------- 83 files changed, 1130 insertions(+), 551 deletions(-) rename bin/{javaChat/ChatClient$1.class => backend/ChatClientCMD$1.class} (52%) rename bin/{javaChat/ChatClient$2.class => backend/ChatClientCMD$2.class} (59%) rename bin/{javaChat/ChatClient.class => backend/ChatClientCMD.class} (78%) rename bin/{javaChat => backend}/ChatServer.class (61%) create mode 100644 bin/backend/ClientHandler.class create mode 100644 bin/chatApp/ChatGUI$1.class create mode 100644 bin/chatApp/ChatGUI$2.class create mode 100644 bin/chatApp/ChatGUI$3.class create mode 100644 bin/chatApp/ChatGUI.class create mode 100644 bin/chatApp/ClientGUI$1.class create mode 100644 bin/chatApp/ClientGUI$2.class create mode 100644 bin/chatApp/ClientGUI.class create mode 100644 bin/chatApp/LoginGUI$1.class create mode 100644 bin/chatApp/LoginGUI$2.class create mode 100644 bin/chatApp/LoginGUI$3.class create mode 100644 bin/chatApp/LoginGUI.class create mode 100644 bin/demonstration/ChatDEMO$1.class create mode 100644 bin/demonstration/ChatDEMO$2.class create mode 100644 bin/demonstration/ChatDEMO$3.class create mode 100644 bin/demonstration/ChatDEMO.class create mode 100644 bin/demonstration/ClientDEMO$1.class create mode 100644 bin/demonstration/ClientDEMO$2.class create mode 100644 bin/demonstration/ClientDEMO.class create mode 100644 bin/demonstration/LoginDEMO$1.class create mode 100644 bin/demonstration/LoginDEMO$2.class create mode 100644 bin/demonstration/LoginDEMO.class delete mode 100644 bin/javaChat/ClientGUI$1.class delete mode 100644 bin/javaChat/ClientGUI$2.class delete mode 100644 bin/javaChat/ClientGUI.class delete mode 100644 bin/javaChat/ClientHandler.class delete mode 100644 bin/javaChat/UserInterface$1.class delete mode 100644 bin/javaChat/UserInterface$2.class delete mode 100644 bin/javaChat/UserInterface$3.class delete mode 100644 bin/javaChat/UserInterface$4.class delete mode 100644 bin/javaChat/UserInterface$5.class delete mode 100644 bin/javaChat/UserInterface$6.class delete mode 100644 bin/javaChat/UserInterface.class create mode 100644 executables/java chat DEMO.jar create mode 100644 executables/java chat server.jar create mode 100644 executables/java chat.jar rename src/{javaChat/ChatClient.java => backend/ChatClientCMD.java} (98%) create mode 100644 src/backend/ChatServer.class create mode 100644 src/backend/ChatServer.java create mode 100644 src/backend/ClientHandler.class create mode 100644 src/chatApp/ChatGUI$1.class create mode 100644 src/chatApp/ChatGUI$2.class create mode 100644 src/chatApp/ChatGUI$3.class create mode 100644 src/chatApp/ChatGUI.class create mode 100644 src/chatApp/ChatGUI.java create mode 100644 src/chatApp/ChattingUI$1.class create mode 100644 src/chatApp/ChattingUI$2.class create mode 100644 src/chatApp/ChattingUI$3.class create mode 100644 src/chatApp/ChattingUI.class create mode 100644 src/chatApp/ClientGUI$1.class create mode 100644 src/chatApp/ClientGUI$2.class create mode 100644 src/chatApp/ClientGUI.class rename src/{javaChat => chatApp}/ClientGUI.java (57%) create mode 100644 src/chatApp/LoginGUI$1.class create mode 100644 src/chatApp/LoginGUI$2.class create mode 100644 src/chatApp/LoginGUI$3.class create mode 100644 src/chatApp/LoginGUI$4.class create mode 100644 src/chatApp/LoginGUI$5.class create mode 100644 src/chatApp/LoginGUI$6.class create mode 100644 src/chatApp/LoginGUI.class create mode 100644 src/chatApp/LoginGUI.java create mode 100644 src/chatApp/loginDEMO$1.class create mode 100644 src/chatApp/loginDEMO$2.class create mode 100644 src/chatApp/loginDEMO.class create mode 100644 src/demonstration/ChatDEMO$1.class create mode 100644 src/demonstration/ChatDEMO$2.class create mode 100644 src/demonstration/ChatDEMO$3.class create mode 100644 src/demonstration/ChatDEMO.class create mode 100644 src/demonstration/ChatDEMO.java create mode 100644 src/demonstration/ClientDEMO$1.class create mode 100644 src/demonstration/ClientDEMO$2.class create mode 100644 src/demonstration/ClientDEMO.class create mode 100644 src/demonstration/ClientDEMO.java create mode 100644 src/demonstration/LoginDEMO$1.class create mode 100644 src/demonstration/LoginDEMO$2.class create mode 100644 src/demonstration/LoginDEMO.class create mode 100644 src/demonstration/LoginDEMO.java delete mode 100644 src/javaChat/ChatServer.java delete mode 100644 src/javaChat/UserInterface.java diff --git a/bin/javaChat/ChatClient$1.class b/bin/backend/ChatClientCMD$1.class similarity index 52% rename from bin/javaChat/ChatClient$1.class rename to bin/backend/ChatClientCMD$1.class index 63f587aa5a2ece2dc76771f8d7f522aa753df2bc..506a9ca77159df5a950b2b27bba5d8fd7124d5a0 100644 GIT binary patch delta 122 zcmeC>n#QGi>ff$?3=9kw3_k1(OpFZTNr}nXsd*{-&KZd%&N-Q>c_q%iE*q8A8O0@i cu*z+YXZ*m(CxoJYaulff$?3=9kw3_k1(OpFYoS&3zd&KZd%`XItNCo?s#WTUD&qo}wK7Mab- Yj2{@e`4LJdCo;>32xC(@nYoz}00QDAOaK4? diff --git a/bin/javaChat/ChatClient$2.class b/bin/backend/ChatClientCMD$2.class similarity index 59% rename from bin/javaChat/ChatClient$2.class rename to bin/backend/ChatClientCMD$2.class index 03c4556fd386204d5d1dbbf2b5cb3e429a30f449..17f87ed0a7b8c0b478b3b6a52e1ff231bbe8ec28 100644 GIT binary patch delta 121 zcmey((ZZ>E>ff$?3=9kw49@HfOpFZTNr}nXsd*{-&KZd%&N-Q>c_q%iE)$h+h)eol cmD()8c#x4#2u1niJ4`ZSqS%%5Fy}J@0C;96+W-In delta 135 zcmZqS{LP_!>ff$?3=9kw49@HfOpFYoS&3zd&KZd%`XItNCo?s#WTNT~QE?wE5}QRB s4>DTwBUI{v6frXJyXGb5O#lD@ diff --git a/bin/javaChat/ChatClient.class b/bin/backend/ChatClientCMD.class similarity index 78% rename from bin/javaChat/ChatClient.class rename to bin/backend/ChatClientCMD.class index 54450fbdfdc8d5edd754f3a5cffc20e9caf05052..bf8fb2112192b69b287ed872d43b3c2b9de5049a 100644 GIT binary patch delta 148 zcmaFP|A}Aq)W2Q(7#J8V7)sa~m>3yElM<7&Q}a^voih?koO3c$^Gck3T_!50iHrMS jmD)JZo>@#BtJLI=%(*zEHW#s!G4ctaShD#u>la1)W2Q(7#J8V7)sa~m>3y^vl7b^oih?k^g)DkPG)Le$wbvOMNuCt64s0i vEV+r9d5jEV8j}yQ2yZ;7z$_w)Md9S{%(+-4HdnEfF>>=G?ArW~^$Q~aJ6SY7 diff --git a/bin/javaChat/ChatServer.class b/bin/backend/ChatServer.class similarity index 61% rename from bin/javaChat/ChatServer.class rename to bin/backend/ChatServer.class index 21c4d11cfb64ebb997f0ab485acc60521eb97672..0faed879ba6ab018a81983267289c59c44b351e0 100644 GIT binary patch delta 196 zcmX>la8yA2)W2Q(7#J8V7)se0m>3y^k`j}%Q}a?LN(9O2`D7)QCF+-!Waj8Q78NB{ z`eYWD*!aLybWY(EfpIpgGoE4M5QR!@{=@u+ky9KdIr$T76(i^5Ts8+riOK8Oj2J~G zKV;ixs>Hy}pv=I_pvoZ1pv54?pu?cXpvz#)pwD2-!YGur?F delta 201 zcmX>qa7sYp)W2Q(7#J8V7)se0m>3y^vl7b^oih?kCW;5i>-&Is`lThAIr@%8MTwO@ znZ+eGU_r2w_9N-%IUNHXv;NHd5sC@@GdC^4upC^Hx{s4`dsSxyWZ41o+<43P}l3@Hq{47m*Y Y3`GoblaI3(b2Bh7G86+{&csjx0G@3$%>V!Z diff --git a/bin/backend/ClientHandler.class b/bin/backend/ClientHandler.class new file mode 100644 index 0000000000000000000000000000000000000000..05862965db1ae6614c054de7d7fca11563db23b0 GIT binary patch literal 4746 zcmZ`+3ve6N6+O>dX=QmKi4un>4#~ze#+KzM1PDPk0+Qeo;!lc`P>1hE+Sp2@T}N6a zm_qp%QVO)tmgYx+mbkQOArvbCN=jR3fM%vcnGP+(KsudiI~}Ie$&?PI6!pB7WJ`&e zvG=`w@4ox)=iGBwZ+!Z~5dh0^OhuhQ<0d1q)wGh)mFbjeIhPw&GHqs6C<4>B7~73# z+OUSA{hPL!2}gxbAUL^tW!|!kO=(lWm$RwG5tz~AZd;}k9dMUA1^oG(nYD}z<$|Sc zSLc9}O<6SiYjXasKGa0(Ka@b64<JgB$`5GFa$(gRrp zx>DGKJ$AxKZ!oec`CeXBoZ(bX;EbLrGs_SP?kX}TG$m>C#gmi=ruUl8u$^3MWSJ_* z%*u^y-tuFyz?Fe`Jg%?j8NGQ?u2~;8a(XVGNSL|Y=6pImswZsAB0|ih-s+5wn0j>B zOpoZB?W}I-=~T|q?ah>N-=i)qOhsQGp0dZkDJJqnc zx+*^sMstpt(QqMRbkUZOYn;g7T7t5Iwg9>iS8)<_VW0_!xa2f^yEBuOALg*%^tskV)Ne31!Tl#A($auTx}HOxRzdUuV6Yvrxp zMB2{ruIq7)iW>yxRQp?9O#y6@A_*FL5|^-s4a>6gR>I7Xs~D6_DVB8o#_A+i`7HUx zb+y+RaSOzcEi}f(ryprK-Ih-|elUUcQCSrdu6~RV8qtxAL}^w-4!q50Zp#~KmPJjX zE8t@YwzGZ%9T!cO2$)HszSie?4x&tt!4uE}f|FVZ#}4&uF*}x0eaGhi**7B=4ls(Mz*gV^l78 z25=|tR&iGaCbiodzJhzGg%@TG$0kk8u0YNeTwPx8Y`{+3r{b%Xrckr1;cK{`L}QsZ z(vDitmSd*k!3yrHN_#~G%WKrD3|oWbYrEcPv1Jl8VJ+qqj%Qv%x-ST1b%H&07 zvSuPRB0p#d73sn{Tj2C^P|JR(I3l|;fp(O8f$prG(YqGq;*!FcMj4FFTq`SZs30(4 z=d%g3J0(APrZJ)AvRf>93Od8);lCF?eqXV(^9kA4-H~109of^}ksaL~$&wtsJU0`w zP=`jo?d0g?xFCE8v%~G<2!$i#XbN|XpVt8!q2L-`crCBE zj_R&Q2sd!gz~{JoUP&bup@nZ$j;SfHwYz z`OofvIegMuaT^sYT-zJ$P+o#(&=Y^*pk>IK) ziyuaUJ^RrxR{Wr^qkz6}BwWD2F8Ic9e();qq?$n`B31QLRfMXjV{kVD5o#PO9t?ZN zF*sIyN{$Ol>aXT-W&zi62o+$A!SCunNcR@-t6~}Z<0u{`hxF4;8M-Z)%jYn=Rf-;^ zF%LE+^YnNJxI#B7*0&Vm1bSfFAF z|2C-TR~p(>_Q`&Qr`fydA+w>}&TJ5Q;)MDVmJE7=sewTyxOHIA8_Wz0`hxaAUwd$C z0o!(Aad?o?RBm7lgZWbCBIV4*6vjKGFyJADp;ivG2Q%)OYbVc8_RQdp0!E+3%>~>M z^D=cI@AJ4<;AM!I5>lSS!rd~X^QGvEcwjL2^+R|_t~V9%%>ur|!}7!)f!)QU?ZK3L z#rl)3_%5Y724m`xWj@a`Ua}~pHhP!Fl#`TBXuQiS8oiCa$BXZ{7Cz47?LoVM@9o0- zC#fFeUI{kcRr;QCjikQdk0z9gn78bvI)?U;I^m`-84?Yz8@R8V$|A?pYu{ehRinsBp zc!yo?T~R0A7mD~R$A1dHTR%5R9u+4lG{%{%8qyeNt)#X(gv1|N4@Ve{IDa?E>Qd-Q z3w>+h>^SS_Ww}NR$LOn^t;Id`xCLHXI?t8!(Uw;F8Q?G8cgf4L9u=|##6nE}1idO= zDe{0%g>Va!&sWI7JAoo**Dkvv?#A5Ojf#9dlo~Zu(F%Xfl5q87VUZ4}+ew)ufDJNl2+wQ(p%;{?%RNm0y=yKs(7REct&;2PuRtVpIydC3S3)+GP)0fy*W+ zy@fpxVg_c5nV2scu|&+qa=xz+A^zr?i*7LwR}iR^U2%;IBC25-yheki#x;1I8LneG zn_WnFSSA%>mUP?>rO4mvUN4gC2I+zJspCQ7kw{Hq^pc$}>mbI@5|ck}7_p=t=sC$TCUk>Z#1kOPv|qrU{qHR=|AU4w`<35}6B+ z{1u8GleZPGv;P^q^A&3!^PY8Dt8@}L#0ITAk3DQ+i?VBED-6yDpUT^)7ht^t%=p>V-))rW&c4`tMRxCj`^En85Fq!K3=lYvOj_#hDsE0Kq7OA;Wen`lryI6@9qZ_fW?T z2b*+vPNt77Y%pw&&%}FkBtb7QlkQ&YJ#* z5}6B+_ABH)q}^t`_Wo!1?XOt+nAa@RTBV!7Q>@VH=e~zktWk80Y=Ob~5Kwv@8wFUW z0CU@);O~FI_1{>wAMlJA^m4rQJa!8_%cy~y1Xdt7sJMb{T1zD2b{^HSgC=<%m04o; JyF*q&{TBhAo}mB$ literal 0 HcmV?d00001 diff --git a/bin/chatApp/ChatGUI$3.class b/bin/chatApp/ChatGUI$3.class new file mode 100644 index 0000000000000000000000000000000000000000..4d142b8f62f0b91b0271c0b50a2edf6772735a48 GIT binary patch literal 541 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 literal 0 HcmV?d00001 diff --git a/bin/chatApp/ClientGUI$1.class b/bin/chatApp/ClientGUI$1.class new file mode 100644 index 0000000000000000000000000000000000000000..99fee347396c6a6da86536429621f3819db0aeab GIT binary patch literal 1648 zcmZ`(T~ixX7=8{3S+ZRUq?AJaLZvndZDXyaR1l;o&|vs5fv8lghvW#`CcANWQ|V99 zOK-Sy#!iWj7tVO)j6cb7#OG`%-H0Z0&U?;zzn}Mg_m97S`4zx4Yy&+4=c;=$SZFqL z`MRx~V0o)Baos>%VDO=QEOT|~?B>>Y9;#|!AR&-?@mgv*j@+p$fuYB;K2ei_EC-&F zjrCR_aIqLl+HUSH8GLHCf)0Czw!0Myj=)%#e8Gu|n_Ap=tB({74|N0`739j{6YV8t zZO0Dg1eViXX1d&VaiR`R8O&4!;(52GlAu2e2Kw~roP{JzeL8R93@j5dT(HoOQGr-m zD-9HFN3FFQJIdSaK$9xERavh{&(`ePU%^A6B7b`no)AyhKA`xh;JHTw;F5#Rz+dwYQz!nM}pRyO=U? zQ{Y0>RHPslZfQt+t992`+Vhl&_p}bN83=V=6yL=Am^Z-ENBXt=#1B-%!UtGjA=SRk zwuz?;nM#rnCd0^*aowG-tT=_7l4V6P&QCvA3e`IB4lAxqu1NidL}CP#K6Z9(Zc%T zepNLC+jT5_s^J+3MazM#KHBtTm1AfgXB0-9Ivp>Q+>gc>u}Nh6LsP4=88)ebFS{WP z%SRt&x8+sUlC9_d?8!Idnofx^EjqerEOe)ZEhv0N>>JYNh>xW2pAJfoja6_Q<>l+r z_Z6GHZ%z5ZJ=YJ|@I;oY7qP*V9z%eXLl{zyAU|Y1T>UspI>6H$X`FO8J9&t~?3F{L zvR4mz{RtyKhSFo)6SN67{YCCpcpk<}c$v3XxcXx-1_zPkI>ROKDn_}}yhzZzb||0X zwKgt&hfCRK3~92Bt30IIxS{WDOp^?^aXa=iW-0m%cfQ3~sIyd@{2hsdqu;ck)_aPT z)LI)G2S+~?dEe412S?wBZsxJYR=9&wNMq2kFJXxL4We)pDNOP07IB)!W!%OjW;tDR zn87^%3)IYG1&h>QqJ?GJDqx#04>(jh_i>`jWR7#6VT#+h&r~Z!`ZIja(*yE{h=2Ak lj2QUhPZ%o(*>Ngq=yy;hjnhyKyF8gx5v2OJ$JK-Je*k?8f;RvF literal 0 HcmV?d00001 diff --git a/bin/chatApp/ClientGUI$2.class b/bin/chatApp/ClientGUI$2.class new file mode 100644 index 0000000000000000000000000000000000000000..0bf7974d99655f9fae45869920aea208dbbb5ac4 GIT binary patch literal 1083 zcmZ`&TT&B26g`~;CK(43!b=n*DrypxD59dl2Zf-i3LpgV1GQ`>T`)M0)J%uMCAbp4 zwG=HsT!8y<0d7FNJrh9-n5ypEeV^y{x%1=qx9 zp%nvXG031%&-In%S%#i`A!;amHR{)LH_9pGFr?u;L)Ve|1}@+tLsA)*JkKGYLy)8+ zHp)7NaYe&rYWE;MG8wpvJcH4oI&w|~0pB1pdRveBFNVUZjv}sU7$L&{c2ilH*)c^! zTApj*x_Z@gn5ibY`F7dorqEHsO$|5x8;07uKnlme7;X_oV#kss@)gBL%85Xz0mvSG z2?n;KXgCG{(a;gro#TxbYkJLV`lgt*)P!{&Oy{VICa5#6X?p=ZaKxU02cU^cINYM* zefhPciUbysrQHb6I=azAw_aLpG$WY|sr#UImF#^hS+4jA#vb~sA8~GE z50`fLe^p5q;$JbkyZJIMGX@czZ^J7t?#0lJ^YYg{MCYhkXNj##HPL8T8^*yE)L+%fW*YcwP literal 0 HcmV?d00001 diff --git a/bin/chatApp/ClientGUI.class b/bin/chatApp/ClientGUI.class new file mode 100644 index 0000000000000000000000000000000000000000..36de0376e4f69751dcd0c8606951e44cef3a2fdb GIT binary patch literal 2327 zcmZ`*X?GJ<7=ET%CLM;BrnHcPT4b?BN(2`mtst~4(Wb4mjRtU;Cf9V@bP{K7Sj1g% zSJZEQ>sGvAIr;eP(u&AR4WU9YZ#x>I(@m9WMWDvGhKQnF zE*95lah*R&T7x~2E!d7NPiqK_jHWdNCyP0uV>>-yhH?I8R+OY&bUYpVXvLSZi}B>_I!EQR-^2kN zq`W6&+V*Terr^kx(X`?|W?}@R%+~g%iVmYCMpwG=IL34w>8Qp0El-Ly6GsuJRI$vm z4Adi|&pC!A8Jw`z#v?eU0S2DL(>k7N3#?7Z#4|X-x|Wn44UKG-ql)j8i3Es7C@*Ak zPQ%WT(aoYt@L3b5mEblCE_%XstTh(-ITpmn#St<-U(BuwY2XabsTxlza5o!Ej;3{- zXF;2IPFd1QI;CEGjj_Q*~%D#tls21?6;F!|sOD4I;|z47u%Y zXUnp~@0^JjahW;MZ#z#JZQw$y?HqbeVL^Fb)DUZV?vPQfkittQURFhk+;D9v78fq) zxYC5dpT>Igoh#dgoNyz!#{4;#d665oongyM3>(PcRpsl1y1j0~!V+7{DwTwj(=fIL z+MBD{u+P9V$e9qTs1aGLJ6GeDH?i!;$%bCAWkD$7ejTeF?YgkcX3Xi}R_I@!+2(j1 zIA)-Lq6)R7;bIFGRqGCD);oMd7mU{#t+wJ!8d!m=Y;vY|wdZ=d>^N%nDWjvjWkAOb zNZe4$H#O|-45+=4>R#S5aa--EkS8sd^Aoh(yjmn%tO_!7{$Oh?W|z%$qnmr42$vf( z!+LrCoTzQOVRTptGe?B#gP!Deiv2G>8n(AY38{vm4%rTrIkp~KBqco0%KIzR_w09F zy^wU>vIUkaCq81u!ln-v#qwTOGxzcWXb zc_x!|9N|tDEYA}Z-ZmpVnG$Msd)UXF9^l8S3lX*ad5fq8&ojVhH}@MA_;!jC>Nik> znW>`Z0s3m_=WXBt27e=?3%mI=d@-eFAm&p+1N_i5%*1(eYa(>GilLTT*e8a46|*jY zJ=jaZZajpC8OtNQ2gw;$(P+0BV>cE^3sp8FqUZ=`TEL6pHMTx}p3U0+Be5h;#K1eeh zWDpb`QD)K4tvh18?IU+U~}Wco**xuS56*@8biOWsL71@)n?77a!qc;&}-<+@VB>KGOIUpRoh( z((~u|g3;Y0)?e}#!B@1&|1y8W)OzqWUqTu^seHcSvx_?4@{ICU;HiGHe&9QvVV^Gl E14h0x`2YX_ literal 0 HcmV?d00001 diff --git a/bin/chatApp/LoginGUI$1.class b/bin/chatApp/LoginGUI$1.class new file mode 100644 index 0000000000000000000000000000000000000000..9e892621580dc1fb7f5a3f9482d203a020be9fdf GIT binary patch literal 753 zcmaJ<+iuf95Iviuac$hjlwL?_D3^fJRKi5!0nvgKMJ-e^r4l9Y8)r#2a&{wo8+hcG zkhn-Z@Bw@jV%9YRwFpbIJ2N{zbI$Dk`1$QSfXBG+pv15ekGbj2W?`g9Qayij)a*E@ zFa#4m=V8LtD10@Th}bx&GBolme`i857s`a)*hsA+nHix(%1||9nKd60Y;+NKk52cc zlI9u1TI=%hPM@LD(?j8cVabPsMGs}ve7Fc0$}L+^i=-0AXVZa5Px&Abwvmo`(&wqP zagnT88VswKx->gPBX}vySPxHl%BRAJlqzdH7jh!fw>q7QA;Wen`lr?dt9x&!@1c$x z4mJtyqEa7Q*kIV4oQn76P>N*OIiJ&C@MSSK3|s%}!Qj2tXK5@Br4_pL`+^==UPSpo z#fi?O8lB7Wao5gi*^aoUr!%dHC`t2=6kSa(;aMgqTs#(;d7(3dTQuh~*#cM)*m2XV zD3Q7FXum?Q K_Pa+`Lj4z1WT9gK literal 0 HcmV?d00001 diff --git a/bin/chatApp/LoginGUI$2.class b/bin/chatApp/LoginGUI$2.class new file mode 100644 index 0000000000000000000000000000000000000000..aa1d5cea0bf8f081101698112332437a3a1279f8 GIT binary patch literal 753 zcmaJ<+iuf95Iviuac$hjlwL?_D20I1RKh6Y0jUTnirNws+Df!}-#AOMk+U1w+rT5g zgv3SSfe+xL5VNiks6|+s-I>|(nR90M$Ioxy0X)Ma2L*3_rd@&t}x8CwwZ5NT{;HGa;uUd8?DD7&2@(djHgVV0G{B_B~W_ z$H6AST~+F13mXiZlQZ$&97+)nTbFbC3%)4khGFY}Js7+<`XY(Mp|nDmeqYdI%Zn%< zs3_K{RHI8dJ|5UPE!z=y^mL{b5hZDUSJBmUVxFdg!o_2enwL5?xJPp?k}ZG*fgLx! ziUOGnkMsjpPc$QHOcL^*dmp{`^ql+t@$v>>6U#Od38#cizP6F3?m_juqZF?Nf+4*vmDD>7$>M62!P*ONg@YtAE^G`j&|K0C-GW3CAolbB*~Vxg-tmOXM-@!F7b zDq$z`#ep=0v)@|RjT|Dlulyj4rK+C@-3V`8%wvIsw766Zlf@fvAiJU?>MI*e_gEwFin#Q%wU$hMcbOgB1H}%8ccJR I$P&nZ0%H?s0ssI2 literal 0 HcmV?d00001 diff --git a/bin/chatApp/LoginGUI.class b/bin/chatApp/LoginGUI.class new file mode 100644 index 0000000000000000000000000000000000000000..3640ee3dbf1c5578f86301d8d54d2765540cf724 GIT binary patch literal 6662 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 literal 0 HcmV?d00001 diff --git a/bin/demonstration/ChatDEMO$2.class b/bin/demonstration/ChatDEMO$2.class new file mode 100644 index 0000000000000000000000000000000000000000..ce41a2af9e715e4bed2c9d300f500a2275049838 GIT binary patch literal 783 zcmaJ?-UGzFu@2caT_ZHhwr0WEo-Y_83Q&5Z0$qmTY2 z!4L4kAK;G??`&7}A$8%-%)OjB_nbTX^Vjzu0AAp+gMz@?h^AVlCXpu6suPT*IqV&u zHuoKr1pJAd$xbZQW#@D_q0l%e3pBE-d~Z55BV{_>(BADwsUby)K-r9=wE2|D`}5fk z81phxk$EMs(Ygt=I}j)ZdPEfnEO~IS=%R?KhYEawV#@-m{YcTt)pSV7g&f8tu+rC| zj0ZA_Y@QcOR+7N_4ZWKCEXhA6GuERsnaC*_N*G_2nYA-Y-s)sZBY~|}f3EwUoy5WJ zz(pM!4%P)~^Syi6#40P9T+jz|6j3~Sc0Ip;niOef1UCQINx(hVS4l`mku|;a=i#1M zbu7H6!dRz~y1X{!VaLvF*$zF>(|202TsG*vQT${WqBp%vx*wH&ty4sgTWc0WbWv(Cq literal 0 HcmV?d00001 diff --git a/bin/demonstration/ChatDEMO$3.class b/bin/demonstration/ChatDEMO$3.class new file mode 100644 index 0000000000000000000000000000000000000000..8f3e73a9d72bad1b4a6964aba373e9114066af57 GIT binary patch literal 563 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 HMUeReq45Gd literal 0 HcmV?d00001 diff --git a/bin/demonstration/ClientDEMO.class b/bin/demonstration/ClientDEMO.class new file mode 100644 index 0000000000000000000000000000000000000000..af4fcef97d9d48bdedad3309669f76f52eaff9a6 GIT binary patch literal 2388 zcmaJ@X?GJ<7=CWEOfn2DU1&)`EsM}1C4vi(R!~}&YSY%XL<6`?lWRI9nTazK7I9bH z74@4RIi8~*^owv#a*jF2AKw`}_Jj#HwI4QvynC=-fnJXf@A%Rea)8Xn0AgeRQ5)UZ`x-~qaI80a#v4Z1*d zJP?jUpvOQ2Q4M_p{q2&g=5+L;OR)|Z&=3>onzn2?Qz31`{rsmQC}+m!?~|E%>fw7sga<`kCuFSyniE8g>ix23(et zoSI#usOa_@*oQ~S?@2#nc~;tj)-f4)8pi}8WhF;N!}p6( z`FFxV3PdAPkp9%1K;Q7lW>&@cjDeGiaSItQc+$1a5;OlS^Ag}K(6o)>J6*AgdFjS*nenrI3o<`s*+Zt68q$%)tIF0fwR_!w zi6xenSuRUEFEDx^v^Qt7sh^H#kvAY!Qe(c;Fs{0;U|>1$lLftK`9-NN_iDJ(R<4W7 zEXKSBPK?0~9lX|M`;O=+!ciWV1%41>ekFNt@;7^xc-0{<4#wGhI#sU%Es@UvMgJ zPM)>Ybna@sPKT9#Ml)sG(w!)po+rt@Wkz~_TB?EWVK*mzh%a3SV(Mk!E~dsl*ATyP zjynqQbb=h}x4jM{TSMnPbl1_#-S&Iv|BZwW?BG`q*mSO2kO*!;1$>2?YLZ+zL=iby z!(dA+8eD3Dh|yrcPV6FM91r1P`tk_(VN!;aH{vFJjPvH#yXX#Au_rYCGkUnMV*mJE z9PD|#ilaM!`1h~i>UcU>#%Jm{l|9rwc&mozQsFu#vkA(ct>O7pq>glOnyq0W6-`7( ztH|6%e;wIu&!rk(;rX>Ha#g&+TS{4VtYqsbW)smwBoVH`uHns;*0}YviAW7s)lDp+ zRdFK`<3~js3P74+UjyBYp_ftgame>`H^7Md80R4Nb2rMUQ_RkJ>_LVP-DTdoIDi{C zh})RQ9a#8@4fzWjT>*W$fd}5kJ3PhlBi_Y(#A`o3!Tb1tX&L4DL+(P<>*6DPOgzsc zk6Yx3&_)KI;xksjZ6f|TzMyw^i1nA;#qbq%@{iEpFhnQ5<{=_zNyYOGza5nMmTM1p RMXu`SHx_)yH5%Oe{{d%yPC)ap8d(oTfqIse?`)gqq;30P6eIc;bTw1j|5GeG_m`V`19>Bw@k31>?N(cq=O;=Efl&0g$*^rVmIgCkQEixk+ z4`iZTyhs)tDS^#p!x|kX6&{hjFym91$QfBmxS=Am?M^8=P)i=*3YD+1n!kkjj^ zF2D{JV5Qb41bbg_=MR>f2XvXieulT6#ia$FV^qgo23sK4xwwFBK6AXp{Vb~C0UGT2 NT;_l#Rm$j1(kw&O50FVwh3%fe~0KV@uHyM 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 X-{4!$-CV74R=;#G;XBSv{(1U;Aix$J diff --git a/bin/javaChat/ClientHandler.class b/bin/javaChat/ClientHandler.class deleted file mode 100644 index b6068401a257fd1041bc49a07d0487dfe2f0f018..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3773 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 diff --git a/bin/javaChat/UserInterface$2.class b/bin/javaChat/UserInterface$2.class deleted file mode 100644 index e082f5f913171bfc0abadc19c06c6f49a2dc0ea0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 788 zcmZ`%U2oGs5S&ZWxHhIWrKC+uX(<7Y? zjvdql0{b>hrMd{u2V;tjgSx<;t$q&mr-bV?C1pZpP!|*>+K{4Lpl(KqZarfDXnune z#ym?@Vx9|ZA1neL_62I4Y)CEyuKRGX?4gQPA1(rc>VXBUMv0=c%gKQ9cXE)Dz*>~W zGVRMev3XgnSxEw03wpJVSyJ$Z%qSbamARY{Tful=8);}Z-%wzGrgh%*r`Cy+!@h?m zwjFErbb}5kh!>xfY-||^O#;H#l%-`@1gC>#+<4+ z%{1TAY%Cx5tZOUQ_D(kWm?;))N9-!Tv`#9uCQg^nNSjxgHrQj=s~k%ZL14}2AE(0M z!sGoKpPuk;D_;BPJN))ftb8pnH+Ze{mp~V5y!yr2!%eJnc8g<4!1)qzxq*$6>_tiD zw!gtY`hm^=T(%$ZniWI^U!%y~lFusI!5t;Eyui*=}M;+D-1v+`DJbJ@?H1`TOfPfEUqzNxIWv9we_EARE zIC4-C2<+Q1k?JaZ-y2e798?9iZS`}gKgC?9F)0%=gSw)2tPLs31gd5b>&8>&Z%=P< z%$S$4ip?v5jlEf*{jNZzmG;Snz+E2><~@|L=)*-IP~NkE#dfUd>}J%X>_YYu5?E@d zkxaTWi)~&MD^`-g`ix$UBbF4rBQr?*=Q5KcVk;Q$Yar}B|JL0M0OKT-kYvOeNjI?>1YJ+Wdz05HO5d_wJ{&7ki zEN@F4wSHki9O* z+~zm<2S2d(pUd_GE?B{3&R5HGx8SpiHt~?j3g%4)SFpuviHCTUXLanL!6%PlR+xRB IaFkI02bTx2ga7~l diff --git a/bin/javaChat/UserInterface$4.class b/bin/javaChat/UserInterface$4.class deleted file mode 100644 index af911d4b02285879e7955eb1c0e579c1116c3159..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 788 zcmZ`%U279T6g`uq+3vcw+Yi&GwYIjgv?;iPc@Qdsgo=e&g=k(xVY0b48#c4DGmSp_ zmjpk+2Y-M+O1!gKkV3L>XXf5Ld+xbs_Rrs6zX3eLp@WjZ=15Ltdnir#MpJgK3}qi= zM2(h%ia=oBhKW>{;miJrBIBScuxG2EL;We{I!#EKkQvk^bz*HuQ6^9|!&o;SFn?!u zgHy&lj#X@)2y7qC10DASD(!SYE(C7+aIom1jAb7#0)g_81uS=BMHg4&K4q_EKOuqD zP8!LiC$re*MX_Qf32e>j)o8J#;02jsI(Q{BIVQG(@xC_F&~(0m!2VS0tm)6J6Q{>L z4|Qxi*b=DCp54c7YzVB6x=B2s>|ys>hcZo!z-}&cej5R=n_guRJ&W^+uif5#+n0?w zQ&Ey?zNP6{J`SvFOV;*wI{ug{7Hmg6SA1#hL~2c(E?$r}&r@x%$F7$-79fJan$JH@ ziNl4*`wc#|c()a=dGZ~8^Cy;tNbPK7OTAa`Psu7);YVyu^`}l3AkLtMnU$p zAak4F;Gg`!=6^2R4|vB4-sgO^Ja-E|t7r#zn5Yzyq0)~yLnc}J{o-T7-ogp J=N?B1^?#{Bv7!I~ diff --git a/bin/javaChat/UserInterface$5.class b/bin/javaChat/UserInterface$5.class deleted file mode 100644 index bfcb669c44229f74a5139fd6208ff616dd2be21d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 788 zcmZ`%U279T6g`uq+3vcwYprS1T3c(BHU-y*7KDl*p<*FcAvN!l-P>ftW>$8l(MSK1 z;0O5N5Aa8ccQy-BNEYtQ+`DJbJ@?H1`TOfPfaiGPpdzq2mQ&doNfUn1l%Fd@`IU^Q zb>g5V5ZJe2D%CK2HyBf79MlE&Z1r=fKP6nJDJc^&gBnsd(S{V|0(CP=bn6-Ocjq@a zWz362CFZ5T_Q4|1VPBxu$zpOLaNCE2We-)X`fw2lR1Yj*wVNoqxSk9szm$WN1lGD) zB-6gk6PuUCnw2E5wV+q)ge3)U$&9l2z0Bo=*b2t`+DJpQ`C@_nnbvvJpIIkP5BnaP z*mkfb(3n5FkNemVSReP&B&PhhccVjxfY-~e^N3z2#l$ym@2Ty}#+<1r z%{1TAY%Cv-tZOUQ_D(kWm?;))M?6=2X`NJRO`I-YkT!2JZLr6#S2>m-g20;3KTd_i zg~$6XJ{|LJD_;BPJN))ftb8pncX+Mymq3g)Uj5?i;V#xWyT`F4;Cu-Z#Zpt@W#5H9^{Kx~bz3;+dn77$-$W^<1 z+3JeGxJWbPCef>&QoI!khV+qC(i}4+OFK;lry4y74@qQvxR_#?t4k#=dQUA8UynL+ z^(f$BlgHBfpi@v@lJn<&daTy0Zkm zM%0S~aVjnO+^^;LEG#iTQ9&4KsoLklbfO0z>)4>pp14#ryL3O~IJ!>5#8g+Yz{v6%MT IB1s_o1xgcflmGw# diff --git a/bin/javaChat/UserInterface.class b/bin/javaChat/UserInterface.class deleted file mode 100644 index 3487c2faff704a85be1d582900a6d8ad71ed420e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9389 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 literal 0 HcmV?d00001 diff --git a/src/javaChat/ChatClient.java b/src/backend/ChatClientCMD.java similarity index 98% rename from src/javaChat/ChatClient.java rename to src/backend/ChatClientCMD.java index 9560b49..dbaa391 100644 --- a/src/javaChat/ChatClient.java +++ b/src/backend/ChatClientCMD.java @@ -1,4 +1,4 @@ -package javaChat; +package backend; import java.net.* ; @@ -6,7 +6,7 @@ import javax.swing.JFrame ; import java.io.* ; -public class ChatClient +public class ChatClientCMD { /** diff --git a/src/backend/ChatServer.class b/src/backend/ChatServer.class new file mode 100644 index 0000000000000000000000000000000000000000..f3ea427966195d430d113d0a3b75453b772d7d75 GIT binary patch literal 1638 zcmZuyTXzyy6#h;E95NXb%|%06l^V4W5v0j-3@2ZT zS0Yyv>M*x=@KRPihS;j39Pci}cq(1yh%?LwPD*;Yl5}55x74V9FFgYshE6ld5J_#N z%M&<(DUN9qCvj>hb?HshlXc42@TtIjG05jMa*td`c_q)4qHe`8%aAd;6_T>)iG!Nc zJd$=cx%OH(o}&(v)rL}p(P^k=Hk&mtkJB7yOe`S5F#A7Q8ThfTQBzbl)vX(lrJ|J3 zN|!Z@4@`WBv&39ftMZr-&Zg2`-+*(#*5WwNu+XouE3n*uLO>xsjN6B5kejwd_&6*5#;n4b>PQ3^H|SdJFZEb9~(= zNDHvFH?UBfR;#t%J!O;{zFU=>j;=Oc81yo$mxK0lgRVS)=;^N0d!K%d;VH)Hn=V0m zmg(dyy&1iu%Wbex_K|rZMcj@WN?}Geg!#LxQ6?< zj>ot`&~L)VE!62hz@^CN6gdg@7v?!QrzX9ig9vf`ikN*fXv$L1I&$q`yV6GKH>{7g NW`TmfrQk7q_b;-Zn)Cnw literal 0 HcmV?d00001 diff --git a/src/backend/ChatServer.java b/src/backend/ChatServer.java new file mode 100644 index 0000000..c8ebfef --- /dev/null +++ b/src/backend/ChatServer.java @@ -0,0 +1,309 @@ + +package backend ; + +import java.io.DataInputStream ; +import java.io.DataOutputStream ; +import java.io.IOException ; +import java.net.ServerSocket ; +import java.net.Socket ; +import java.util.ArrayList ; + +/** + * ChatServer class accepts Client requests to join + * and creates an individual thread for each client. + * The "brain" of the server. + * + * @author osheas1 + * @author gohringj + * @version Semi-Final Draft + */ +public class ChatServer + { + + // List of all active users in Server + public static ArrayList userList = new ArrayList<>() ; + + + /** + * @param args (unused) + * @throws IOException (is thrown if connection is unexpectedly closed) + */ + public static void main( final String[] args ) throws IOException + { + // Register service on port 6789 + ServerSocket serverSocket = new ServerSocket( 6789 ) ; + Socket socket = null ; + + System.out.println( "\nServer established. Awaiting connections..." ) ; + + // Loop to accept client requests + while ( true ) + { + socket = serverSocket.accept() ; + + DataOutputStream dataStreamOut = new DataOutputStream( socket.getOutputStream() ) ; + DataInputStream dataStreamIn = new DataInputStream( socket.getInputStream() ) ; + + System.out.println( "\nClient connection detected, requesting username..." ) ; + String username = dataStreamIn.readUTF() ; + + ClientHandler handle = new ClientHandler( socket, username, dataStreamOut, dataStreamIn ) ; + + System.out.println( "\nCreating new thread...\n" ) ; + Thread thread = new Thread( handle ) ; + + userList.add( handle ) ; + + thread.start() ; + } + } + } // end class ChatServer + + + + +/** + * ClientHandler class manages the actual messages being sent + * between the users. The "heart" of the server. + * + * @author osheas1 + * @author gohringj + * @version Semi-Final Draft + */ + +class ClientHandler implements Runnable + { + Socket socket ; + String username ; + DataOutputStream dataStreamOut ; + DataInputStream dataStreamIn ; + boolean loggedIn ; + int commandCheck ; + + /** + * Constructor + * @param s = client socket + * @param user = client's user-name + * @param dos = data stream to client + * @param dis = data stream from client + */ + public ClientHandler( Socket s, String user, DataOutputStream dos, DataInputStream dis ) + { + this.socket = s ; + this.username = user ; + this.dataStreamOut = dos ; + this.dataStreamIn = dis ; + this.loggedIn = true ; + } + + + @Override + public void run() + { + // Note the connection of the new user + String announcement = String.format( "\n>>> User \"%s\" has successfully connected (type /help for a list of commands) <<<\n", this.username ) ; + System.out.println( announcement ) ; + + // Distribute announcement to entire server + sendMessage( announcement ) ; + + // Message management + String message = "" ; + while ( true ) + { + // Try-Catch block interprets incoming messages + try + { + message = this.dataStreamIn.readUTF() ; + + if(message == "" || message == " ") + { + continue ; + } + } + catch ( IOException x ) + { + x.printStackTrace() ; + } + + // Check message for user commands, returns TRUE if user "/quit"s + if( commands( message, this ) ) + { + break ; + } + + // Print the message server-side + message = String.format( "%s: %s", this.username, message ) ; + System.out.println( message ) ; + + // Distribute the message to all users + if ( this.commandCheck == 0 ) + { + sendMessage( message ) ; + } + else + { + this.commandCheck = 0 ; + } + } // end while + + // close streams when user disconnects + try + { + this.loggedIn = false ; + this.dataStreamIn.close() ; + this.dataStreamOut.close() ; + this.socket.close() ; + } + catch ( IOException x ) + { + x.printStackTrace() ; + } + } // end run + + + /** + * The 'commands' method manages the usage of user-commands + * by distributing private messages, providing a user-list, + * etc. + * + * @param message = the command itself + * @param user = the user that + * @return = boolean that indicates that the user has disconnected + */ + public boolean commands( String message, final ClientHandler user ) + { + final String[] commands = new String[] { "/help", "/quit", "/userlist", "/pm" } ; + + try + { + // Quit command terminates client's connection, with an announcement + if ( message.equals( "/quit" ) ) + { + this.commandCheck++ ; + String announcement = String.format( "\n-= \"%s\" has disconnected =- \n", user.username ) ; + System.out.println( announcement ) ; + sendMessage( announcement ) ; + return true ; + } + + // User-List command provides the user a list of everyone else connected to the server + if ( message.equals( "/userlist" ) ) + { + this.commandCheck++ ; + user.dataStreamOut.writeUTF( "> Current list of users in the server: " ) ; + for ( ClientHandler users : ChatServer.userList ) + { + if ( !users.loggedIn ) + { + continue ; + } + + user.dataStreamOut.writeUTF( "> " + users.username ) ; + } + } + + // Help command lists all available commands + if ( message.equals( "/help" ) ) + { + this.commandCheck++ ; + user.dataStreamOut.writeUTF( "\n> All available commands: " ) ; + for ( String command : commands ) + { + user.dataStreamOut.writeUTF( "> " +command ) ; + } + + user.dataStreamOut.writeUTF( "\n" ) ; + } + + // Private Message Command allows users to send messages to a single recipient + if ( message.contains( "/pm" ) ) + { + this.commandCheck++ ; + user.dataStreamOut.writeUTF( "\n> Who would you like to private message?" ) ; + String recipient = this.dataStreamIn.readUTF() ; + user.dataStreamOut.writeUTF( "> \"" + recipient + "\"" ) ; + + ClientHandler sendTo = null ; + + // loop determines which ClientHandler object to send the message to + for ( ClientHandler users : ChatServer.userList ) + { + if ( !users.loggedIn ) + { + continue ; + } + else if ( users.username.equals( recipient ) ) + { + sendTo = users ; + } + } + + if ( sendTo == null ) + { + user.dataStreamOut.writeUTF( "\n> User not found, please try again" ) ; + return false ; + } + + user.dataStreamOut.writeUTF( "\n> What would you like to say?" ) ; + String privateMessage = this.dataStreamIn.readUTF() ; + user.dataStreamOut.writeUTF( "> sent: \"" + privateMessage + "\"" ) ; + sendPrivateMessage( privateMessage, user.username, sendTo ) ; + + } + } + + catch ( IOException x ) + { + while ( ChatServer.userList.size() != 0 ) + { + System.out.println( x ) ; + } + } + + return false ; + } // end commands + + + // Convenience method to send messages privately + private static void sendPrivateMessage( String message, final String sentfrom, final ClientHandler sendto ) + { + try + { + for ( ClientHandler users : ChatServer.userList ) + { + if ( users.equals( sendto ) ) + { + message = String.format( "\nFrom <%s>: %s", sentfrom, message ) ; + users.dataStreamOut.writeUTF( message ) ; + } + } + } + catch ( final IOException x ) + { + x.printStackTrace() ; + } + } + + + // Convenience method to distribute messages to all clients + private static void sendMessage( String message ) + { + try + { + for ( ClientHandler users : ChatServer.userList ) + { + if ( !users.loggedIn ) + { + continue ; + } + users.dataStreamOut.writeUTF( message ) ; + } + } + catch ( IOException x ) + { + x.printStackTrace() ; + } + } + } +// end class ClientHandler \ No newline at end of file diff --git a/src/backend/ClientHandler.class b/src/backend/ClientHandler.class new file mode 100644 index 0000000000000000000000000000000000000000..d0dbaf0f091f9b662db8cf02e8b2813a6c9d181f GIT binary patch literal 4117 zcmaJ^eQ*@z9e&>A?sju5A2|qefME?ECYK9WK~WMol?WQR1j`{9L~*%Wk|USh^L7si zSW7Lf+WOHCYYkdIXf;}?6-y#w)!I(Sj-6?z?R2IycG}v`IBmzNolZLiN}*avoyIOBkvFWK#QN+ zX<>?nshB39mK?Ka8U3a}#255Dr`=-C>hUBa8m420z~rpq8r(OH{`Do=o$ZU~?8FWH zgIk4?>;LVk&D3xSW(jEL)H*DI=s2woYrN8I4RbJ;QRVHP9y2Qy#1<9x0vp1~WKzF{ z!RieQod&(vaCE1X$(W9_qm<7N=o#CxSS&NEH@X7_Q&04o`GUT~F6xG!&pEDc@1RV7 zKkMT(=_^*O2#2BLG6fA9=3~LQy8GF)hE(r2nCtS!3u|**#g^Zwwx)`$u?jB2U8kR~6lN>^&lSMOnOchrNAdIVVje_MGTG1wO$*2q2)Qa}d4LhH`W#bxw8I2Pp zs$wOZr7O6$BF>KWtM_Egf}69gFp{`l!zu~!sb0ism&n~%G%}`)@CFU5LF4LZlLX=u zq?4Ku?rlv($xUq7LZ?+<=tzLC)vyjJ;;(G4z1Ph2F~Sa+aF>SlGLT>sYN5cU2G8V7W z<3xx;4t|%phhE5qTcpO_8a{=41Ok?~JszCpYDUPk`!#$9_Y&d#MxWVkTN%UMoO65m z=D3FCvJZH~I(ZS6C4*VZ{UyA0RV`~3mFHUfeD zDjpG-PaTgOE!!pOm8@)BFXT#g`?Zq;bQYz`A1$&|($#%W-^E!`JW_ zn;;2;bR+$ic|#ysnL?T9E~LJTjVcMLfX6iq;vl=`yWY7w`DmP_iu96oKw?s1?WG1d(2B?Ayjz`8+yoYud!v z+wCk}Oikr1v#Zp<-7IeOomLl1oTbSg!F3u1Z&$&KoQ%ptqg*(FaM~^vGv=C{40tLb zQJ%cTGAy1Mt8CkK+@ewFG~Hf1>r4&dtPpng?gftP`od(PTr_n8Ubx{vcU zMuu}YAneyYebfQMGZ38+q7HAYPg1D5YI!qTR^n)8vIV z6-Nnzq%Ks9kVBJtgJ@83j0aYd{AIbVa)V^v!9%{-o;MuFWYgaeSa?C=6Xm1eO+x?w zi;|H2*CfVvOz#CjMmzCwvXPQgL`^8_Bjll1W{ zcb?+TGkhMx5WUPs_`jH^fEN^fdetfg$-ty0Wvg6SPToBHqE`KzMOE32ca%4wcUMO? zrMm->Thraa$d+_>D6%!()f~BX1a}N#ajcsa3Eas#M7H}4h?g7C8eq+$0TwM9V7UT^ znSibEO_yN?`U^I9X(Sx#Kf0P>X=j7w8 z3#d7C_GitJO`hS@d4@mBzgwiux0VH~mxby=b-_cZj|S>OOIj7rkTPoJKu8Ro{lE+7 zbJS{%Y#qUUgLvUQi(lk_exH}M20ROa<9Nu6L$n6VNra-Iu_X9bPC|()V@b%@$+9%8 zAop8?Od=Y57gM|d9;TD(!`|zcD*S~!f1%^-wahyze@~7EkKwCBh{|HKf?prRlycRd z7&`lL^OW{ z1pdRALxN|Acu7==qaq;QCP_+2r!eg_Iu*Qd8uJzGIxVrSp2YMsSj0^sPT(^23|4xW zSH}cSVcIEFO+AU29D>sje4Zl5gynhf4*^Fe=+V|XzpY&@<)&W6mvT=DEt0}hgQ$-@ z?Q=#mCnY8cV_h^rq>@w!(4U-R0e)-n_P=^;`WKPlAZjs3Oy}oU9hQli{C1dyRV>zO zF`M54bFo&`d#TnUcp3_GxSFwh!^?R2K~s+RQ4&fu&0pikn`$n{+rSq;-cBOMAEOT? zmi*w}XK*PJ<#k7B2fTPJIWM?Hm@OJ{nTRpKIO3uO39$rAL;_326}Va~^@5u@8r*5j r^*RvtBdo@^X|)P3;V{=3jPN`3^F8l5>^)y2cH|eBAmYA{w-Egw_h>L# literal 0 HcmV?d00001 diff --git a/src/chatApp/ChatGUI$1.class b/src/chatApp/ChatGUI$1.class new file mode 100644 index 0000000000000000000000000000000000000000..af760ba4f2561804e95f6a9b06f400c664b8c257 GIT binary patch literal 570 zcmZuuX-fh@7=A|0)ooL|?}I2%gEl{gVw7}&9Z>mwT_;`98QB@@cLg2LhkigmDtgC+ zz#5o&ujf7Hc|X72KLG4wBZ&y27Ge&@5NDY5Tb@4b_1p@{)4TJn0z+K40=2bA!Rkn~ zXd{871>3K7Jf&nKr}D7Zpns& zRYOY35Kxibo)k2yVn|$arO%`ycARrTgH<}7Qe0t!c98(XG*~8M_CYI(&>hDtdFM#m zB-?oG{LTwl{tea>S;QN?agsoZ-UUnz@!LauGXD&=^NNXIxIHLTriKTIVUbcJSi&;N U7;R|m+R|XWG*F2Cjm6ivR!s literal 0 HcmV?d00001 diff --git a/src/chatApp/ChatGUI$2.class b/src/chatApp/ChatGUI$2.class new file mode 100644 index 0000000000000000000000000000000000000000..9c726a56ab54d4eb3acad5537847845b8dccba27 GIT binary patch literal 573 zcmZuuTTdE66#fP&3+oDatJW4V4NbTtUG>diOps!0f@o69`?5@B$TCBA2K8^5s7?CN zAK;H_dIm{Mu#?Pu=klG)ob&Ye_a6WU*vTM)1qVqFZ;)bG4hMm0jK_YH@avD$(mq4V z41_N2lCwSMt-DAg2#+B@46Xw|3gnf4-W&4JQ1GFU!W=Oylq+2qS>zn#JuG8| zAvc$fVQYBFZ_SC|QGc%y8lmI`kAJFo#QO}za(kLTxG_Gz=F<4jl$Mq2m9B#|hQfa- zZJ`a9JZ4xczxqU_%aClUKBtb_Lh{aJ)Z_7G(2J}km~X@Vt|oEFPlR=QvpIdXWr^LA zVWhN>S7+P|RNq6v&LwMS&{U(blGLhZNO!n4-;|~Sd8d*ZYes?ATw{mUkp{ymSUzu8 zLR(7EUBo(B-;(r^bZc>|wFj{3FF1FkF>KJAA_R`<-Ned_|7ph0RPVuRk63!4yVFEp gs9+08yra+rw(y=XNsIb`?WrY;BB4v^Y*{-00M%f6t^fc4 literal 0 HcmV?d00001 diff --git a/src/chatApp/ChatGUI$3.class b/src/chatApp/ChatGUI$3.class new file mode 100644 index 0000000000000000000000000000000000000000..6c7c945559eaddf3f38a80948a421263f3ea2ee4 GIT binary patch literal 455 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 Gqw3$Y9$QNQ literal 0 HcmV?d00001 diff --git a/src/chatApp/ChatGUI.java b/src/chatApp/ChatGUI.java new file mode 100644 index 0000000..a0494e6 --- /dev/null +++ b/src/chatApp/ChatGUI.java @@ -0,0 +1,167 @@ + +package chatApp ; + +@SuppressWarnings( "javadoc" ) +public class ChatGUI extends javax.swing.JFrame { + + public boolean messageReady = false ; + public String message ; + public String username ; + /* + public void giveTitle(String name) + { + this.username = name ; + setTitle("logged in as:" + name ) ; + } + */ + public String getMessageOut() + { + if( this.message.contentEquals( "" ) || this.message.contentEquals( " " ) ) + { + this.messageReady = false ; + return null ; + } + if( this.messageReady ) + { + this.messageReady = false ; + return this.message ; + } + return null ; + } + + + public void printMessage( String messageOut ) + { + messageOut = String.format( "%s\n%s", this.jTextArea1.getText(), messageOut ) ; + this.jTextArea1.setText( null ) ; + this.jTextArea1.setText( messageOut ) ; + jTextArea1.moveCaretPosition( jTextArea1.getDocument().getLength() ); + } + + + public ChatGUI() { + initComponents(); + } + + + @SuppressWarnings("unchecked") + // + private void initComponents() { + + jTextField1 = new javax.swing.JTextField(); + jButton1 = new javax.swing.JButton(); + jScrollPane2 = new javax.swing.JScrollPane(); + jTextArea1 = new javax.swing.JTextArea(); + + setDefaultCloseOperation(javax.swing.WindowConstants.HIDE_ON_CLOSE); + setTitle("logged in as: " + this.username ); + + jButton1.setText("send"); + jButton1.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + jButton1ActionPerformed(evt); + } + }); + + jTextField1.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + jTextField1ActionPerformed(evt); + } + }); + + setResizable(false); + jTextArea1.setEditable(false); + jTextArea1.setColumns(20); + jTextArea1.setRows(5); + jTextArea1.setWrapStyleWord(true); + jTextArea1.setLineWrap( true ); + jTextArea1.moveCaretPosition( jTextArea1.getDocument().getLength() ); + jScrollPane2.setViewportView(jTextArea1); + + javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); + getContentPane().setLayout(layout); + layout.setHorizontalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() + .addContainerGap(50, Short.MAX_VALUE) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false) + .addComponent(jScrollPane2) + .addGroup(layout.createSequentialGroup() + .addComponent(jTextField1, javax.swing.GroupLayout.PREFERRED_SIZE, 610, javax.swing.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(jButton1))) + .addGap(50, 50, 50)) + ); + layout.setVerticalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addContainerGap(50, Short.MAX_VALUE) + .addComponent(jScrollPane2, javax.swing.GroupLayout.PREFERRED_SIZE, 311, javax.swing.GroupLayout.PREFERRED_SIZE) + .addGap(18, 18, 18) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(jTextField1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(jButton1)) + .addGap(50, 50, 50)) + ); + + pack(); + setLocationRelativeTo(null); + }// + + private void jTextField1ActionPerformed(java.awt.event.ActionEvent evt) + { + if( this.jTextField1.getText() != null ) + { + this.message = this.jTextField1.getText() ; + this.messageReady = true ; + this.jTextField1.setText( null ) ; + } + } + + private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) { + + if( this.jTextField1.getText() != null ) + { + this.message = this.jTextField1.getText() ; + this.messageReady = true ; + this.jTextField1.setText( null ) ; + } + + } + + + public static void main(String args[]) { + + try { + for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) { + if ("Nimbus".equals(info.getName())) { + javax.swing.UIManager.setLookAndFeel(info.getClassName()); + break; + } + } + } catch (ClassNotFoundException ex) { + java.util.logging.Logger.getLogger(ChatGUI.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); + } catch (InstantiationException ex) { + java.util.logging.Logger.getLogger(ChatGUI.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); + } catch (IllegalAccessException ex) { + java.util.logging.Logger.getLogger(ChatGUI.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); + } catch (javax.swing.UnsupportedLookAndFeelException ex) { + java.util.logging.Logger.getLogger(ChatGUI.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); + } + // + + /* Create and display the form */ + java.awt.EventQueue.invokeLater(new Runnable() { + public void run() { + new ChatGUI().setVisible(true); + } + }); + } + + // Variables declaration - do not modify + private javax.swing.JButton jButton1; + private javax.swing.JScrollPane jScrollPane2; + private javax.swing.JTextArea jTextArea1; + private javax.swing.JTextField jTextField1; + // End of variables declaration +} diff --git a/src/chatApp/ChattingUI$1.class b/src/chatApp/ChattingUI$1.class new file mode 100644 index 0000000000000000000000000000000000000000..db63e6ba8497375c095d95ea7609061b15698ae4 GIT binary patch literal 585 zcmZuuYfAz_6g{Kn>b9wwy&p;#_<*)PMp2j)1!h6z_jR3gMQ3DZwBHr7m5uN2_y}qEX*U#ke+5_ zSni$uUokGRnG59BPk9~K)1G7OvlLTaAUTyUT0 z3;+G2*kFiMWs5T;Yo6fsVZX`!JEz$TJkH-v%v(A1U4HJ3!@q*<2E{4iOt?L%NW&|x zJF;bAGf*cHC{dODffUrRVu;nb(ic*ZOxC5K_NqNcDXx&C(Zs;80G3JxlZl YVGZkKBQ&lJY>hn$WXYOD7nG&-4WX=nu>b%7 literal 0 HcmV?d00001 diff --git a/src/chatApp/ChattingUI$2.class b/src/chatApp/ChattingUI$2.class new file mode 100644 index 0000000000000000000000000000000000000000..e764ea1912d5e409868288033e1c379a651ef61d GIT binary patch literal 588 zcmZuuTT22#6#mA{)onAg`(4674ch80jKIt&unT0quj`Z}>x}G7m%kNsfgbt+{ix`y z1wl11=gge*o!fWbKVIJe>>!sy3_}*;4u+9nnDjfIsr379m9!D^`tmrx&5$r1q4S&M zum1&@beRlUBF)Uakqo^oxDlqRN}V@d5*15azNk)!P-!7u@q$wV8XrN!uu zV2Z5M^jf8VWU))@Phh1NSP%50@kk~}1N$Urk^RQ6edAN5N3iv0jQ+swL81dHSVJ6h a6dJ=k7D&fwV~bcGSkhP_ZBx3aES*o=)Pd9h literal 0 HcmV?d00001 diff --git a/src/chatApp/ChattingUI$3.class b/src/chatApp/ChattingUI$3.class new file mode 100644 index 0000000000000000000000000000000000000000..a319de8466e3bebf3275b1e481ffd8ad7f9d75aa GIT binary patch literal 464 zcmZWmO-sW-5PjRkrlzsgTI*-QgNM|EJ$MpDkfK|aeb#KId&5%72 zQs`3#!>x5Ks=Nxea+g&f>9ZCEf8lXu`?iNRJ}cZCwYfHRoxLqaVwl>bxr z4lS%u(X{hTETuOmHo`vfi!C8}J0ACVbURNNQ7oxRCyXPXUx=hhF`echsYQ`<=?9^r z0k60ohJ6Q{*rI91o*;6?eQc#YJ369!$F(j)uFaLc3>CfIX-dhXM&K#M6?Rb|wMZnA zE<>9Xqf?2zDj`cE`%|ztau`<0CTZZAZ29l1J1YS=pRn$ySTx^Zr;Ow~fEVQP3KMJO YXHda9p-JLyV0#v^utR85-2x%4Uy<=zKL7v# literal 0 HcmV?d00001 diff --git a/src/chatApp/ChattingUI.class b/src/chatApp/ChattingUI.class new file mode 100644 index 0000000000000000000000000000000000000000..770f2e4d76e42f663bb33815b144d9305f884cf2 GIT binary patch literal 6665 zcmb_g33yc175+~Wc**b}A+m)f1PBlkBof>ppd?`egF}d!00pu7n0bT=GxLU-Hw3U2 zwYGID?pAE8t!<_2SD-Q=RJ&MhYxlj@Zg#c%Vi#*$?0?^TlguQ8*0#x)-23iw?pgkG z?m73V(#)zc_(;D(<@w8OP+?6pC zVY79?mU2`Hq)zcxt>Y|A5a=EcJ*E-a%So=8Bp5X}?VFp{Fs0zg_1pT*u&s7a)iDjz z1-|}XbC2DYGL6N8${OlVk; zCxfRCrHOhSb1_dadb^d18(g_GUs!M9WqEsDj$4b8t3`v31!&~S>Da5aDi_S~IL(P;lmF)2bn6(LgT)$JbS%NSf|`863swp$NH%CD`s^Ko z(uM^Ab>#UvF2IF?@o{Un*X?67L4l9wi4eCaz?J^x( zl`*CeE33@yMkZ!=#H_TrK53>5WfP^J*Xp=Jd3$*#ZKe{`e>H=Fp<^4u)CPku(W1CV&GGyHC2lnbljMu zAB-kUwLszMW*xWSErLpJ+88wll2*!T9i=IZG%Mi;{l<~_)?v_Gow72?pt0A=*h2dUNT3rQeg<85>F3!0m6ShG{QUv7z+^sBi&+tQYE0l`v#X$}C>3AF7?zz6l znYV~Bg(A3I4BZOqBzJ6`k>J&nq5u`R9}j4Fr;c~wLBXtiPskIczAYB*OSo}Q3;Nqu z1-e!X<`no=(dCXn@6qvIJj8Gi=4D}<-A2lY#mtzqK@fC-l?$WA$+%Ix*qQ=rj8ymI zeLCK+gemXsX$u6&sZ#0(b$kdPW{7cla4$wXYUH?R8Wzp-*%-E%LE|F?i314t*4{y& z_;3VAHGEXZ!#F0Ge1BSu1WHU$j_0IQ9p;OvG#;LHLKBj9NGxYFTW%yOj^K+*Z(kBzTvTtbhSo`ZMaNh1H98fI>pAY4 zLe}#=#_4;h*DE`%vhg<*{cj4^{`W+Sso>i>zJsTk3MsagZ!My4y(;HAiDwjR-xKUS zGi!t4v9$mh|BFfv;0HQ>h#xV)GnTKhQqg@XNaW&`cO4f~uBUt_w*OeiPn=lT-WKvR z7W$P>|4iZH=Yo|*aq+VH8Sb11@SKicDlXMcyU|S9(Xhv(y8eEx<2NedEK3^Uooe8B zI)1ON*oo?XvX~Ar$LKL*YtiY&gIvaF!8$dx5qc#@RqGD;nztMnjdq|+{q=S9<{ zT;+P>96b%nr3uN`4c$EM9?R~uGKq+PPuNT%q*AIh8LvyVoJI9H zlrnZS)*Q3?`c&x_WUJCWrzr9Ii#(jZCXg{I zDCFPh@A2o7^df6o6~ohXnJzO}#gIoqhsR9e$%>%sdj*BG6;E5hxSD(mga#J8ELUN`q18?x!4>x`uLtta^qk=rVmnpgC>X@9qwQiZq~ z5zNdBBl(qq!!Wh2AmEjFBlecXnf9n`IKOiDY93`LruE*`E4wiZgOHU;h0V^WDkmyC z2A^9NDfLimU1pjxDX|$Ks@g5fPTS1=*O~SXE0V4pEf@LZVp*w48|yY{7t{~w)z!H7 zLgSWlokrNUQhNpW<{Q9U=n`FHBqA|0?S!06^5qd)u(5Y<(k!w(Uro74l4pF6LjbJ37L_5>73zo;d1JOx|2dx;0tM2yHHF3Y}n; zroJVM`KoR5T6ay;BWM<6ao!Q`7l(;Sqz264(eXvKUA$A>2G#1>E3agE2Z z)DMx5y>q{{QN*w%lQ2-WpS9Jhj?OE?aty6HN~#K>h$=MZB?hU`1nzLDvQr@ zESSX?viNcqU$1IWzgc`Mi|=Of{T$_dvWgsO$OR6Ks%rJi4Lt2x^5C9OqUL_;Qhub6 zEKm6b8UIxy0rA@*i#>%FT5Ji%;9LUlJi5pEwAqDNjHR?%E1&+B(+S#P68imoDN122 zuEHgJcnRWWtizpjmWSvrM{p@~%N{&|5G$TuCe9o1G zbNz0pEbX{N< zL7Ju~+VsE-{d~ajzf#C-E<5-Cal%zR;cA}ndY-VKCtNplLWP_s=esh{)5{#6yyXP` z6l{8IMd?K|ray>zO*2}Sl~uo>!24nrFCD}r3U(OV1oacd)u7D`QT` zxT7*bnzAzW5SAAiYbY`{VZ_)eso#8D=ADrFM;s4d%%|-Ns%m9h9n2NKX#9e%p zyc^fzKJI+LQPE74pGJiy7l_Py0i)VAsR(IO%fCAQ&8|Y3EajmkvP@dpmZOw_N~2$v zJ6|FzsM-$k^Q(t8=x3{b(r&{iqyy5qvWAt?0Rm45>I1Td?c)-VOIFrMkl$Tp!b;(J RS&s_Rc7CK=dZZUM{|2vOW8VM( literal 0 HcmV?d00001 diff --git a/src/chatApp/ClientGUI$1.class b/src/chatApp/ClientGUI$1.class new file mode 100644 index 0000000000000000000000000000000000000000..081ae66d1cf50ea553db0b6fa845f7eec3be8c01 GIT binary patch literal 1440 zcmZ`(ZF3V<6n<_Ky2-L7FMWX`DoD{ZDMST?no6mqEum?PNgK5&dYj%U3(0QGZV-No ze)LPfIU_@(;|FK_l52Dl$EfhWMi!z3Y;w6mk(v$_47A)K~=LI zcCQQCXUstywm`BUTJ!|Q`;bMiALuw3!Z86`0|USIKrvXV3-MH#uNYOqMiMCtX$Qj? zVHlH4U3xqDwXOTAM$F)h>$%}Ifk8&uuE-Kr}Sa5ILt1dimtX}h6~37oU=wu5(&5jgRGyfKAu zTW+W}))xgvGu@I+N#xb_b_$bK8(HKmOgT8Ot3KZAs)tBMuGRfO>Bu=7?`jO&m@wuq zNwjehmn>X%@Byy$aaegAgo;E&)gzZwMl(fC;VDcz_z(pFr=fyC?x?bo+m8jrrsn4( z2iGtwFtnq>mF~Tnl#$Hj;acL1J?G$K%#$x)57g+vSlni{FJ>u*1p(Mt!c7ZB2e&kZ z!!PRYv1H9njk8edF(|GrJgTW?==z?GWvn__)5Il=X(g1k2kR|aQx-lENE@$)@N(Pp zr0M0-^FI97oF62tH=u|9Lige&(d-;aocFgm9EpD zYvHs0hL{Q9R#g0UtELuRJ!i)bmh^&7oxT@5-FME)iVE-f+YY|OT}Ez5ml4J?cMkVK zXBJykL3q;-*aWBOd8##EmqDNcoaQ1YA#fX!WKzE%07~w)kz7;0Lk9R8MwwO>K27l) zr5wrT_8_uTd$6+S_i!}(GZH^hFR;%4K}v9x1vW799QhZK+LwHS(GFhw9_O-8A<}0$ zILimCgGqhv-~z?b4)T#-@IFnS;_7!8H<+1H?hg#^?*Fb0bHqKt_4JJn7I*i5Eb+Xe zA-nrOm@u;pz0C0|8#!RoT11KoTx5Zlk>*Z};|eLb%C((F4l}sK`7U6V-#I@}(~~mTo|$w`34RgJ z8b#xSAK-uZ0servXIe1|PBOD+-_~CH^6lrBuK-rD8b=6W4G{z95M@YNyIehS-D0V0 z3#p!MmoqC2iGAM9w7KGS)fc>1mJG9%J-*M2wo`mc_Of&bYUo_k5kp*qZeR=s!pAa#v3LWTQ5T_65vom^W|{3k>Ezeg?y(I;tu>k9P#a zRQ5E7TvNj$4e@sm<*oGtOSsB*q>f8iGH}Hoi5Vc(6}R3r`rHyauHu@8>jtvO{WY=r zTTcn18xaRK4K9)``y~nt$v;!A4W#6)E>W5vQ95HOxh7?ooHj+7612N6i>zDMi23<(?-zEYcmuz>o(^B>Y>X^9<2Dh8twPNqEy5VZTch}e{0Fcjj91C<8X+NO= zYXKTz?GT%nFwr8^jqZBDE5U$DG}TzHG~!1AsL|?yo(2cC5?w9b%OUv G)AI{0oyMd9 literal 0 HcmV?d00001 diff --git a/src/chatApp/ClientGUI.class b/src/chatApp/ClientGUI.class new file mode 100644 index 0000000000000000000000000000000000000000..9419057e555a78c5f2d048a04bdcbce2b63a4dfb GIT binary patch literal 2154 zcmaJ@Yf}?f7=8{U*|4r$1r6S?MG6*7u~!4N)gX%Hq9nvdE$tFcVI|p3vnMLO*~|DF z+UfL5`=y_YGh{|)`UCo3`VTs7pOb{J(M)03bI!i+c`wiVyzlboKhOREa1q~|XhXY! zkcBWJ0^RrR2X;JfyBqPPwfi!s1R~Rp>!?ct?W1Fv4n)ymz_f4(mOxK#(^i*@#dtFB zNLO83nG*=-y$#0|=$+pe&g&PHO_}IKmw|2zJ?N#g=M@A@U#g7bJ8O9<5E{KRmeF^P zSm?(9Lvj2W&!vQ+-08qE#0(5tIF1udk*BtOB@5K@%8b8%zM7Nc#c!4zSEW=*+J&ho zP6@!o5Y8BQ$->JR7U*lC$%Kmf9u1AwELG8=8OPn2s>L^A;T4Qhb3>}Rn*v8h$6i#` ziJY_Ws#ZKi#T8$cT)Q9*ObB#UJ-brHQ(kUMDih;~>zceKFwny9+*roI1%adc5zpAl zo^y-kdVc!;8y4QgTLPUrssj-(?T1H90s@w267OiI7X^;hoj#|c-A+*&bh}hmO@80C za0%}*C;AP_w9z^)v>KGqa{`yO=PLrS1J6x58tMdQEL_#4iasnkO0J}5H6yQCxDHY; zstL91d8~a;gMCT9)8y+V;Xkl2j|C!7u(xE=b91)3?Wj%ed}X`J7Z_;)cFSTe;iiFG z7M681UHeR~J7Xv$a@tXOX<|upex-?_=}nSw-N0>fu5oq0g@z|hWRTTx+!45T0Eez| z6C@30KUe*!n&5y=Ri37CPuu)R6Cgm(<+AJA>^JHd__$?27fh_e)|b}=PBaG;B#(XK&gXG15wb#`ypyyMEna$!xD(%Lfx1zV4dfzi8xz#1(ka5$yx z+}46!tm~UsALV3GIjoxjFVMJiOAQHYFrCZSXP24s%B7r~b+ot6#fK{y5AMS0}~JN$iTKH(B}ff)dr|e0>^#eZOM2o+8U>3?VR#T z+X6oZfvzjoj9$0h^}O_l=RI$$T&x!?I9UQfG+j(@7iA0eAaJ$GJr$&F-9*yP=Tqz( zj=wKi2Ttk@xjy8$L$;q75(3to>&j9xZ~ML^vX2GMzL03E_ziq3aO(e6IlgPj;tX51 zjosMBm7fvrqPl;%wu7`mgwIW$PIBdtM)+I>;&*NY96q&JKRa+ATQovdaR>&_z^^+n zLc2KJK7ITr^z*QbzUdtt?LE1R)4%=uSM|-=h3Yc4xQFrVc+cRI3eG1&dzj3|c=z=R z-cE$~kf@%fD|kN`B$v1r8)!~eF$enh(3!2^)2CpZ zOWbWd#q0sP`X2%?9+STze8znnO7OWxxLai;iu)+dm-+VvzT#<+h0Ac&KdZF`U*j8m GhuD7&upT7< literal 0 HcmV?d00001 diff --git a/src/javaChat/ClientGUI.java b/src/chatApp/ClientGUI.java similarity index 57% rename from src/javaChat/ClientGUI.java rename to src/chatApp/ClientGUI.java index 3b98486..cfb7726 100644 --- a/src/javaChat/ClientGUI.java +++ b/src/chatApp/ClientGUI.java @@ -1,22 +1,18 @@ -package javaChat; +package chatApp; import java.net.* ; import java.io.* ; -/** - * - * - * @author osheas1 - * @version 1.0.0 2020-12-07 Initial implementation - * - */ -public class ClientGUI +public class ClientGUI { - + + static LoginGUI login = new LoginGUI() ; + static ChatGUI chatRoom = new ChatGUI() ; + + @SuppressWarnings( "javadoc" ) public static void main( String[] args ) throws IOException { - UserInterface login = new UserInterface() ; login.setVisible( true ); boolean done = false ; @@ -34,25 +30,43 @@ public class ClientGUI // Create communication streams DataInputStream dataStreamIn = new DataInputStream( socket.getInputStream() ) ; - DataOutputStream dataStreamOut = new DataOutputStream( socket.getOutputStream() ) ; - - BufferedReader keyboard = new BufferedReader( new InputStreamReader( System.in ) ) ; + DataOutputStream dataStreamOut = new DataOutputStream( socket.getOutputStream() ) ; dataStreamOut.writeUTF( username ) ; + chatRoom.setTitle( "logged in as: " + username ) ; + chatRoom.setVisible( true ) ; + // Thread for sending messages Thread sendMessage = new Thread(new Runnable() { @Override public void run() - { - System.out.print( "\n-= Type /help for a list of commands =-" ) ; + { while( true ) { try { - String messageOut = keyboard.readLine() ; - dataStreamOut.writeUTF( messageOut ) ; + // if-statement is only triggered if client closes window (disconnects) + if( !chatRoom.isVisible() ) + { + dataStreamOut.writeUTF( "/quit" ) ; + dataStreamIn.close() ; + dataStreamOut.close() ; + socket.close() ; + System.exit( 0 ) ; + } + // extract message information from GUI text field + if( chatRoom.messageReady ) + { + String messageOut = chatRoom.getMessageOut() ; + if( messageOut == null ) + { + continue ; + } + dataStreamOut.writeUTF( messageOut ) ; + } + System.out.print("") ; } catch( IOException x ) { @@ -73,9 +87,9 @@ public class ClientGUI while( true ) { try - { - String messageIn = dataStreamIn.readUTF() ; - System.out.printf( "%n%s\n", messageIn ) ; + { + String messageIn = dataStreamIn.readUTF() ; + chatRoom.printMessage( messageIn ) ; } catch( IOException x ) { @@ -89,9 +103,7 @@ public class ClientGUI // Begin threads sendMessage.start() ; receiveMessage.start() ; - - + } - } // end class ClientGUI \ No newline at end of file diff --git a/src/chatApp/LoginGUI$1.class b/src/chatApp/LoginGUI$1.class new file mode 100644 index 0000000000000000000000000000000000000000..2a7bd26dc8adbf0f30fa8eca68c6cb4ebcef9bb4 GIT binary patch literal 578 zcmZuuZA%+L5Pmi}bIEzeGge!*Rw)X30k3|nT0w$uaJ7Zne81eS$%e~rxLsfVme5w{ zhyDP6ROxI~3ekn#nR(`!mz}x)`}+@ok65pufT9b>#}rBowWJ@LgV89AR8Pp`@24Bv z3?mu+m zhZ@l*^D!(B&iRcw5$QH@+&S)_&_x!t0Ft4UiE zKllUsql~kNF+n%kotbBzdD)r!pWlA~c#B33DeO2%d)P&Wp%TqP(_1e6Kuv`_y&N2L z7&2xi^uZhQ2HWngi!5>uTn~A84CQ&a3jH{gQ~$$w&Lcz7M?wnoj$xh%ZCl}#3wn(_$hxkuE}C}LT`p7a7yn}R5tuq8-A{R19o_a!e6?( iPBfr`XGr52g{H8FeUfR~)pNX9BSq9nx|GhArSl7Y9DN`F literal 0 HcmV?d00001 diff --git a/src/chatApp/LoginGUI$3.class b/src/chatApp/LoginGUI$3.class new file mode 100644 index 0000000000000000000000000000000000000000..1b71f0a995ef6b72b4dfd204dd80ca419261f057 GIT binary patch literal 458 zcmZ8eOHaZ;5dM}{ilu;};*-RKhvGpFo{YxC5FaFni71JBTFM5Nlr8DD{v@MEFOq2D z5Aa7Brw}D^lbxBJnQtE7eto}x0ysd~Mhb=n)4?3l3=0GP$g4hAz3NqGAiRhneI%8P zju{NM(zcMHB(Kk-lhLT!2zpYT-_~tdFcOh<;2_6fYZ0}jmK|R(nC^W7EHD)R19$c< zERuiL^*UCHPhqv7OXxyFD$$IG9TDD414bAtYS9Yf&=Y4eX_5P#WG|^ipi|}fftIRw zDWZPRb+C>Nnqu!vB^9}Y4k$eR3j4WPYVukD! XN?0Xr60vL8oOmp3k+!LBo-~~wK_FL$ literal 0 HcmV?d00001 diff --git a/src/chatApp/LoginGUI$4.class b/src/chatApp/LoginGUI$4.class new file mode 100644 index 0000000000000000000000000000000000000000..7aaabcbea275660808b7a0a20a3e5e5586792f3b GIT binary patch literal 575 zcmZ`$TT22#6#hod)ooL=`(4C94ceeyq6k8|!B!8J@2flM$T};|bopCB7wDlM(2t7F zbRjAlm^ruaeCNzLFRxF}05(xbBZjzzgo7a@8S<@;uXp=>*NfUh9-JSQHW-q+BUEXP zqTcWDmW>qB7HkK@a2Rr3|H^kmU$))TW|y}#Wp4{9^bSM3Txr`N?Ik$p>eCGbE3rezaoOqsu{y?+X(f`5M%!DNNaWvK2;(dOYU3 z69o^N2DPZyk0dp#7*Z!(>BC6TfSe;qebqu=DXvhUg`~hR2A0d2rO=*YbcZoP z-bvDmWE+oNUAYIVKEk>si(!i1BuOBkcN+Om{PHJ0UA+TadBDgw+r_C;J8Oq)kQkWfvc&XfQk-?~gtcNk=2>zRo zA>XY>qRj{EbrTw1>kt)hGc1(?OMT<(YeD4vic8~vME9(|Rc<)QGZgoY~*WDtF|y@@5xrAH1&AQ zO-Hpo%-gwS>ERuAI&X%R~1|yw(H~;_u literal 0 HcmV?d00001 diff --git a/src/chatApp/LoginGUI$6.class b/src/chatApp/LoginGUI$6.class new file mode 100644 index 0000000000000000000000000000000000000000..1102a99c867008261bbb1214fcdbf51c3f8e03a0 GIT binary patch literal 458 zcmZ9JTT22#6vzMLZmzAXmX%$F9(q`N$hRPhAf$_623bP&w64QCvd+rRZr`hygn~Xm zA4)o-l+eJObLPzX&AH6?^y3S_392?SFf5o3mXKvw8G5f?J@jNyzv~UTpD<+4gcQj+ zgW=Y?7IGBi54_}JJg&E*K*;OIrVR^*7I_B_3JkX5NmnS*3ps=7K5MYVQ2q}d99vi= z|03&sDy28a8d0C?AS8oz}Vxxi(kHO{A!6rzs_m8=;<7eLPL2*bz+0)3@X?p UZPH-3usicu*duLIV39PfA1RwwlmGw# literal 0 HcmV?d00001 diff --git a/src/chatApp/LoginGUI.class b/src/chatApp/LoginGUI.class new file mode 100644 index 0000000000000000000000000000000000000000..ae0c7ee637c6c638849ff51fb9372d98837c45af GIT binary patch literal 6098 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 fSUIwQ@Gs +private void initComponents() + { + + + jLabel1 = new javax.swing.JLabel(); + jTextField1 = new javax.swing.JTextField(); + jLabel2 = new javax.swing.JLabel(); + jLabel3 = new javax.swing.JLabel(); + ipBox = new javax.swing.JTextField(); + + setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); + setTitle("java chat login"); + setAlwaysOnTop(true); + setResizable(false); + + jLabel1.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); + jLabel1.setText("Enter Server's IP:"); + + jTextField1.setHorizontalAlignment(javax.swing.JTextField.CENTER); + ipBox.setHorizontalAlignment(javax.swing.JTextField.CENTER); + jTextField1.setToolTipText(""); + jTextField1.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + jTextField1ActionPerformed(evt); + } + }); + + jLabel2.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); + jLabel2.setText("Enter Username:"); + + jLabel3.setFont(new java.awt.Font("Tahoma", 0, 10)); // NOI18N + jLabel3.setText("inputs must be at least one character"); + jLabel3.setEnabled(false); + + ipBox.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + jTextField2ActionPerformed(evt); + } + }); + + javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); + getContentPane().setLayout(layout); + layout.setHorizontalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addContainerGap(43, Short.MAX_VALUE) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) + .addComponent(jLabel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(jLabel2, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) + .addComponent(jTextField1, javax.swing.GroupLayout.DEFAULT_SIZE, 132, Short.MAX_VALUE) + .addComponent(ipBox)) + .addGap(40, 40, 40)) + .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() + .addComponent(jLabel3) + .addContainerGap()))) + ); + layout.setVerticalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addGap(40, 40, 40) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(jLabel1, javax.swing.GroupLayout.PREFERRED_SIZE, 22, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(ipBox, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addGap(18, 18, 18) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(jTextField1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(jLabel2)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(jLabel3) + .addContainerGap(22, Short.MAX_VALUE)) + ); + + pack(); + setLocationRelativeTo(null); + }// + + private void jTextField2ActionPerformed(java.awt.event.ActionEvent evt) + { + if( ipBox.getText().isBlank() ) + { + jLabel3.setEnabled( true ); + } + else + { + jTextField1.grabFocus(); + } + } + + private void jTextField1ActionPerformed(java.awt.event.ActionEvent evt) + { + if( jTextField1.getText().isBlank() || ipBox.getText().isBlank() ) + { + jLabel3.setEnabled( true ); + } + else + { + this.ip = ipBox.getText() ; + this.username = jTextField1.getText() ; + this.done = true ; + dispose(); + } + } +/** + * @param args the command line arguments + */ +public static void main(String args[]) { + try { + for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) { + if ("Nimbus".equals(info.getName())) { + javax.swing.UIManager.setLookAndFeel(info.getClassName()); + break; + } + } + } catch (ClassNotFoundException ex) { + java.util.logging.Logger.getLogger(LoginGUI.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); + } catch (InstantiationException ex) { + java.util.logging.Logger.getLogger(LoginGUI.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); + } catch (IllegalAccessException ex) { + java.util.logging.Logger.getLogger(LoginGUI.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); + } catch (javax.swing.UnsupportedLookAndFeelException ex) { + java.util.logging.Logger.getLogger(LoginGUI.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); + } + // + + /* Create and display the form */ + java.awt.EventQueue.invokeLater(new Runnable() { + public void run() { + new LoginGUI().setVisible(true); + } + }); +} + + + +// Variables declaration - do not modify +private javax.swing.JLabel jLabel1; +private javax.swing.JLabel jLabel2; +private javax.swing.JLabel jLabel3; +private javax.swing.JTextField jTextField1; +private javax.swing.JTextField ipBox; +// End of variables declaration +} diff --git a/src/chatApp/loginDEMO$1.class b/src/chatApp/loginDEMO$1.class new file mode 100644 index 0000000000000000000000000000000000000000..1dd8a392a2f27fe337d7f9007360294a8b9e8dc1 GIT binary patch literal 583 zcmZuu*-8U36g{c6(~e`U`@SFwZ3Rc4#05cWMWHTW>HBmV+mvZiCUN;K!3BKq1NY6^K+K0ROAWJsBo&?_4h zuKbDbx=17A!1XWyk0I9%ZUR3FWYa&dw|QtNeNRYX_8I!}g_?^jh8*NP3}b|0_)kHG znRb=mnIplY#^yn2gpwCLzEW|AHy9T4m0pM7*7*E}OXGh+%2wYk)Eta4%>N6i2yM9J zF~daupN|x349SveaE76Zko@erQ|ECts7KZl{2s);RM&CHkAw|pzxi6XtqEV2VWhN> z%~Nh#s^MYYvXiw;lvJmyB#o;X(q~+oW2K2E??lpYr6|yvYb?=X(jdygayh#k+E;?^ z0LIBXLE19e*5ek}9>I#waPG-sn4~vF64;`53L{_m)h~Re_yD%{gux%U+bgt94R?^l bG^HjmgISVETGt#FdY&v6NxD?dwx#m{R>ywR literal 0 HcmV?d00001 diff --git a/src/chatApp/loginDEMO$2.class b/src/chatApp/loginDEMO$2.class new file mode 100644 index 0000000000000000000000000000000000000000..887c167b6b99884530e0af66451faabc681a8069 GIT binary patch literal 461 zcmZWmOH0E*5dOA_rlzsARqM0h!9(i7f;UkFsTGAjz)C?qrRmacNjD|C@h1A0yjW21 z2l%7JNek`4g`Jt5nQtE7{``J^12{#=Mhb=n)4>v!8PqiNA@2`7eK{Uig0L^-RjtvoVZlg5#({%X23v965lVCe&S1Ka2{Om9{ttP0 zVj<5^SoFP%rSxXFYS<%qt}Y~R#-lEe?q>lbiY4`EhjHZdYmxNG&SyDJN)f6i{UB6A z_8VLe!k&X2?9wbFPY|}~KGhd3+d87WvvP+a-Q-H&go+k-Zl&Z=HSm<;3J1s%Rm2eS zmZD2^(W^jKi8M<*M-#AjGH6edNf>w`xiL?5rzHUA3)aH~E9M961tR$i;1wCX!Nexn YDHO3q+9YbXu{ZTt*e7jM-7IN3fAGgxE&u=k literal 0 HcmV?d00001 diff --git a/src/chatApp/loginDEMO.class b/src/chatApp/loginDEMO.class new file mode 100644 index 0000000000000000000000000000000000000000..76e81690bff09a371bad44459484431d00ba585d GIT binary patch literal 5624 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 a($ff*uuL{eLtDXGKa)h7tV`uAEv+w=zJ>h& literal 0 HcmV?d00001 diff --git a/src/demonstration/ChatDEMO$2.class b/src/demonstration/ChatDEMO$2.class new file mode 100644 index 0000000000000000000000000000000000000000..bd4defef46fbb42c6e7269dc64d5d039d0dfa588 GIT binary patch literal 602 zcmZ`$U279T6g@YM*<`y-)2g+$)|OHsNx@a$q#~4UibC27mb_20*Ji?IrtD0se@pNK zeDDYOqr^M0B1jyVxgT@p+%xz7`1$QSfaln0pn`=6)daUtBdq5#@ zot*7GBh>s@yS*oZ>CXop#HgbYAx^M}gwUF(Yn2wtT%>2i36H#RywFDbmxP6OXAq-_ zcJ`VY}U*l~M0~%GYds`Ww;<{y}FD z;SOPIE~KxWXTv37v;Ds>bq0iLW^*Pi_qE~EtLc!-b2ThNM*XWMervDF5g+Stz4WJh zk3)HZ_spoUPMeDp_G6nT*a~fGhL&V@dTEVFc7*yVJO9c$=~wdFh`_8+&auOe%&HE; zZBVNf<|QMn$X>)<$*zgFD{;ug-Tlv??pH(~B_iCDvnCcelye=cH~2?4_(t~=X#WeA l{=(xKQ6>eCP{n@r0z4yw d7ueV&KZPQ;2yK$Lgxy)h!5*PYeRG6#egI=fTulG~ literal 0 HcmV?d00001 diff --git a/src/demonstration/ChatDEMO.class b/src/demonstration/ChatDEMO.class new file mode 100644 index 0000000000000000000000000000000000000000..abe78578ee49ab4034b71dd48ff8d5ede64880b2 GIT binary patch literal 6683 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 LN4lh2dQtgr3(sn9 literal 0 HcmV?d00001 diff --git a/src/demonstration/ChatDEMO.java b/src/demonstration/ChatDEMO.java new file mode 100644 index 0000000..8156e62 --- /dev/null +++ b/src/demonstration/ChatDEMO.java @@ -0,0 +1,166 @@ +package demonstration; + +@SuppressWarnings( "javadoc" ) +public class ChatDEMO extends javax.swing.JFrame { + + public boolean messageReady = false ; + public String message ; + public String username ; + /* + public void giveTitle(String name) + { + this.username = name ; + setTitle("logged in as:" + name ) ; + } + */ + public String getMessageOut() + { + if( this.message.contentEquals( "" ) || this.message.contentEquals( " " ) ) + { + this.messageReady = false ; + return null ; + } + if( this.messageReady ) + { + this.messageReady = false ; + return this.message ; + } + return null ; + } + + + public void printMessage( String messageOut ) + { + messageOut = String.format( "%s\n%s", this.jTextArea1.getText(), messageOut ) ; + this.jTextArea1.setText( null ) ; + this.jTextArea1.setText( messageOut ) ; + jTextArea1.moveCaretPosition( jTextArea1.getDocument().getLength() ); + } + + + public ChatDEMO() { + initComponents(); + } + + + @SuppressWarnings("unchecked") + // + private void initComponents() { + + jTextField1 = new javax.swing.JTextField(); + jButton1 = new javax.swing.JButton(); + jScrollPane2 = new javax.swing.JScrollPane(); + jTextArea1 = new javax.swing.JTextArea(); + + setDefaultCloseOperation(javax.swing.WindowConstants.HIDE_ON_CLOSE); + setTitle("logged in as: " + this.username ); + + jButton1.setText("send"); + jButton1.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + jButton1ActionPerformed(evt); + } + }); + + jTextField1.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + jTextField1ActionPerformed(evt); + } + }); + + setResizable(false); + jTextArea1.setEditable(false); + jTextArea1.setColumns(20); + jTextArea1.setRows(5); + jTextArea1.setWrapStyleWord(true); + jTextArea1.setLineWrap( true ); + jTextArea1.moveCaretPosition( jTextArea1.getDocument().getLength() ); + jScrollPane2.setViewportView(jTextArea1); + + javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); + getContentPane().setLayout(layout); + layout.setHorizontalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() + .addContainerGap(50, Short.MAX_VALUE) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false) + .addComponent(jScrollPane2) + .addGroup(layout.createSequentialGroup() + .addComponent(jTextField1, javax.swing.GroupLayout.PREFERRED_SIZE, 610, javax.swing.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(jButton1))) + .addGap(50, 50, 50)) + ); + layout.setVerticalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addContainerGap(50, Short.MAX_VALUE) + .addComponent(jScrollPane2, javax.swing.GroupLayout.PREFERRED_SIZE, 311, javax.swing.GroupLayout.PREFERRED_SIZE) + .addGap(18, 18, 18) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(jTextField1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(jButton1)) + .addGap(50, 50, 50)) + ); + + pack(); + setLocationRelativeTo(null); + }// + + private void jTextField1ActionPerformed(java.awt.event.ActionEvent evt) + { + if( this.jTextField1.getText() != null ) + { + this.message = this.jTextField1.getText() ; + this.messageReady = true ; + this.jTextField1.setText( null ) ; + } + } + + private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) { + + if( this.jTextField1.getText() != null ) + { + this.message = this.jTextField1.getText() ; + this.messageReady = true ; + this.jTextField1.setText( null ) ; + } + + } + + + public static void main(String args[]) { + + try { + for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) { + if ("Nimbus".equals(info.getName())) { + javax.swing.UIManager.setLookAndFeel(info.getClassName()); + break; + } + } + } catch (ClassNotFoundException ex) { + java.util.logging.Logger.getLogger(ChatDEMO.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); + } catch (InstantiationException ex) { + java.util.logging.Logger.getLogger(ChatDEMO.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); + } catch (IllegalAccessException ex) { + java.util.logging.Logger.getLogger(ChatDEMO.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); + } catch (javax.swing.UnsupportedLookAndFeelException ex) { + java.util.logging.Logger.getLogger(ChatDEMO.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); + } + // + + /* Create and display the form */ + java.awt.EventQueue.invokeLater(new Runnable() { + public void run() { + new ChatDEMO().setVisible(true); + } + }); + } + + // Variables declaration - do not modify + private javax.swing.JButton jButton1; + private javax.swing.JScrollPane jScrollPane2; + private javax.swing.JTextArea jTextArea1; + private javax.swing.JTextField jTextField1; + // End of variables declaration +} diff --git a/src/demonstration/ClientDEMO$1.class b/src/demonstration/ClientDEMO$1.class new file mode 100644 index 0000000000000000000000000000000000000000..85074bfc66d96a552d5e4cee7031c649355a09f2 GIT binary patch literal 1469 zcmZ`(ZF3V<6n<_Kx=GlYm$rc-Dr(U*Da029N`NA5Ljy^JNr_q%y-n_vg=Dv8HwZsP zKl-KLoROi?@q;sda)w{Q?{FOJb8mnq0@=x)z4x5woO7RZ&VBsv?|%STfQ(`cAq!y} z2QV&hq@_BZ>jzyKIG&qdYCFmemRBm(*$)Mh_hfsvB?DOxx=MDcy?}u79eGdY9WTF3 z1-G_)!9ZQmt|K<0hzTS{p(R&fW&~MsM}fAD3A`o{(?H*A-c<~i96($Zbu|KtO8B65L(_J?GyjQOCw9gtWf)xS8 za0ROtN;a-)3MZePd&rV!-qtt^)6jZRo!%<(R~)*AKjBWckZmXy6|k4iVALfEgN6s7DIQW z!w~7r%@+%yQ;V!AKUnpAR>3a0uIeterSB^r$2i^z2wX=fkCn*m0kq`Zbk7)V`XMezq!JIGW{=)dq-k;hqN8CePN-g(M z+}ZoN%ymUWcJ_WUVHO$s8vCzic1>0uQOt~TiL7S|1WNs_MYKS*2n{BKxSEvmx!l8P~!-J}fjp85*kn4L7f MrHqjY%>aM@0Wz3iX8-^I literal 0 HcmV?d00001 diff --git a/src/demonstration/ClientDEMO$2.class b/src/demonstration/ClientDEMO$2.class new file mode 100644 index 0000000000000000000000000000000000000000..897368568426358c55d06017f5354c471bde6854 GIT binary patch literal 913 zcmZ`%+int36kP|9f$3BbD7}icqH@uq_1e_EYP(WzWH%V%hrFNda>bj<5qwaU42!h`e#lFfUD_slRSrjL?A+23K~#foUWJ!J^y@@*X#5z`Pia0v;9`EzI)G)mol(b{21)2EVFCM8YTRK88oWxGqLSk01RcQoh- zr!|fXIwM;1tY1)_4<}Z=X^$LJ>{uRk?CeU`z0_o>NV9Ldw2!(_`*zpB13aW818xyn zI`?wgcxWTL!d1^~m%1^kQVOTs=dLSUtkRK2z)%2-$Gt4D0j_lLVUdEy0-J%?UnJ_y~4_+1dvriziq-KK)rEc{TV2+2hk6eq;;@ zT2R2}%0MHoS5(bw#9)%=4U*t=Y#l6K KCwi}FdVT}F57Qw4 literal 0 HcmV?d00001 diff --git a/src/demonstration/ClientDEMO.class b/src/demonstration/ClientDEMO.class new file mode 100644 index 0000000000000000000000000000000000000000..4b0c46c790061d031b21a973be5345f4d3183e4c GIT binary patch literal 2208 zcmaJ@ZBr9h6n-uw*|07kC}{8vELyN)ihVVqwl#oafmjn`qn36_ZeboriBBr1dbME*>inWwUy(! z@l?r?u9}`%NDFk8ycNftrd%L4->x?wh^Uq{(Su$C2QBoWU*O39=n0s`EiFn~eE==jr~O9^AV(}kmm85pu~49DA2%53;bmZ{~{nApI4kgVgyZ&V#u zWmHw#2xR_bm&T@iud!-&UD6+QfxcTP5_Iz`NS>6|!j8bDNHaI)P~mGrCmK2USPOTiIDn z)vFe+VU8~gtG2r7d93}>JzPvtq8Xd)XG6SaVIB(vqHM3pl;;*~b=y&^-1*9Ol`n91 zAI$fyX&N^Syl>&A4r;KS*H3*iFw#2fsFF01){Sthjj!2NQnF~^w!qLH3p<@QI%y(@ zyvFE`z|~!hbm7}@+M)X%N+cVCU5*9h&ElT6`JrY-3ukZET-Rn3QpdnY&x`A#i6z+D z#5tBP-de5FEL`i@X+fgxVs@h<_fc;}t}*YE ztz>SRNZF-QhE2uU_yvLBU|*5NVaFY|{lu^ku;yG>R#PS0_a&kITHwqxiS8G_fo}y) zK3|oyy^$(GO$kC7i@E{D;LK|YV*6ozn?U%UyN zNuAEo&k|31f;JPomM RIj;I=sj=WIe1q>0`wzBSHD3S# literal 0 HcmV?d00001 diff --git a/src/demonstration/ClientDEMO.java b/src/demonstration/ClientDEMO.java new file mode 100644 index 0000000..dbd91b3 --- /dev/null +++ b/src/demonstration/ClientDEMO.java @@ -0,0 +1,110 @@ +package demonstration; + +import java.net.* ; +import java.io.* ; + +@SuppressWarnings( "javadoc" ) +public class ClientDEMO + { + + static LoginDEMO loginDemo = new LoginDEMO() ; + static ChatDEMO chatRoom = new ChatDEMO() ; + + @SuppressWarnings( "javadoc" ) + public static void main( String[] args ) throws IOException + { + + loginDemo.setVisible( true ); + + boolean done = false ; + while( !done ) + { + done = loginDemo.isDone() ; + System.out.print(""); + } + + String ip = loginDemo.getIP() ; + String username = loginDemo.getUsername() ; + + // Open your connection to a server, at port 6789 + Socket socket = new Socket( ip , 6789 ) ; + + // Create communication streams + DataInputStream dataStreamIn = new DataInputStream( socket.getInputStream() ) ; + DataOutputStream dataStreamOut = new DataOutputStream( socket.getOutputStream() ) ; + + dataStreamOut.writeUTF( username ) ; + + chatRoom.setTitle( "logged in as: " + username ) ; + chatRoom.setVisible( true ) ; + + // Thread for sending messages + Thread sendMessage = new Thread(new Runnable() + { + @Override + public void run() + { + while( true ) + { + try + { + // if-statement is only triggered if client closes window (disconnects) + if( !chatRoom.isVisible() ) + { + dataStreamOut.writeUTF( "/quit" ) ; + dataStreamIn.close() ; + dataStreamOut.close() ; + socket.close() ; + System.exit( 0 ) ; + } + // extract message information from GUI text field + if( chatRoom.messageReady ) + { + String messageOut = chatRoom.getMessageOut() ; + if( messageOut == null ) + { + continue ; + } + dataStreamOut.writeUTF( messageOut ) ; + } + System.out.print("") ; + } + catch( IOException x ) + { + x.printStackTrace() ; + System.exit( 0 ) ; + } + } + } + }) ; + + // Thread for receiving messages + Thread receiveMessage = new Thread( new Runnable() + { + + @Override + public void run() + { + while( true ) + { + try + { + String messageIn = dataStreamIn.readUTF() ; + chatRoom.printMessage( messageIn ) ; + } + catch( IOException x ) + { + x.printStackTrace() ; + System.exit( 0 ) ; + } + } + } + }); + + // Begin threads + sendMessage.start() ; + receiveMessage.start() ; + + } + } + // end class ClientGUI \ No newline at end of file diff --git a/src/demonstration/LoginDEMO$1.class b/src/demonstration/LoginDEMO$1.class new file mode 100644 index 0000000000000000000000000000000000000000..19951a3198647145d32ebe3a3a8b07ae76c3acd5 GIT binary patch literal 607 zcmZ`$T}vB56g@Yl*<{_uXlq-oRw)Wegl>J5h)~i<3#%3?dEaDjUU=N!$lrR^d9N`fvgq4gZMq5{;P8l61W~B7{ z-qFd{E}`Pil-+tOpkxNB6QYV*fH1;5B0^)FUZioJ>QQ_$81v9ck$t6=J0Q$8Tm2Aq zECgsoSi}Z14O4wSOVFl9R|QYek~>o$vxn5BTi|e69T*wDS{> m|H8v*p^h}%M;R;fw1ic>lvoz)*6?bYsbfQ8DCK-x8NUI&5s7I4 literal 0 HcmV?d00001 diff --git a/src/demonstration/LoginDEMO$2.class b/src/demonstration/LoginDEMO$2.class new file mode 100644 index 0000000000000000000000000000000000000000..339afeb5c86eef6c1fbc006591d392c8eaa543de GIT binary patch literal 473 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 + private void initComponents() { + + jPasswordField1 = new javax.swing.JPasswordField(); + jLabel1 = new javax.swing.JLabel(); + jTextField1 = new javax.swing.JTextField(); + jLabel2 = new javax.swing.JLabel(); + jLabel3 = new javax.swing.JLabel(); + + setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); + setTitle("java chat login DEMO"); + setAlwaysOnTop(true); + setResizable(false); + + jPasswordField1.setEditable(false); + jPasswordField1.setHorizontalAlignment(javax.swing.JTextField.CENTER); + jPasswordField1.setText("12.34.56.78"); + + jLabel1.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); + jLabel1.setText("Enter Server's IP:"); + + jTextField1.setHorizontalAlignment(javax.swing.JTextField.CENTER); + jTextField1.setToolTipText(""); + jTextField1.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + jTextField1ActionPerformed(evt); + } + }); + + jLabel2.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); + jLabel2.setText("Enter Username:"); + + jLabel3.setFont(new java.awt.Font("Tahoma", 0, 10)); // NOI18N + jLabel3.setText("username must be at least one character"); + jLabel3.setEnabled(false); + + javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); + getContentPane().setLayout(layout); + layout.setHorizontalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addContainerGap(43, Short.MAX_VALUE) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) + .addComponent(jLabel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(jLabel2, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) + .addComponent(jTextField1) + .addComponent(jPasswordField1, javax.swing.GroupLayout.DEFAULT_SIZE, 132, Short.MAX_VALUE)) + .addGap(40, 40, 40)) + .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() + .addComponent(jLabel3) + .addContainerGap()))) + ); + layout.setVerticalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addGap(40, 40, 40) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(jPasswordField1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(jLabel1, javax.swing.GroupLayout.PREFERRED_SIZE, 22, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addGap(18, 18, 18) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(jTextField1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(jLabel2)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(jLabel3) + .addContainerGap(22, Short.MAX_VALUE)) + ); + + pack(); + setLocationRelativeTo(null); + }// + + private void jTextField1ActionPerformed(java.awt.event.ActionEvent evt) { + this.ip = "74.69.251.12" ; + if( jTextField1.getText().isBlank() ) + { + jLabel3.setEnabled( true ); + } + else + { + this.username = jTextField1.getText() ; + this.done = true ; + dispose(); + } + } + + public static void main(String args[]) { + try { + for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) { + if ("Nimbus".equals(info.getName())) { + javax.swing.UIManager.setLookAndFeel(info.getClassName()); + break; + } + } + } catch (ClassNotFoundException ex) { + java.util.logging.Logger.getLogger(LoginDEMO.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); + } catch (InstantiationException ex) { + java.util.logging.Logger.getLogger(LoginDEMO.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); + } catch (IllegalAccessException ex) { + java.util.logging.Logger.getLogger(LoginDEMO.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); + } catch (javax.swing.UnsupportedLookAndFeelException ex) { + java.util.logging.Logger.getLogger(LoginDEMO.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); + } + // + + /* Create and display the form */ + java.awt.EventQueue.invokeLater(new Runnable() { + public void run() { + new LoginDEMO().setVisible(true); + } + }); + } + + // Variables declaration - do not modify + private javax.swing.JLabel jLabel1; + private javax.swing.JLabel jLabel2; + private javax.swing.JLabel jLabel3; + private javax.swing.JPasswordField jPasswordField1; + private javax.swing.JTextField jTextField1; + // End of variables declaration +} diff --git a/src/javaChat/ChatServer.java b/src/javaChat/ChatServer.java deleted file mode 100644 index 22c5575..0000000 --- a/src/javaChat/ChatServer.java +++ /dev/null @@ -1,237 +0,0 @@ -package javaChat; - -import java.net.* ; -import java.util.* ; -import java.io.* ; - -public class ChatServer - { - - // List of all active users in Server - static ArrayList userList = new ArrayList<>() ; - - /** - * Accepts Client requests to join chat server, and - * creates new thread for each individual client. - * - * @param args - * @throws IOException - */ - public static void main( String[] args ) throws IOException - { - - // Register service on port 6789 - ServerSocket serverSocket = new ServerSocket( 6789 ) ; - Socket socket = null ; - - System.out.println( "\nServer established. Awaiting connections..." ) ; - - // Accept client requests - while( true ) - { - socket = serverSocket.accept() ; - - DataOutputStream dataStreamOut = new DataOutputStream( socket.getOutputStream() ) ; - DataInputStream dataStreamIn = new DataInputStream ( socket.getInputStream() ) ; - - System.out.println( "\nClient connection detected, requesting username..." ) ; - String username = dataStreamIn.readUTF() ; - - ClientHandler handle = new ClientHandler( socket, username, dataStreamOut, dataStreamIn ) ; - - System.out.println( "\nCreating new thread...\n" ) ; - Thread thread = new Thread( handle ) ; - - userList.add( handle ) ; - - thread.start() ; - - } - } - - } - // end class ChatClient - - - - - // This class manages the actual messages being sent around - @SuppressWarnings( "javadoc" ) - class ClientHandler implements Runnable - { - - Socket socket ; - String username ; - final DataOutputStream dataStreamOut ; - final DataInputStream dataStreamIn ; - boolean loggedIn ; - private ArrayList userList ; - - - /** - * Constructor - * @param s : client socket - * @param user : client's user-name - * @param dos : data stream to client - * @param dis : data stream from client - */ - public ClientHandler( Socket s, String user, - DataOutputStream dos, - DataInputStream dis ) - { - this.username = user ; - this.socket = s ; - this.dataStreamOut = dos ; - this.dataStreamIn = dis ; - this.loggedIn = true ; - - } - - @Override - public void run() - { - - // Note the connection of the new user - String announcement = String.format( "-= User \"%s\" has successfully connected =-\n", this.username ) ; - System.out.println( announcement ) ; - - // Distribute announcement to entire server - distributeAll( announcement ) ; - - // Message management - String message = "" ; - while( true ) - { - // Read incoming messages - try - { - message = this.dataStreamIn.readUTF() ; - } - catch ( IOException x ) - { - x.printStackTrace() ; - } - - // Check message for user commands, returns TRUE is user quits - if( commands(message, this) ) - { - break ; - } - - // Print the message server-side - message = String.format( "%s: %s", this.username, message ) ; - System.out.println( message ) ; - - // Distribute the message to all users - sendMessage( message ) ; - // end try - - } - - try - { - this.loggedIn = false ; - this.socket.close() ; - } - catch( IOException x ) - { - x.printStackTrace() ; - } - } - - - // This method manages the usage of user-commands - public boolean commands(String message, ClientHandler user) - { - String[] commands = new String[] {"/help", "/quit", "/userlist"} ; - - try { - - // Quit command terminates connection, with an announcement - if( message.equals( "/quit" )) - { - String announcement = String.format( "\n-= \"%s\" has disconnected =- \n", user.username ) ; - System.out.println( announcement ) ; - distributeAll( announcement ) ; - return true ; - } - - if( message.equals( "/userlist" ) ) - { - user.dataStreamOut.writeUTF( "Current list of users in the server: " ) ; - for( ClientHandler users : ChatServer.userList ) - { - if( !users.loggedIn ) - { - continue ; - } - - user.dataStreamOut.writeUTF( users.username ) ; - - } - } - - if( message.contentEquals( "/help" ) ) - { - user.dataStreamOut.writeUTF( "\nAll available commands: " ); - for(int i = 0; i < commands.length; i++ ) - { - user.dataStreamOut.writeUTF( commands[i] ); - } - - user.dataStreamOut.writeUTF( "\n" ) ; - } - } - - catch( IOException x ) - { - System.out.println( x ) ; - } - - return false ; - } - - - // Convenience method to send messages (but not to the user that's sending the message) - private void sendMessage(String message) - { - try - { - for( ClientHandler users : ChatServer.userList ) - { - if( !users.loggedIn || users.equals( this ) ) - { - continue ; - } - users.dataStreamOut.writeUTF( "> " + message ) ; - } - } - catch ( IOException x ) - { - x.printStackTrace() ; - } - } - - - // Convenience method to distribute messages to all clients (announcements) - private void distributeAll(String message) - { - try - { - for( ClientHandler users : ChatServer.userList ) - { - if( !users.loggedIn ) - { - continue ; - } - users.dataStreamOut.writeUTF( message ) ; - } - } - catch ( IOException x ) - { - x.printStackTrace() ; - } - } - - } - // end class ClientHandler \ No newline at end of file diff --git a/src/javaChat/UserInterface.java b/src/javaChat/UserInterface.java deleted file mode 100644 index 1d8f906..0000000 --- a/src/javaChat/UserInterface.java +++ /dev/null @@ -1,288 +0,0 @@ -package javaChat; - -import java.awt.* ; -import java.util.* ; -import javax.swing.* ; - -public class UserInterface extends javax.swing.JFrame { - - - String ip ; - String username ; - boolean done ; - -/** - * Creates new form loginFrame - */ -public UserInterface() { - initComponents(); -} - -/** - * This method is called from within the constructor to initialize the form. - * WARNING: Do NOT modify this code. The content of this method is always - * regenerated by the Form Editor. - */ -@SuppressWarnings("unchecked") -// -private void initComponents() - { - - jTextField1 = new javax.swing.JTextField(); - jLabel1 = new javax.swing.JLabel(); - jLabel2 = new javax.swing.JLabel(); - jTextField2 = new javax.swing.JTextField(); - jButton1 = new javax.swing.JButton(); - jSlider1 = new javax.swing.JSlider(); - jSlider2 = new javax.swing.JSlider(); - jSlider3 = new javax.swing.JSlider(); - jSlider4 = new javax.swing.JSlider(); - - setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); - setTitle("Java Chat"); - setAlwaysOnTop(true); - setBackground(new java.awt.Color(255, 255, 255)); - setForeground(java.awt.Color.white); - setResizable(false); - - jTextField1.setEditable(false); - jTextField1.setHorizontalAlignment(javax.swing.JTextField.CENTER); - jTextField1.setText("0.0.0.0"); - - jLabel1.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); - jLabel1.setText("Enter Server's I.P. Address:"); - - jLabel2.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); - jLabel2.setText("Enter your desired username:"); - - jTextField2.setHorizontalAlignment(javax.swing.JTextField.CENTER); - jTextField2.setActionCommand(""); - - jButton1.setText("Connect"); - jButton1.setCursor(new java.awt.Cursor(java.awt.Cursor.DEFAULT_CURSOR)); - jButton1.setOpaque(false); - jButton1.addMouseListener(new java.awt.event.MouseAdapter() { - public void mouseClicked(java.awt.event.MouseEvent evt) { - jButton1MouseClicked(evt); - } - }); - - jSlider1.setMaximum(999); - jSlider1.setOrientation(javax.swing.JSlider.VERTICAL); - jSlider1.setValue(0); - jSlider1.addChangeListener(new javax.swing.event.ChangeListener() { - public void stateChanged(javax.swing.event.ChangeEvent evt) { - jSlider1StateChanged(evt); - } - }); - - jSlider2.setMaximum(999); - jSlider2.setOrientation(javax.swing.JSlider.VERTICAL); - jSlider2.setValue(0); - jSlider2.addChangeListener(new javax.swing.event.ChangeListener() { - public void stateChanged(javax.swing.event.ChangeEvent evt) { - jSlider2StateChanged(evt); - } - }); - - jSlider3.setMaximum(999); - jSlider3.setOrientation(javax.swing.JSlider.VERTICAL); - jSlider3.setValue(0); - jSlider3.addChangeListener(new javax.swing.event.ChangeListener() { - public void stateChanged(javax.swing.event.ChangeEvent evt) { - jSlider3StateChanged(evt); - } - }); - - jSlider4.setMaximum(999); - jSlider4.setOrientation(javax.swing.JSlider.VERTICAL); - jSlider4.setValue(0); - jSlider4.addChangeListener(new javax.swing.event.ChangeListener() { - public void stateChanged(javax.swing.event.ChangeEvent evt) { - jSlider4StateChanged(evt); - } - }); - - javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); - getContentPane().setLayout(layout); - layout.setHorizontalGroup( - layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(layout.createSequentialGroup() - .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(layout.createSequentialGroup() - .addGap(60, 60, 60) - .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) - .addGroup(layout.createSequentialGroup() - .addComponent(jLabel2, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addGap(18, 18, 18) - .addComponent(jTextField2, javax.swing.GroupLayout.PREFERRED_SIZE, 137, javax.swing.GroupLayout.PREFERRED_SIZE)) - .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() - .addComponent(jLabel1, javax.swing.GroupLayout.PREFERRED_SIZE, 160, javax.swing.GroupLayout.PREFERRED_SIZE) - .addGap(18, 18, 18) - .addComponent(jTextField1, javax.swing.GroupLayout.PREFERRED_SIZE, 137, javax.swing.GroupLayout.PREFERRED_SIZE)))) - .addGroup(layout.createSequentialGroup() - .addGap(162, 162, 162) - .addComponent(jButton1, javax.swing.GroupLayout.PREFERRED_SIZE, 81, javax.swing.GroupLayout.PREFERRED_SIZE))) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 60, Short.MAX_VALUE) - .addComponent(jSlider1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) - .addComponent(jSlider2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) - .addComponent(jSlider3, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) - .addComponent(jSlider4, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) - .addGap(56, 56, 56)) - ); - layout.setVerticalGroup( - layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(layout.createSequentialGroup() - .addGap(24, 24, 24) - .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) - .addGroup(layout.createSequentialGroup() - .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) - .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) - .addComponent(jSlider3, javax.swing.GroupLayout.PREFERRED_SIZE, 0, Short.MAX_VALUE) - .addComponent(jSlider2, javax.swing.GroupLayout.PREFERRED_SIZE, 0, Short.MAX_VALUE) - .addComponent(jSlider1, javax.swing.GroupLayout.PREFERRED_SIZE, 147, javax.swing.GroupLayout.PREFERRED_SIZE)) - .addComponent(jSlider4, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.PREFERRED_SIZE, 147, javax.swing.GroupLayout.PREFERRED_SIZE)) - .addContainerGap(40, Short.MAX_VALUE)) - .addGroup(layout.createSequentialGroup() - .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) - .addComponent(jTextField1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) - .addComponent(jLabel1)) - .addGap(36, 36, 36) - .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) - .addComponent(jTextField2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) - .addComponent(jLabel2)) - .addGap(28, 28, 28) - .addComponent(jButton1) - .addGap(30, 30, 30)))) - ); - - pack(); - }// - -private void jButton1MouseClicked(java.awt.event.MouseEvent evt) - { - ip = jTextField1.getText() ; - username = jTextField2.getText() ; - //System.out.printf( "IP: %s \nUsername: %s\n", ip, username ) ; - - - done = true ; - setVisible( false ) ; - dispose() ; - - } - -private void jSlider1StateChanged(javax.swing.event.ChangeEvent evt) - { - Integer a = jSlider1.getValue() ; - Integer b = jSlider2.getValue() ; - Integer c = jSlider3.getValue() ; - Integer d = jSlider4.getValue() ; - - String ip = String.format("%s.%s.%s.%s", a, b, c, d) ; - - jTextField1.setText( ip.toString() ) ; - } - -private void jSlider2StateChanged(javax.swing.event.ChangeEvent evt) - { - Integer a = jSlider1.getValue() ; - Integer b = jSlider2.getValue() ; - Integer c = jSlider3.getValue() ; - Integer d = jSlider4.getValue() ; - - String ip = String.format("%s.%s.%s.%s", a, b, c, d) ; - - jTextField1.setText( ip.toString() ) ; - } - -private void jSlider3StateChanged(javax.swing.event.ChangeEvent evt) - { - Integer a = jSlider1.getValue() ; - Integer b = jSlider2.getValue() ; - Integer c = jSlider3.getValue() ; - Integer d = jSlider4.getValue() ; - - String ip = String.format("%s.%s.%s.%s", a, b, c, d) ; - - jTextField1.setText( ip.toString() ) ; - } - -private void jSlider4StateChanged(javax.swing.event.ChangeEvent evt) - { - Integer a = jSlider1.getValue() ; - Integer b = jSlider2.getValue() ; - Integer c = jSlider3.getValue() ; - Integer d = jSlider4.getValue() ; - - String ip = String.format("%s.%s.%s.%s", a, b, c, d) ; - - jTextField1.setText( ip.toString() ) ; - } - -/** - * @param args the command line arguments - */ -public static void main(String args[]) { - /* Set the Nimbus look and feel */ - // - /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel. - * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html - */ - try { - for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) { - if ("Nimbus".equals(info.getName())) { - javax.swing.UIManager.setLookAndFeel(info.getClassName()); - break; - } - } - } catch (ClassNotFoundException ex) { - java.util.logging.Logger.getLogger(UserInterface.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); - } catch (InstantiationException ex) { - java.util.logging.Logger.getLogger(UserInterface.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); - } catch (IllegalAccessException ex) { - java.util.logging.Logger.getLogger(UserInterface.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); - } catch (javax.swing.UnsupportedLookAndFeelException ex) { - java.util.logging.Logger.getLogger(UserInterface.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); - } - // - - /* Create and display the form */ - java.awt.EventQueue.invokeLater(new Runnable() { - public void run() { - new UserInterface().setVisible(true); - } - }); -} - - -public String getIP() - { - return ip ; - } - -public String getUsername() - { - return username ; - } - -public boolean isDone() - { - return done ; - } - -// Variables declaration - do not modify -private javax.swing.JButton jButton1; -private javax.swing.JLabel jLabel1; -private javax.swing.JLabel jLabel2; -private javax.swing.JSlider jSlider1; -private javax.swing.JSlider jSlider2; -private javax.swing.JSlider jSlider3; -private javax.swing.JSlider jSlider4; -private javax.swing.JTextField jTextField1; -private javax.swing.JTextField jTextField2; -// End of variables declaration -}