0

I"m working on a Client-Server chat program for a university project and I have little programming background. I've made 3 classes: ChatClient, ChatServer and ChatServerThread. I can currently have multiple clients connected and talking to the server at any time.

Although one of the requirements that I'm having the most difficulty is this: "Any message typed from 1 client is sent to all other clients" and also "Both sent and received messages should be displayed".

I've spent the last few nights just trying to get this extra bit of functionality working but have had no luck.

I've been reading and looking around for a while but I have lots of difficulty adapting online examples to my work. I've read that I should be creating a list of sockets and then iterate through the list and send data to everyone in the list, which makes sense in my head but gives me a headache when I try implementing it. Any help with this would be very greatly appreciated. Extra points if anyone can give me some insight on how I could encrypt the sent data.

ChatClient

import java.net.*;
import java.io.*;

public class ChatClient {
    private Socket socket = null;
    private DataInputStream console = null;
    private DataOutputStream streamOut = null;
    private String myName = null;
    private BufferedReader StreamIn = null;
    private String response = null;

    public ChatClient(String serverName, int serverPort) {
        try {
            console = new DataInputStream(System.in);
            System.out.println("What is your name?");
            myName = console.readLine();
            System.out.println(myName + " <" + InetAddress.getLocalHost() + "> ");
        } catch (IOException ioe) {
            System.out.println("Unexpected exception: " + ioe.getMessage());
        }
        System.out.println("Establishing connection. Please wait ...");
        try {
            socket = new Socket(serverName, serverPort);
            System.out.println("Connected: " + socket);
            StreamIn = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            streamOut = new DataOutputStream(socket.getOutputStream());
            streamOut.writeUTF(":" + myName + " <" + InetAddress.getLocalHost() + "> HAS JOINED");
            streamOut.flush();
        } catch (UnknownHostException uhe) {
            System.out.println("Host unknown: " + uhe.getMessage());
        } catch (IOException ioe) {
            System.out.println("Unexpected exception: " + ioe.getMessage());
        }
        String line = "";
        while (!line.equals(".bye")) {
            try {
                line = console.readLine();
                streamOut.writeUTF(myName + " <" + InetAddress.getLocalHost() + "> : " + line);
                streamOut.flush();

            } catch (IOException ioe) {
                System.out.println("Sending error: " + ioe.getMessage());
            }
        }
    }

    public void stop() {
        try {
            if (console != null) console.close();
            if (streamOut != null) streamOut.close();
            if (socket != null) socket.close();
        } catch (IOException ioe) {
            System.out.println("Error closing ...");
        }
    }

    public static void main(String args[]) {
        ChatClient client = null;
        if (args.length != 2)
            System.out.println("Usage: java ChatClient host port");
        else
            client = new ChatClient(args[0], Integer.parseInt(args[1]));
    }
}

ChatServer

 import java.net.*;
import java.io.*;
import java.util.*;

public class ChatServer implements Runnable {
    private ServerSocket server = null;
    private Thread thread = null;
    private ChatServerThread client = null;
    private String clientSentence = null;
    private int peers = 0;
    private List clients = new ArrayList();
    final List sockets = new ArrayList();

    public ChatServer(int port) {
        try {
            System.out.println("Binding to port " + port + ", please wait  ...");
            server = new ServerSocket(port);
            System.out.println("Server started: " + server);
            start();
        } catch (IOException ioe) {
            System.out.println(ioe);
        }
    }

    public void run() {
        while (thread != null) {
            try {
                System.out.println("Waiting for a client ...");
                addThread(server.accept());
            } catch (IOException ie) {
                System.out.println("Acceptance Error: " + ie);
            }
        }
    }

    public void addThread(Socket socket) {
        System.out.println("Client accepted: " + socket);
        client = new ChatServerThread(this, socket);
        try {
            client.open();
            client.start();
        } catch (IOException ioe) {
            System.out.println("Error opening thread: " + ioe);
        }
    }

    public void start() {
        if (thread == null) {
            thread = new Thread(this);
            thread.start();
        }
    }

    public void stop() {
        if (thread != null) {
            thread.stop();
            thread = null;
        }
    }

    public void increment(String sentence) {
        peers++;
        String[] info = sentence.split(" ");
        String name = info[0].replace(":", "");
        System.out.println(name + " Has joined the room, we now have " + peers + " peer(s).");
        clients.add(name);
    }

    public Boolean isAllowed(String name, Socket socket) {
        try {
            String stringSearch = name;
            BufferedReader bf = new BufferedReader(new FileReader("allowed.txt"));
            int linecount = 0;
            String line = "";
            System.out.println("Searching for " + stringSearch + " in file...");
            while ((line = bf.readLine()) != null) {
                linecount++;
                String[] words = line.split(" ");

                for (String word : words) {
                    if (word.equals(stringSearch)) {
                        System.out.println("User is allowed");
                        registerSocket(socket);
                        return true;
                    }
                }
            }
            bf.close();
        } catch (IOException e) {
            System.out.println("IO Error Occurred: " + e.toString());
        }
        System.out.println("User is not allowed");
        return false;
    }

    public void showAll() {
        for (int i = 0; i < clients.size(); i++) {
            System.out.print(clients.get(i));
        }
    }

    public void registerSocket(Socket socket) {
        //socket = new DataOutputStream(socket.getOutputStream());   
        sockets.add(socket);
        for (int i = 0; i < sockets.size(); i++) {
            System.out.println(sockets.get(i));
        }
    }

    public static void main(String args[]) {
        ChatServer server = null;
        if (args.length != 1)
            System.out.println("Usage: java ChatServer port");
        else
            server = new ChatServer(Integer.parseInt(args[0]));
    }
}

ChatServerThread

import java.net.*;
import java.io.*;

public class ChatServerThread extends Thread {
    private Socket socket = null;
    private ChatServer server = null;
    private int ID = -1;
    private DataInputStream streamIn = null;
    private String clientSentence = null;
    public String newGuy = null;
    DataOutputStream streamOut = null;

    public ChatServerThread(ChatServer _server, Socket _socket) {
        server = _server;
        socket = _socket;
        ID = socket.getPort();
    }

    public void run() {
        System.out.println("Server Thread " + ID + " running.");
        while (true) {
            try {
                String sentence = streamIn.readUTF();
                //System.out.println(sentence);
                char c = sentence.charAt(0);
                String[] command = null;
                command = sentence.split(" ");
                String name = command[0].substring(1);

                System.out.println("Sending out: " + sentence + " via ");

                streamOut.writeBytes(sentence);

                if (c == ':') {
                    if (server.isAllowed(name, socket))
                        server.increment(sentence);
                    else {
                        close();
                    }
                }
            } catch (IOException ioe) {
            }
        }
    }

    public void open() throws IOException {
        streamIn = new DataInputStream(new BufferedInputStream(socket.getInputStream()));
    }

    public void close() throws IOException {
        if (socket != null) socket.close();
        if (streamIn != null) streamIn.close();
    }
}
Ashot Karakhanyan
  • 2,804
  • 3
  • 23
  • 28
user3417925
  • 1
  • 1
  • 1
  • Encrypting the data is (sort of) straightforward...you just use SSL sockets instead of regular TCP sockets. You can get some really good information [here](http://stackoverflow.com/questions/22737970/secret-key-ssl-in-java/22738568?noredirect=1#comment34657613_22738568). – Jared Apr 26 '14 at 07:27
  • It would help me if you commented your code and detailed what you think you are doing. After a cursory glance, I don't understand how multiple clients can connect to your server. You have `addThread(server.accept());` But the server can only accept one connection (on a single port) at one time. Where do you close this connection to accept more connections and how does the server stay in touch with each client (i.e. where is another connection established for each new client)? – Jared Apr 26 '14 at 07:35
  • I may also be confused with your architecture here. Are you doing a peer-to-peer client, i.e. where each client connects to each other or are you doing more of a client-server model (which is what I'm assuming), where each client connects to the server and the server serves as the proxy for each client, i.e. the client sends its text to the server and then the server disseminates the message to each client. – Jared Apr 26 '14 at 07:42
  • Please have a look at my post where I have answered in the same context. **[Java Server with Multiclient communication.](http://stackoverflow.com/questions/22287439/java-server-with-multiclient-communication?answertab=votes#tab-top)** where I have explained it step by step. Look at the outputs. – Braj Apr 26 '14 at 18:04

0 Answers0