diff --git a/LICENSE b/LICENSE index 30bd699..655be16 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ The MIT License (MIT) -Copyright (c) 2014 Nicolás A. Ortega +Copyright (c) 2014 Nicolás Andrés Ortega Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -19,4 +19,3 @@ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - diff --git a/README.md b/README.md index 5307f81..184b720 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,15 @@ ConsoleChat-Client ================== +This is the _client-side_ to the __ConsoleChat__ project. There's not much to say about the client, the interesting part is actually the [server](https://github.com/Deathsbreed/ConsoleChat-Server). -The client side to an IRC-like console program written in Java. +###Compiling +To compile the source code, make sure you have JDK and Apache Ant installed. Then run the following command: +```bash +$ ant +``` + +###Contributing +To contribute to the project, simply open a pull request and I'll make sure to get back to you as soon as possible. + +###License +This program is licensed with an [MIT license](/LICENSE). However, please take into account that you took from the community, and you should make sure to give back. diff --git a/build.xml b/build.xml new file mode 100644 index 0000000..870b202 --- /dev/null +++ b/build.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/consolechat/client/Client.java b/src/consolechat/client/Client.java new file mode 100644 index 0000000..54a0d9c --- /dev/null +++ b/src/consolechat/client/Client.java @@ -0,0 +1,116 @@ +package consolechat.client; + +import java.net.*; +import java.io.*; +import java.lang.*; + +/** + * @author Nicolás A. Ortega + * @copyright Nicolás A. Ortega + * @license MIT + * @year 2014 + * + */ +public class Client implements Runnable { + private String version = "v1.0.1"; + private Socket socket = null; + private ClientThread cThread = null; + private DataOutputStream streamOut = null; + private BufferedReader console = null; + private Thread thread = null; + + public static void main(String[] args) { + if(args.length != 2) { + System.out.println("Usage: consolechat-client [server] [port]"); + } else { + new Client(args[0], Integer.parseInt(args[1])); + } + } + + // Constructor method + public Client(String server, int port) { + System.out.println("ConsoleChat client " + 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 { + // Create a new socket connection + System.out.println("Connecting to server..."); + socket = new Socket(server, port); + System.out.println("Connected!"); + start(); + } catch(UnknownHostException uhe) { + System.out.println("Host unknown: " + uhe.getMessage()); + } catch(IOException e) { + System.out.println("Unknown exception: " + e.getMessage()); + } + } + + // The run method containing the main loop + public void run() { + String uinput; + while(thread != null) { + try { + uinput = console.readLine(); + if(uinput.equals("/clientVersion")) { + System.out.println(version); + } else { + streamOut.writeUTF(uinput); + streamOut.flush(); + } + } catch(IOException e) { + System.out.println("Sending error: " + e.getMessage()); + stop(); + } + } + } + + // Handle messages + public void handle(String msg) { + if(msg.equals("/quit")) { + System.out.println("Goodbye bye. Press RETURN to exit..."); + stop(); + } else { + System.out.println(msg); + if(msg.length() > 6 && msg.substring(0, 5).equals("Kick:")) { + stop(); + } + } + } + + // Open and start all necessary threads + 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(); + } + } + + // Stop and close all necessary threads + 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(); + } +} diff --git a/src/consolechat/client/ClientThread.java b/src/consolechat/client/ClientThread.java new file mode 100644 index 0000000..6604f59 --- /dev/null +++ b/src/consolechat/client/ClientThread.java @@ -0,0 +1,58 @@ +package consolechat.client; + +import java.io.*; +import java.net.*; + +/** + * @author Nicolás A. Ortega + * @copyright Nicolás A. Ortega + * @license MIT + * @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; + + // Constructor + public ClientThread(Client _client, Socket _socket) { + client = _client; + socket = _socket; + open(); + start(); + } + + // Open all necessary streams/threads + public void open() { + try { + streamIn = new DataInputStream(socket.getInputStream()); + } catch(IOException e) { + System.out.println("Error getting input stream: " + e); + client.stop(); + } + run = true; + } + + // Close the streams + public void close() throws IOException { + if(streamIn != null) { streamIn.close(); } + run = false; + } + + // The run method which will be called every frame + public void run() { + while(run) { + try { + client.handle(streamIn.readUTF()); + } catch(IOException e) { + System.out.println("Listening error: " + e.getMessage()); + client.stop(); + } + } + } +}