2011-11-10 3 views
1

Dans un programme de discussion de client de serveur utilisant des flux d'objets, comment serais-je capable d'envoyer un message à tous les clients et un message privé à certains clients?Création d'un programme de conversation client-serveur

à mon écoute pour la méthode des connexions i accepter la connexion

public void listenForConnections() 
{ 
    String sUserName=""; 

    try{ 
     do { 
      System.out.println("Waiting on connections"); 
      Socket client = servSocket.accept(); 
      System.out.println("Connection From: " + client.getInetAddress());   


      //pass message handling to thread and listen 
      ClientHandler handler = new ClientHandler(client,this); 
      handler.start();//As usual, this method calls run.     

     } while (true); 
    } 
    catch(Exception e){ 
     e.printStackTrace(); 
    } 
} 

Ensuite, je passe ce client à un fil dans le serveur pour gérer exhanges de message;

i, e;

  //pass message handling to thread and listen 
      ClientHandler handler = new ClientHandler(client,this); 
      handler.start();//As usual, this method calls run. 

Comment et où je garde une liste des clients connectés?

Je pensais à un hastable avec la clé étant le nom d'utilisateur et ObjectOutPutStream. Et puis lire l'objet envoyé après que la connexion a été acceptée mais j'ai rencontré des problèmes. Le message était une commande de connexion donnant le nom d'utilisateur et une commande. LOGIN

Mon code est devenu;

System.out.println ("En attente de connexion"); Socket client = servSocket.accept(); System.out.println ("Connexion de:" + client.getInetAddress());

  ObjectOutputStream clientOOS = new ObjectOutputStream(client.getOutputStream()); 

      outputStreams.put(sUserName, oos); 


      //big problem here 
      //serializeation 
      /*ois = new ObjectInputStream(client.getInputStream()); 
      oos = new ObjectOutputStream(client.getOutputStream()); 

      //ask for the username /authenticate 
      System.out.println("SERVER: getting username"); 
      myMessage inMessageLogin = (myMessage) ois.readObject(); 

      if(inMessageLogin.getCOMMAND()==ServerCommands.CMD_LOGIN) 
      { 
       sUserName=inMessageLogin.getsUserName(); 
       System.out.println("SERVED User " + sUserName + " connected."); 
       //save stream 
       outputStreams.put(sUserName, oos); 
       //oos.close(); 
       //oos.flush(); 
       //ois.close(); 
       ois=null; 
       //oos=null; 
      } 
  //end of problem!!!!!*/ 

que je commenté comme il a donné des erreurs sur les flux corrompus, des idées?

Merci

Pour envoyer un message au serveur du client;

//default cmd is to send to all 
public void sendMessage(String sText,int iCommand) 
{ 
    System.out.println("sendMessage"); 

    outMessage=new myMessage(); 

    outMessage.setsUserName(sCurrentUser); 
    //set command 
    outMessage.setCOMMAND(iCommand); 

    outMessage.setsMessage(sText); 

    System.out.println("send msg" + outMessage.displayMessage()); 

    try { 
     oos.writeObject(outMessage); 
     oos.flush(); 
     oos.reset(); 
     //clear up send message from txbox 
     txtMessage.setText(""); 
    } catch (IOException ex) { 
     Logger.getLogger(myClientGUI.class.getName()).log(Level.SEVERE, null, 

ex); }}

code client pour se connecter au serveur;

public void connectToServer() 
{ 
    String sServer=txtServer.getText(); 
    PORT=Integer.parseInt(txtPort.getText()); 
    try { 
     //host = InetAddress.getByName("localhost");//InetAddress.getLocalHost(); 
     host = InetAddress.getByName(sServer); 
     clientSocket = new Socket(host, PORT); 
    } 
    catch (Exception e){ 
     e.printStackTrace(); 
    } 
} 

public boolean createStreams() 
{ 
    try{ 
     //serial 
     //******************************************************************************* 
     // open I/O streams for objects - serialization streams 
     oos = new ObjectOutputStream(clientSocket.getOutputStream()); 
     ois = new ObjectInputStream(clientSocket.getInputStream()); 



     return true; 
    } 
    catch(Exception e) 
    { 
     e.printStackTrace(); 
     return false; 
    } 
} 
+0

Je suppose que, vous devez fournir le code client qui écrit à commande réseau. –

+0

J'ai posté ma méthode d'envoi du client –

+0

Comment créer une connexion client et ObjectOutputStream dans le code du client - pouvez-vous également publier le code de ce client? –

Répondre

0

code suivant fonctionne parfaitement bien pour moi. Notez que la classe Server doit avoir accès à la classe Message dans son chemin de classe et que la classe Message implémente Serializable.

Client:

class Client { 
    private Socket clientSocket; 

    public void connectToServer() 
    { 
     String sServer="localhost"; 
     int PORT = 8181; 
     try { 
      InetAddress host = InetAddress.getByName(sServer); 
      clientSocket = new Socket(host, PORT); 
     } 
     catch (Exception e){ 
      e.printStackTrace(); 
     } 
    } 

    public void sendMessage(String sText,int iCommand) throws IOException { 
     Message outMessage = new Message(); 

     outMessage.setCOMMAND(iCommand); 
     outMessage.setsMessage(sText); 

     ObjectOutputStream oos = new ObjectOutputStream(clientSocket.getOutputStream()); 
     try { 
      oos.writeObject(outMessage); 
      oos.flush(); 
      oos.reset(); 
     } catch (IOException ex) { 
      ex.printStackTrace(); 
     } 
    } 

    public static void main(String[] args) { 
     Client c = new Client(); 
     c.connectToServer(); 
     try { 
      c.sendMessage("test message", 42); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

class Message implements Serializable { 
    private int iCommand; 
    private String sText; 

    public void setCOMMAND(int iCommand) { 
     this.iCommand = iCommand; 
    } 

    public void setsMessage(String sText) { 
     this.sText = sText; 
    } 

    @Override 
    public String toString() { 
     return "Message{" + 
       "iCommand=" + iCommand + 
       ", sText='" + sText + '\'' + 
       '}'; 
    } 
} 

Serveur:

class Server { 
    public static void main(String[] args) throws IOException { 
     ServerSocket serverSocket = new ServerSocket(8181); 

     do { 
      Socket s = serverSocket.accept(); 
      try { 
       processClient(s); 
      } catch (ClassNotFoundException e) { 
       e.printStackTrace(); 
      } 
     } while (true); 
    } 

    private static void processClient(Socket s) throws IOException, ClassNotFoundException { 
     ObjectInputStream ois = new ObjectInputStream(s.getInputStream()); 
     Message message = (Message) ois.readObject(); 
     System.out.println(message.toString()); 
    } 
}