Java点对点聊天应用程序

时间:2013-04-24 21:57:01

标签: java multithreading chat

我正在尝试开发一个点对点聊天应用程序,允许多个客户端彼此聊天,此时我只能允许用户互相聊天,我的代码设置连接如下。如何更改代码以允许多个连接?

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);


                }
            }

            );




}

}

1 个答案:

答案 0 :(得分:1)

研究XMPP协议 - 它是聊天协议的事实标准之一,可能为您的项目提供示例或想法。我认为XMPP更适合服务器到多客户端,但它实际上只是一堆来回发送的XML文档。

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

http://xmpp.org/

和一个惊人的开源社区,目前有一个非常好的服务器和客户端遵循XMPP协议标准。他们有一个很棒的社区,所以也许可以跳到那里与一些开发人员讨论设计思路等,或者看看他们的源代码:

http://www.igniterealtime.org/