2013-04-24 192 views
1

我正在嘗試開發一個允許多個客戶端相互聊天的對等聊天應用程序,此刻我只能允許用戶與對方聊天,我的代碼設置了一個連接如下。我如何更改代碼以允許多個連接?Java對等聊天應用程序

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

直視XMPP協議 - 這是爲聊天協議事實上的標準之一,可爲您的項目無論是實例或想法。我認爲XMPP更適合服務器到多客戶端,但它實際上只是一堆來回發送的XML文檔。

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

http://xmpp.org/

,並且目前有一個非常良好的服務器和客戶端接下來的XMPP協議標準驚人的開源社區。他們有一個偉大的社會,所以也許跳那裏與有關設計思路等一些開發商說話或看看他們的源代碼:

http://www.igniterealtime.org/