From 6417427f3d4d95b3f891b0720799cb2489f2c697 Mon Sep 17 00:00:00 2001 From: Deathsbreed Date: Sun, 4 May 2014 13:55:37 -0500 Subject: [PATCH] Added all the source-files. --- COPYRIGHT | 15 +++ WARRANTY | 18 ++++ src-client/Client.class | Bin 0 -> 3110 bytes src-client/Client.java | 105 +++++++++++++++++++++ src-client/ClientThread.class | Bin 0 -> 1585 bytes src-client/ClientThread.java | 51 ++++++++++ src-server/Server.class | Bin 0 -> 4821 bytes src-server/Server.java | 171 ++++++++++++++++++++++++++++++++++ src-server/ServerThread.class | Bin 0 -> 4222 bytes src-server/ServerThread.java | 118 +++++++++++++++++++++++ 10 files changed, 478 insertions(+) create mode 100644 COPYRIGHT create mode 100644 WARRANTY create mode 100644 src-client/Client.class create mode 100644 src-client/Client.java create mode 100644 src-client/ClientThread.class create mode 100644 src-client/ClientThread.java create mode 100644 src-server/Server.class create mode 100644 src-server/Server.java create mode 100644 src-server/ServerThread.class create mode 100644 src-server/ServerThread.java diff --git a/COPYRIGHT b/COPYRIGHT new file mode 100644 index 0000000..3813d85 --- /dev/null +++ b/COPYRIGHT @@ -0,0 +1,15 @@ +ConsoleChat, a simple chat that can run on any machine with a Java JRE. +Copyright (C) 2014 Nicolás A. Ortega + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . diff --git a/WARRANTY b/WARRANTY new file mode 100644 index 0000000..3360453 --- /dev/null +++ b/WARRANTY @@ -0,0 +1,18 @@ +THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + +IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. diff --git a/src-client/Client.class b/src-client/Client.class new file mode 100644 index 0000000000000000000000000000000000000000..ef603752a979706bed5a735e57b41be193f77c50 GIT binary patch literal 3110 zcmZ`*X?N7t8GhukEsc=3F%E_p5D>r~gB>7AQ=2%1#W0DnjTh*IKq`-Ad+=BqMiNW6 zq)XB@ZIZ6(mbOXjEZv}FCXLU@$tQA7en-FcC-j`s=aptN&<}dA?!E8&yo>bNe?R&d zz#)7T#|2!}@Vt&M!csA(BZGMzjj(k*frU8V7KJPc$qKn7WLZN_#fpwr*cu!Wa8=}0 zT-MQv1q}sRJsk=7@)oGLqT#BJ&9dK%YdZGfx{xnv__Bz9MZ;Hhd<`#Xcv04`3;BkI zZ>so~ikHOCmv!{w+amrQ72g%x-xCerSMdWKgLp;74|N>CkA%2FUKQTggomURuW5K) z7`gsfocf7uURCi^6+ctZ?75j`+gH#rcFDS84LY_zI2|4hD^N2tO9k7SSI|0kESI$% zKicyu?)kh~nFuJlB@)fLgU2o3;!!^Er^D+|hwFH5&Q{P}Wjh)yEZ7Bmeu}#70-2iq zvYkZ4le3(~!K$ss6)Wo~c%b)u-7O7doyFn4vkDrIx%1TDHkNhl@nB`nF3ebSVzFh~ zw=&D8t$cakd^qc5{Si@huclPrSyqCIpNAQ}q99fXXf@U=CYqNlXI@lx-A7Uwnmpes z5DWdpwTzwjvkaP!dA^(H*|ZxJGWKXz6l{oq91yfs{KCK+_@#oKv!1nR51DdmMjYmO z&n{fC3m44udAHzSQ1L4Rzs5N_6EUdxje+0dO#|bY5Hf4vNgOfo6pk7=hT{fKVAQ}# zoKmpqnCm!p#wTW`@0yY7fq?__`8rB ztoaJ--JN0JCjKEzw-gxly(MQKC}-s>>iv~)PIRNy#K=hT^x61q-w`nu=aE9?zd+P|yX*OP3?TIW|& zTX)Qvk{6~NJFBB+IOX{EqLho4w+f!k?f>bt6szCL=b3l~`|sC^_w;qS5;IrjLvfe>Lj-1jUQ za<;SRlam94UdO#)&I?DDOrKQhzSbLL%+=tmD=)g%T@F`zrB-+00PL(?l}DKdqNu00JpG3w$m+fka=ocO50w%M{faZwY|bFhbT&z$63ca2 ztKfA{Dk@pS4t^w`fPxV;p+UwQKi~~A;lhEwq|kLuU59}{u6PF^oLwC*k`z_J^gVp;RL}e>cdWw$9YVn_=0TRk60{}MCNx?;B zKpOu7;^>A>&P~|Ow}a#!!WPPHr-lcKZVxW<-6F>vw(+0D48!k6><$@XDkfE&QJ|=p zdS1nJ55bthY#H&_5u@BC}5F5vBqq`!z-K*=J^ z)jOZupiY(EY_G<%hrTnLJl%~h?BQLKw|nVfFAk%R6_Vt~Z(r!IMo%u%zg^UF7U#jg2(VEA$`13HQhT13BRSJQk1VS84A}a7R2848hX<=(N_X1p ziB|WQFd&sgBtOL-UJRy_a#O;?Qe|s6kfzW1e=>Ck3A{D_uu`ga+pKvdsGTV&ypu%P+A;dUjhk8-C+JErzA?zCvf z06w=0LlT{MT=2bxcoCmp#n$@V4@J2jjw(IkIV=U;$<{wYr&5^2bhQ9R&_;JhiTg 6 && msg.substring(0, 5).equals("Kick:")) { + stop(); + } + } + } + + private void start() throws IOException { + console = new BufferedReader(new InputStreamReader(System.in)); + streamOut = new DataOutputStream(socket.getOutputStream()); + + if(thread == null) { + cThread = new ClientThread(this, socket); + thread = new Thread(this); + thread.start(); + } + } + + public void stop() { + if(thread != null) { + thread.interrupt(); + thread = null; + } + + try { + if(console != null) { console.close(); } + if(streamOut != null) { streamOut.close(); } + if(socket != null) { socket.close(); } + } catch(IOException e) { + System.out.println("Error closing..."); + } + + try { + cThread.close(); + } catch(IOException e) { + System.out.println("Error closing the thread: " + e); + } + cThread.interrupt(); + } +} \ No newline at end of file diff --git a/src-client/ClientThread.class b/src-client/ClientThread.class new file mode 100644 index 0000000000000000000000000000000000000000..1f3a7a55e0343a743898afe7bb2a1e54909337eb GIT binary patch literal 1585 zcmaJ>U31e`5Ixs+EJr8~`7lXJlA4qc#{mqb&=!Y}5|TE>Ay6mKq@_i%HAdh_9!c($ zM_%~{{DM5gfHDI!ed_d~f2IGS^sJN^F))45UfsKU&z`fp(%=8S{sX`{G;|!snSOkN zvtm9Mb56_`I?Z`87c_jS<12ivBZrF`s{NS9B@LH#4B$)-S7f~^<{L5BbS&VyjzuiV zg>S`tC)?#5zSnU8H#F2VtSDrCxADjd6ozUK&EL$5V+ECZbX29Y(Y7sz&RlIFdgEEn z4?N4X+9b%l?byL(g~`%B$_J@t?TGwtjEsynB^gP!qwyYrFanY9g731n& zEE>3jyJCJcuz^htKN+s#*mt`an(7ze&BX^Lnd#1ZHb--rqh(6)LGmW%lFNeg(LjL5A$D;K}u$l zZz&neXys%^D~B_RP@KABP&m$Ai*aeLbLCyAvU-J-n6#KoIsFQK-e6#37y04A5C`W%422jDF~Z1nh|zL}yq*&a7)F7)QW2YJW(V^RV~nSx zI7C~ay+A%yOppZ_ky_U=5}KF)Sdu%YKEW}f>iaj}zfE_bF8V14`Ob3;+NC literal 0 HcmV?d00001 diff --git a/src-client/ClientThread.java b/src-client/ClientThread.java new file mode 100644 index 0000000..247c68d --- /dev/null +++ b/src-client/ClientThread.java @@ -0,0 +1,51 @@ +import java.io.*; +import java.net.*; + +/** + * @author Nicolás A. Ortega + * @license GNU GPLv3 + * @year 2014 + * + * For details on the copyright, look at the COPYRIGHT file that came with + * this program. + * + */ +public class ClientThread extends Thread { + private Socket socket = null; + private Client client = null; + private DataInputStream streamIn = null; + private boolean run = false; + + public ClientThread(Client _client, Socket _socket) { + client = _client; + socket = _socket; + open(); + start(); + } + + public void open() { + try { + streamIn = new DataInputStream(socket.getInputStream()); + } catch(IOException e) { + System.out.println("Error getting input stream: " + e); + client.stop(); + } + run = true; + } + + public void close() throws IOException { + if(streamIn != null) { streamIn.close(); } + run = false; + } + + public void run() { + while(run) { + try { + client.handle(streamIn.readUTF()); + } catch(IOException e) { + System.out.println("Listening error: " + e.getMessage()); + client.stop(); + } + } + } +} \ No newline at end of file diff --git a/src-server/Server.class b/src-server/Server.class new file mode 100644 index 0000000000000000000000000000000000000000..3d0bc40d2948f492dda7d19885f8d8b89f780750 GIT binary patch literal 4821 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 literal 0 HcmV?d00001 diff --git a/src-server/Server.java b/src-server/Server.java new file mode 100644 index 0000000..2881e5f --- /dev/null +++ b/src-server/Server.java @@ -0,0 +1,171 @@ +import java.net.*; +import java.io.*; +import java.util.*; + +/** + * @author Nicolás A. Ortega + * @license GNU GPLv3 + * @year 2014 + * + * For details on the copyright, look at the COPYRIGHT file that came with + * this program. + * + */ +public class Server implements Runnable { + private String version = "v1.0"; + private ArrayList clients = new ArrayList(); + private ServerSocket sSocket = null; + private Thread thread = null; + private int clientCount = 0; + private String passwd = "admin"; + + public static void main(String[] args) { + if(args.length != 1) { + System.out.println("You are using the program incorrectly."); + } else { + Server server = new Server(Integer.parseInt(args[0])); + } + } + + public Server(int port) { + System.out.println("ConsoleChat server " + version + " Copyright (C) 2014 Nicolás A. Ortega\n" + + "This program comes with ABSOLUTELY NO WARRANTY; details in WARRANTY file.\n" + + "This is free software, and you are welcome to redistribute it\n" + + "under certain conditions; details in LICENSE file.\n"); + try { + System.out.println("Binding to port " + port + "..."); + // Try to open a port on the specified port number + sSocket = new ServerSocket(port); + System.out.println("Server started: " + sSocket); + start(); + } catch(IOException e) { + System.out.println(e); + } + } + + public void run() { + while(thread != null) { + try { + System.out.println("Waiting for clients..."); + addThread(sSocket.accept()); + } catch(IOException e) { + System.out.println("Acceptance error: " + e); + stop(); + } + } + } + + public void start() { + if(thread == null) { + thread = new Thread(this); + thread.start(); + } + } + + public void stop() { + if(thread != null) { + thread.interrupt(); + thread = null; + } + + for(int i = 0; i < clients.size(); i++) { + try { + clients.get(i).close(); + } catch(IOException e) { + System.out.println("Error closing thread: " + e); + } + } + } + + public int findClient(int id) { + for(int i = 0; i < clientCount; i++) { + if(clients.get(i).getID() == id) { + return i; + } + } + + return -1; + } + + public synchronized void handle(int id, String username, String input) { + if(input.startsWith("/")) { + if(input.equals("/quit")) { + clients.get(findClient(id)).send("/quit"); + remove(id); + } else if(input.equals("/list")) { + int pos = findClient(id); + for(int i = 0; i < clients.size(); i++) { + String list = Integer.toString(clients.get(i).getID()) + " - " + clients.get(i).getUsername() + " |"; + if(pos == i) { list += " (you)"; } + if(clients.get(i).isAdmin()) { list += " (admin)"; } + clients.get(pos).send(list); + } + clients.get(pos).send("\n"); + } else if(input.substring(0, 3).equals("/pm")) { + int pos = findClient(Integer.parseInt(input.substring(4, 9))); + clients.get(pos).send("<" + username + ">: " + input.substring(10)); + } else if(input.length() > 12 && input.substring(0, 5).equals("/kick")) { + if(clients.get(findClient(id)).isAdmin()) { + int kID = Integer.parseInt(input.substring(6, 11)); + String reason = input.substring(12); + clients.get(findClient(kID)).send("Kick: " + reason); + remove(kID); + } else { + clients.get(findClient(id)).send("You are not admin."); + } + } else if(input.length() > 10 && input.substring(0, 10).equals("/giveadmin")) { + if(clients.get(findClient(id)).isAdmin()) { + int aID = Integer.parseInt(input.substring(11)); + clients.get(findClient(aID)).setAdmin(true); + clients.get(findClient(aID)).send("You have been made admin.\n"); + } else { + clients.get(findClient(id)).send("You are not admin."); + } + } else { + clients.get(findClient(id)).runCommand(input); + } + } else { + for(int i = 0; i < clientCount; i++) { + if(clients.get(i).getID() != id) { + clients.get(i).send(username + ": " + input); + } + } + } + } + + public synchronized void remove(int id) { + int pos = findClient(id); + if(pos >= 0) { + ServerThread toTerminate = clients.get(pos); + System.out.println("Remove client thread: " + id + " at " + pos); + try { + clients.get(pos).close(); + } catch(IOException e) { + System.out.println("Error closing thread: " + e); + } + clients.remove(pos); + clientCount--; + try { + toTerminate.close(); + } catch(IOException e) { + System.out.println("Error closing thread: " + e); + } + toTerminate.interrupt(); + } + } + + public void addThread(Socket socket) { + clients.add(new ServerThread(this, socket)); + try { + clients.get(clientCount).open(); + clients.get(clientCount).start(); + clientCount++; + } catch(IOException e) { + System.out.println("Error opening thread: " + e); + } + } + + public String getPasswd() { return passwd; } + + public void setPasswd(String npasswd) { this.passwd = npasswd; } +} \ No newline at end of file diff --git a/src-server/ServerThread.class b/src-server/ServerThread.class new file mode 100644 index 0000000000000000000000000000000000000000..f5d0a53cf241891bfabcfa0510fa72bc4e1efa94 GIT binary patch literal 4222 zcmZ`*S$GrI75>MIG#-z^h}EnEgdoebMle z_oDc|K%O?R9nXox=c4#Q6hD;B9~sz%=S2?=C0v$c4t=;B#gC)-iH1ng@h2Q#gMMgG zef7znml}5h4T}z)vnTA{yc6^esx2NixM>Yqk{3$6nzwU~hFD0Kwey+Y!N7O(84~Kn zz<2CiGOwW{Ja@g`emk&}`9dim84pR;5|SM$QQpdVblj>XZ1hWHrJd2xY^QTBzazWc zyc_J+usU7^UkAAJl!m5#UYaNu9&+=};ZknI@lV(zS?)9yojkQ!8n4GM_u2*nJ2gIF z7Zf=IK|^C)4h%xs=jC#?+-~v;4#61vFQlA8;ClHY5vHM_E)>FFHYGqbYtyNgwn|e#$xEiVBNDubmj9InzDjE)yqk*2I1s zFmVv?G?BzZL@9zzJd8so25{KK5gavf4986j;&>ESOkBl?i5D~j zt6CHWf6nD{Cai^tw$DC{-ir<^K zfj?;4X{+1nRdHes7wlqjGX03v-EAGT-MkfU7kqbuCd@d+9z%$;ZZQy&<4#cW^F_?_xDQ_23?Yg2R%i9?>bDKYzDQrD3PTVWFt7IN0GONhg{ zVnzWSq~R#fqMV|gajd|zynJ?wgJXH43Ro)ZI{BaigHbXoYB=vqR@p0N`^K1=j-{Yg z4??+OG=Vla=1r2RTeRH#sORTw3FMIEe92XIImWriF!3%7X?R10q?HPjptw_6Fg2D5 zO>GH+8mm|2i#4e=%T3h<;uz0Qhk`Qh1pUd(4oxB6;tp-@@uF{q>Q-*rMQhT@X2Xl) zZfd+@K1M{*%PXZHmR+wD(1@b5@?9~o19G%NGK-ojO9}%~?N!NuKjJ1!OBg${dd%|XlXGCvr2^KX1!qI8N5eAG__G@p9Yq*BnIT5+tl3TcMSQd2?by|VJRn44Htp-U z%DhUhlct#%0uy$Ya4O#2V$n=AVR)7+_$+w7*e)jq2n#`dY1go-T0r)eMn@grN!Jv9 z6Mx0uq*A@EVMUcrnnP{TXJM}%Raw*?oA^845FT%uc(+s!b5I3WSPSWzxe`^~TBx?> z`WeeDYw}UgXY7jGS{) zL7()rNY=?`0vfobSQ=sfXANhB$CJ0Q8I85{cD9t4gSbwWcDBJeUni+qMqV^6OtR|v z0@BumAH%lVeWk(8dyuTC_~w=a(RCrY)J7m&=ibZ^d#;}(ZnskZ^u%`%1fE}O!y{imU<}%u*v2EZ5EWD2P zp&2aVW>Xol*y1vlY$;;5jw`soh9@0F zu#(tUVGmZ*$ZK(i6j3zrtuwrp436P!1>8-l*1*FHb4X$Y?U6Dz#qLzp-Cga}Y%{4F%80A2MTsVfmsqD<#D5bpdV?ST>57pD z1#C>zc=9FChf8AJRqK)PMpvvy5n45b6gi*j83o9^grfvx3ZPzfX^+}(dzR4?yGse4 zNOZNg5u*flMRM$JvLog?t`8}-alc|>T*AF%ZV2qXdU)T>a1@^*buAgHFKEX_X znt6VOnf@wY<*$?KpUm=qV?c}Gh_(qwwH_SPc4JUGh*R1CZ%fdcFxKtRGgc2y4UpTX`KJRs>$Pqxe@ zd5k##3^Q%cGKn9h4v+B%?($L2Kl^J%W{R`Oyh}vgU^FO+4|0lzD+bLTuJmxlEZ?h2 z&79qqv5){GJ+awLk+ZxUyx|!^op65qcph6prag`#s xdeX?1TS#3JITTn=YTU~89Emaz-cn!JQg^8ok;E$I!JPF%1X)tKJZ-?a{{z 6 && command.substring(0, 6).equals("/admin")) { + if(command.substring(7).equals(server.getPasswd())) { + admin = true; + send("You are now admin.\n"); + } else { + send("Wrong password.\n"); + } + } else if(command.equals("/myID")) { + send(Integer.toString(id) + "\n"); + } else if(command.equals("/myUserName")) { + send(username + "\n"); + } else if(command.length() > 12 && command.substring(0, 12).equals("/setUserName")) { + if(command.length() <= 13) { + send("You did not enter a new username."); + } else { + username = command.substring(13); + send("Your username is now: " + username + "\n"); + } + } else if(admin && command.length() > 10 && command.substring(0, 10).equals("/chgpasswd")) { + if(command.length() > 11) { + server.setPasswd(command.substring(11)); + } else { + send("You did not enter a new password.\n"); + } + } else { + send("You have either entered an invalid command, or used an improper form.\n"); + } + } + + public void open() throws IOException { + streamIn = new DataInputStream(new BufferedInputStream(socket.getInputStream())); + streamOut = new DataOutputStream(new BufferedOutputStream(socket.getOutputStream())); + + run = true; + } + + public void close() throws IOException { + if(socket != null) { socket.close(); } + if(streamIn != null) { streamIn.close(); } + if(streamOut != null) { streamOut.close(); } + run = false; + } + + public int getID() { return id; } + public String getUsername() { return username; } + public boolean isAdmin() { return admin; } + + public void setAdmin(boolean a) { this.admin = a; } +} \ No newline at end of file