Java peer to peer chat application

11,355

look into XMPP protocol - it's one of the de-facto standards for chat protocols and may provide either examples or ideas for your project. I think XMPP is more geared for server to multi-clients, but it's really just a bunch of XML docs that get sent back and forth.

http://en.wikipedia.org/wiki/XMPP

http://xmpp.org/

and an amazing open source community that currently has an extremely good server and client that follow the XMPP protocol standards. They have a great community so maybe jump in there and talk with some developers about design ideas etc or take a look at their source code:

http://www.igniterealtime.org/

Share:
11,355
derek
Author by

derek

Updated on June 14, 2022

Comments

  • derek
    derek almost 2 years

    I am trying to develop a peer to peer chat application which allows multiple clients to chat with each other at the moment i can only allow to users to chat with each other, my code which sets up a connection is below. how can i change the code to allow multiple connections ?

    import java.io.*;
    import java.net.*;
    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
       // import all the class that you will need for functionailty
    
       // extends jframe to develop gui's in java
       public class Server extends JFrame{
    
    private JTextField userInput; // 
    private JTextArea theChatWindow; //
    private ObjectOutputStream output; // stream data out
    private ObjectInputStream input; // stream data in
    private ServerSocket server;
    private Socket connection; // socket means set up connetion between 2 computers
    
    //Constructor
    
    public Server(){
    
        super("My Chat Service");
        userInput = new JTextField();
        userInput.setEditable(false); // set this false so you dont send messages when noone is available to chat
        // action event listener to check when the user hits enter for example
        userInput.addActionListener(new ActionListener(){
    
            public void actionPerformed(ActionEvent event){
                sendMessage(event.getActionCommand()); // string entered in the textfield
                userInput.setText(""); // reset text area to blank again
    
    
            }
        }
        );
        // create the chat window
        add(userInput, BorderLayout.NORTH);
        theChatWindow = new JTextArea();
        add(new JScrollPane(theChatWindow));
        setSize(300,150);
        setVisible(true);
    }
    
    // run the server after gui created
    public void RunServer(){
    
        try{
            server = new ServerSocket(6789, 100); // 1st number is port number where the application is located on the server, 2nd number is the amount of people aloud to connect
            while(true){
    
                try{
                    waitForConnection(); // wait for a connection between 2 computers 
                    setupStreams();  // set up a stream connection between 2 computers to communicate
                    whileChatting();  // send message to each other
                    // connect with someone and have a conversation
                }catch(EOFException eofException){
    
                    showMessage("\n Server ended Connection");
                }finally{
    
                    closeChat();
                }
            }
        }catch(IOException ioException){
    
    
    
            ioException.printStackTrace();
        }
    }
    
    
    //Wait for a connection then display connection information
    
    private void waitForConnection(){
    
        showMessage("waiting for someone to connect to chat room....\n");
        try {
            connection = server.accept();
        } catch (IOException ioexception) {
    
            ioexception.printStackTrace();
        }
        showMessage("Now connected to"+ connection.getInetAddress().getHostName());
    }
     // stream function to send and recive data
    private void setupStreams() throws IOException{
    
        output = new ObjectOutputStream(connection.getOutputStream()); // set up pathway to send data out
        output.flush(); // move data away from your machine
        input = new ObjectInputStream(connection.getInputStream()); // set up pathway to allow data in
        showMessage("\n Connection streams are now setup \n");
    
    }
    
    // this code while run during chat conversions
    private void whileChatting() throws IOException{
    
        String message = " You are now connected ";
        sendMessage(message);
        allowTyping(true); // allow user to type when connection
        do{
            // have conversion while the client does not type end
            try{
    
                message = (String) input.readObject(); // stores input object message in a string variable
                showMessage("\n " +message);
            }catch(ClassNotFoundException classnotfoundException){
    
                showMessage("\n i dont not what the user has sent");
            }
        }while(!message.equals("CLIENT - END"));// if user types end program stops
    
    
    
    }
    
    private void closeChat(){
    
        showMessage("\n closing connections...\n");
        allowTyping(true);
        try{
    
            output.close(); // close output stream
            input.close(); // close input stream
            connection.close(); // close the main socket connection
    
        }catch(IOException ioexception){
    
            ioexception.printStackTrace();
        }
    }
    
    // send message to the client
    private void sendMessage(String message){
    
        try{
    
            output.writeObject("Server - "+ message);
            output.flush(); // send all data out
            showMessage("\nServer - "+ message);
    
        }catch(IOException ioexception){
    
            theChatWindow.append("\n ERROR: Message cant send");
        }
    
    
    }
    
    // update the chat window (GUI)
    private void showMessage(final String text){
    
        SwingUtilities.invokeLater(
    
                new Runnable(){
    
                    public void run(){
    
                        theChatWindow.append(text);
    
    
                    }
                }
    
                );
    
    
    }
    
    // let the user type messages in their chat window
    
    private void allowTyping(final boolean trueOrFalse){
    
        SwingUtilities.invokeLater(
    
                new Runnable(){
    
                    public void run(){
    
                        userInput.setEditable(trueOrFalse);
    
    
                    }
                }
    
                );
    
    
    
    
    }
    

    }