From b7ff7847e987daab65caa65d7fab4e314351e70b Mon Sep 17 00:00:00 2001 From: O'Shea Date: Sat, 5 Dec 2020 17:11:53 -0500 Subject: [PATCH] working v 1.0 --- bin/javaChat/ChatClient$1.class | Bin 0 -> 1293 bytes bin/javaChat/ChatClient$2.class | Bin 0 -> 1147 bytes bin/javaChat/ChatClient.class | Bin 0 -> 2023 bytes bin/javaChat/ChatServer.class | Bin 0 -> 2122 bytes bin/javaChat/ClientHandler.class | Bin 0 -> 3773 bytes bin/module-info.class | Bin 147 -> 171 bytes src/javaChat/ChatClient.java | 90 ++++++++++++ src/javaChat/ChatServer.java | 237 +++++++++++++++++++++++++++++++ src/module-info.java | 3 +- 9 files changed, 329 insertions(+), 1 deletion(-) create mode 100644 bin/javaChat/ChatClient$1.class create mode 100644 bin/javaChat/ChatClient$2.class create mode 100644 bin/javaChat/ChatClient.class create mode 100644 bin/javaChat/ChatServer.class create mode 100644 bin/javaChat/ClientHandler.class create mode 100644 src/javaChat/ChatClient.java create mode 100644 src/javaChat/ChatServer.java diff --git a/bin/javaChat/ChatClient$1.class b/bin/javaChat/ChatClient$1.class new file mode 100644 index 0000000000000000000000000000000000000000..48518d460af0fa935789e27ee185d95938f47279 GIT binary patch literal 1293 zcmZWpTUHZ65WSs5CK(1Zgr|x+B1#C42;!56N&tz5$05j%Uro}$z+@(8rh~8%x8S!P zMUNjYz;(C)S0Gjo0RrTl?yBjozJ06ec7Ff+`3t~P6f{H_I(GOT&uw#=Ra4Hfg)93; zHN+T9wUu?ayOmwu*bybEp@|`Nwz^t#UB2N624jyqeY@gd!{dILp}PR}!l&Se<`tX#sc2E^oc3U`AYt!>BZaH=!EpO8*d6f!x%YijDtfLS2HQZxp zJLyFOn1Ozz8Lm_nK3!NZZP;t7yzOpH46N(OU`WFtL+1&^`NA6*#t1{48d+AAV`xtg z9CL3(((wRe8b(PMCpZ@yW#FOW6aV1bQoLK6*YOBXG(2u#pI@HaFNvzOJ=Y-hQqPhh z`=aEf-8G+=gihssZeRkF)O4|LQ)01nUiDS4h#=rwB2-)IGD8No-&ppByQrHj;T4O# zT5rEz^lE-d%-c%&$+KrOqOzlvIk)6^0oCwW1sdk-X3K(JG{YdCV~Od=%m>Q{Uo~3O<&h&BqGpE6A2phSkX?iLj6dn>Yn~DxRJVZ zh`X7uxO#|z0$FqL5ZO;he+y*Cqd)NM)6pL~7AMRb)Y~Z3t-XpeX()~{n52MijEB2D zctXiNB?XU!jI5A+f1Qy@@l%*4v>x(a;3avl2#5a8;;R~g$1p>m5#%sSHikL8#vAf< O3RG#T-&-0H%>4(#*)CrI literal 0 HcmV?d00001 diff --git a/bin/javaChat/ChatClient$2.class b/bin/javaChat/ChatClient$2.class new file mode 100644 index 0000000000000000000000000000000000000000..b29261b2356bd2750e7f62f7e8c2bcd23f2ade40 GIT binary patch literal 1147 zcmZ`(>rN9v6#k}L*mhlPEf=i6)zQHwOnEmWB4_+BP_PN&F+-obNCSa z)+ibieE?s<2kLP+Pfa30sa& z>4-8Um8#I>_C{f8eM{7(j$Ve;q4ZhDw)uKfkm)vWjyJgEHR%f8s@M$as&8mHg-0Z> z*zJz&DvJ!gCCj$tEW>d2NUMoehG^Moh&UMfOz4Oi(2y_@N0LFyDuYDTvc+PjwJzM1 zE|OH$sq^M4cP;e}gi*O^c?>80Wd9XQfRYPBZaR%+?(&w9!X;zP?brrR;k1r4xgJrB zi8B~x(5dRi^Obpqf$T)LB)@M|v1M-*;~2%5j2S zgMP&@&d`&wGoE4KBC&Ny2!+o_ATv>e++L9vkVQ`ID|zg}^9T^Lm8H4{^~PUMLli)xByD~hRjOL!jN z5Nb41Aq+u>7}!p@{!l8Sr_ax@z}o?zM$PHCbun+L*-IP_?xbo8N#^W&)A6YDU0QYA z4XXHudlUC?pCGolMX-jl;pPOu6n3*>+rlk3x#tO*jM$>^?WTV>(2oIn4btkNsY)hEJOs6? zU~kDq1z}%y8evgsVh3HpkFSUGa51ALc`#-DsJ><2|xVpRl!w;IqFj1*Nr5q)Y zK!t!lK^jjc1G*VxsOnR{hqNLn{RY<%2qgdj literal 0 HcmV?d00001 diff --git a/bin/javaChat/ChatClient.class b/bin/javaChat/ChatClient.class new file mode 100644 index 0000000000000000000000000000000000000000..67ca78e6e19136ad239132929339390abc762feb GIT binary patch literal 2023 zcmZ`)T~`}b6y295Oc>JgRZ4@jq*^s8w6WA$Olr}lpix4Q(9pE?V@NK^Kr+FZ3ARtZ z=!5lgf~&8CE5c+dq^gS77v^X_@XLfeW#CK_HNBl%71UJKYA0LqEMw7(%F54yz9k{6wVgk$hc1;?Nj8ZpgN8PH7X11e^1MjIU z9g}%S9ciCPI~mn+3(Fdo`bg^w7{+bf5eOcuJ9udanpXl{{uTI-!nlhSfe=|ME6oKi z$KvPJ((o~h!eiQ!ZX(|(9Z6TmJ$$0Ff1orze<%|#X!ulM?o6R4hHLZ@sLrRtc!)!4XX2qV7(=A%toQ30KBp@EVRKEltGSO#;hQivl`f&5ZPS%c zcQ-U_4HV~YRq3E%o0_TYhPwIYT^%{>D2#c5`#p?i7$Rg&u$*Wf?==^IaILpJL$VAvIoiwavp`tfr~v? z5-2b~;5)!6L7mAgFz!gJoRyAaRJ@_-)u`8ZzP3bh$(AK)p2)7(WLCP>MtR$?St)FN zQl#e_O}ivFOf`BZdh`5_ipNAUtUfzkGaN_Kdwh#En3ZZ;JGcSP8va`VM)<^O&Q;@E zg1g`zywyVJPtUA#Rc5u0a}E0r+%NKN43{v$P?LNP&@!dMh*kQI@yj1=%oN+0Exy5A z3)fnRZoa{L(;uE9zI2L2wvBtm<*E7KTDZT}#%l5QDUvNbN(S0kQ!ih%u$~O6BVTon zBu68`$ml7)ZX?Ucx#ChJ*uu9h>?Sq;(_S$WXrZXSgd*B0UPeM(dbuQt7?|d72J@WX ziyXg8ob;<$z&hWuh$2sdo+E}j`|%eP@GA@YcRcg*f9Yq2AMm3W=M@a>GxJ3pp@cFC zU7}6mfUK-y2NhJw%sPK24pmd)0X@rPsE%u>an*RoI4nMe&|u7| literal 0 HcmV?d00001 diff --git a/bin/javaChat/ChatServer.class b/bin/javaChat/ChatServer.class new file mode 100644 index 0000000000000000000000000000000000000000..21c4d11cfb64ebb997f0ab485acc60521eb97672 GIT binary patch literal 2122 zcmZuyYgZdp6y29R28Q8XT7pv3*4BhaQl)AoSfsRAG&}>;w7!PqnhYcpI+?Wg2lz|; z;AiVv$y#PDe}MnV$G$V6OaiP$GIP(lXYaGmBY*$<=U)KsqoJWsVB*+(X|9z`H?2N$ z(s?Nz4Pk*%Wk^>{yOiEOI+g`jpubUyV`#>O+NFEA=*J?$nVW`71-HoTiz=(lS z=mODY@8SRi#tlRe6&T4{w%lq|kEFA29#zO_JXFSt4TqSaYP>GG?;Q(&owubk+%8+|qcV*SU9ehB2YK`+U5NL;7Tr!eoHPerz zz`X7w#AV%OwpP6?i>dhPE7NkxI$o&RHjAnlr&1{$b6C(YA7CB`Xds2OfOe`dD%4>z zahVJ%iw_NaghiIaEGR)3FOl?py_~&lGa5b?nDUe$^GBv@Za3W1Mu)zRPw|NlRVV$g}}8SpAEZ<&O-xhcqA}P zA+SaaXXeaKBXKd;y3XbV(leV?$t3U-QNwP>^_0x-5+>&c_}3qQUy9f~ncF z&8qaOwSun=WUw|VrI zEYoG_&2pa_=xgNZjv-jQV= zM(bWz3XBC@{0I1dSyp|1?o21I# zKBeTI^P4&_|4aI$Hhc9!PorgY1-;*RMM)s+r~({r_kQ;_SHTB;)o z!{0S2MF=;zgG2m@Az8JE`K|G-k8dIV4?yS1AW!Carv3)oF!C)7|ADdJ`PzpGeyVFU z;fi;nf^p4vE~fddtdZFkCVQ`F-W9`lz*StM;{c`*Bl#CDq=n_JHdfU0Y738-!piFjy<*`ezFLa3v6Y{X zMHXV=7Iv1R%9^9Kje~qF+QQQ%?G46a(I%cfjcHAM|J#4R5;){#x`bgqPmxj#L!>r| zIEmimn!klb+(w2^50StwW|608MJ%9-G#p&_Qr+{DfQci<8N@LP^kE%QhQv?Q^A1-< ziEkmsTY*K7FeBc@2`VhmE(=zLO)-jOQo||B^}>rJ{=uY%8I23s;XyA&px>S E1M{UByZ`_I literal 0 HcmV?d00001 diff --git a/bin/javaChat/ClientHandler.class b/bin/javaChat/ClientHandler.class new file mode 100644 index 0000000000000000000000000000000000000000..b6068401a257fd1041bc49a07d0487dfe2f0f018 GIT binary patch literal 3773 zcma)9e{d9M8GiO|lfAoa3^@`)NGV%lXmUw<6)J^_v#H}i zcE5eU_j|whd!FZgzvRt-Uw<9IHhfn>M8cY5`bm9oPWRG-mTB1De%;PlhO0o9uu9CO zE#00?k53;nvYvuk3CU&aA>X$3Y0HpMTX3?+4NpSjNHA?1UOE$)`X$8tg5lbFo_@)2 zI*6I^T+^QAe0@&$bbc9ne%xn_b)l2#r1x@yrg`5Br|GONI}h6uTC04A?Ml~}<;>0+ zIpHQ9DWx%D7Pv!mxXSlTE4|xw_0z)4;PH$(YwMoxGS&1-K05;AJMrq@$l*H)kq8Y<5nT2?w_)lB7)x+W#agHFy!Ac|HM%~&TP+SxT3hlHC{#E}rAn^h=? ziIJwF4yqV!R8f!jh|zmhG+>p4h7r>?#{B%W;ZB4kCP$pCZcXa0DZWca*_$&964nMu zt#EK+%V}9q%v^E~KcYFYV%4bO%{jS)x=ZFg!xa;*Z^v-Egznw}?J!qp8#@XcwK=_@ z75r@0C=_OV%Q~%P9owedjGQ*mn@C_Y?ohC$N{^v-RJ=5^A#y@Y!u%=cCx zAF8;&tHM+gVVnigr(k>aCZ`LYkyp`=9n9Sk(kuywtR19y%c@LZC+$9iAAH(A2rYQ4<))-3ks?Bs)C5?^M>9_e{rDaY%@&AxJjk>Dl8GuAZgf zBuuC{3@R{|b@F+(2@=}7!b#puC|yTlxQAqQ6#BG|f(Up-#l7ORbp^xDjgozRmK%Kp z_ba%MDg0L>QE^mcR+F`y0?Sj?ZQJqftdVEe;-T~5ddl%sB~2Aa6P+eF(WpKjh&zT^ z#!Jr`)_e@67@qJ=FNWi61Zg2?i!2EFQ3Ey{=5Czub&Kb&Vz8_#p6>*UFF|cD$(lS? zidjpCe!Gn&|}pqaMj%^4cUCk?kxOTfni3Qn^4DhaRbhbm490Amlh zre~1yI6jJxDR{8NZCI{s?wKH@ibf<8cnFUuc(_b|bq`eW34D?P8P3%`hb6tHtf9bh zxMc6I!x=oL;L-AZP&KRKaXi7MU>m1MO|=S3Xo>Yts`xaXB6n;6V}UDs*%1NwXH|R- zpC?}g&m&O#O1QUG>W!y!Gi1b|2>OM(&ha`(uwFD?Tc#y?7&}QQ)jlnTFHsxpCOh#J zQISu-3yT!^>dKx`Y7kUMKoVn6DblclXG9auD|ohCkQH5Lk8fHz!;Rsxgvd@Zc?sVT z?Rt+GeN)8?SfHBp`FRR|d8T35Gt5R!nm4 z9&F<59brh^icWqpIJ%fBn;%ChCL0Mx-Ap$cjCvSFMlZ*WGF?F@pqoEE{E=`Q*73<~ zrMnndrp-^L<<}6Mil$yhTjo`~Z{#K1*vGxW6Ro2R$UW6a}rc-W4U*umPq8xInxhu9-$x#Ce6c#PhUGvX8U ze3G6|Rp98CaBM^lI??0r1H^kez_EvLWND9bU3p|Mmli1hf~H_I{~u5=F4wh>i5C~M z`G?#`Qbbee=tk{p*gO?Y&Sa+KT0xa9Qf|7U8{w(?xu|uVw+8T5EoYPf7R*q&~S-ei`i-1PKkoReZM5TezH+ zaAEQH-N~6EK64%eL8LEmF1l4-K%@BVZI(CFa7LDz<=)pXFa9I&`65jVs9#Fz%h4-5 zT@wcIQ_`~wZv^jr7g>*IfJIhx zl{s(;ChDpu%KmZ4RblWpTBQ0#_KIpd_ZW`{#Tk$AFkx{<#FZb)NUCSDqA15h*2fmG zwYSXqC`oFkh(!5)EhxWrg0>&w(p2*6ui!bB>+?l?izISMpn+eo+(uc2V^^tFV2Hmi zmCI}s8xHVG^7kg%iTEaBI>7HC{F+|B!2$f1jp=s*52-MvB_760JT$St2&5zQ4htp{ z;JY6+i-L*}k}^hZWy3O>Ys#jwPaPtqMFOd?jnzm2QW5cMV2Bd_$+tjh+Y(9}s!Tm*f`+GjLA~RhN}vU;`>(U|?e4 M0MlFzU 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/module-info.java b/src/module-info.java index 4833feb..2d8c047 100644 --- a/src/module-info.java +++ b/src/module-info.java @@ -6,4 +6,5 @@ * */ module javaChat - {} \ No newline at end of file + { + requires java.desktop;} \ No newline at end of file