# Thread gibt Nachrichten mehrmals aus (Messenger in Java)



## Alex (15. Jan 2004)

Hi Leute,

ich arbeite zur Zeit an einem Messenger und mein Problem ist, dass der Thread der beim Server für
die Annahme der Nachrichten des Clients zuständig ist die Nachrichten bei der ersten Nachricht 1x,
bei der zweiten Nachricht 2x, bei der dritten Nachricht 3x und so weiter ausgibt.

Nun aber erstmal ein paar Worte zum Aufbau des Programms. Der Messenger nur für die Kommunikation im LAN gedacht. Der Client schickt seine Nachrichten als Vector. In einem Vector steht immer Nachricht, Sender, Empfänger.
Der Server hat einen Thread der mittels einer endlosschleife überprüft ob ein Vector bei ihm angekommen ist.
Sobald eine Nachricht beim Server ankommt schreibt der Thread den Nachrichtentext in das Nachrichtenlogfenster
des Servers.
Wie schon oben beschrieben wird bei der ersten Nachricht die der Client sendet die Nachricht 1x ausgegeben, beim zweiten mal 2x und so weiter.

Ein Beispiel:

1. Nachricht
Nachricht: Hallo
Ausgabe auf dem Server: Hallo

2. Nachricht
Nachricht: Wie gehts dir
Ausgabe auf dem Server: Wie gehts dir
                                      Wie gehts dir

3. Nachricht
Nachricht: Schönes Wetter heute
Ausgabe auf dem Server: Schönes Wetter heute
                                      Schönes Wetter heute        
                                      Schönes Wetter heute        

Wie ihr seht wird mit jedem mal der Thread einmal mehr ausgeführt. Ich habe zuerst gedacht das könnte daran liegen, dass das vielleicht daran liegt, dass im InputStream noch Fragmente der alten Nachricht vorhanden sind aber dann würde die zweite Nachricht ja lauten: Hallo, Wie gehts dir.

So, jetzt habe ich genug geredet. Ich hoffe jemand von euch hat sich mit diesem oder einem ähnlichen Problem schonmal rumgeschlagen und kann mir helfen.

Vielen Dank im voraus

Alex


----------



## sigma (15. Jan 2004)

kannst du mal den souce posten wo du die daten bekommst und wieder ausgibst.


----------



## Alex (15. Jan 2004)

Hi sigma,

hier ist der Source von dem Server Thread:


```
import java.io.*;
import java.io.Serializable;
import java.net.*;
import java.util.Vector;

public class ClientThread extends Thread implements Serializable{
    
     String message = null;
     String user_from = null;
     String user_to = null;
     Vector messageVektor = new Vector();
     
     private ClientSocket m_clientSocket = null;
     private Server m_server = null;
     private Socket m_socket = null;
     private BufferedReader m_in  = null;
     private PrintWriter m_out = null;
			
     public ClientThread(ClientSocket clientSocket, Server server) {
          m_clientSocket = clientSocket;
          m_server = server;
          m_socket = clientSocket.getSocket();
				
          if(m_socket != null) {
               try {
	     m_in  = new BufferedReader(new InputStreamReader(m_socket.getInputStream()));
	     m_out = new PrintWriter(new OutputStreamWriter(m_socket.getOutputStream()));
               }
               catch(IOException e) {}
	
          }
     }

     public void run() {
          if(m_socket != null && m_in != null && m_out != null) {
               
               m_server.log(m_server.getTime() + "   " + m_clientSocket.getNickname() + " enters client thread");
               String strBuffer=null;
               Vector messageVektor=null;
               InputStream i_stream;
               ObjectInputStream ios;
										
	for(;;)  {
	     try {										          i_stream = m_socket.getInputStream();
	          ios = new ObjectInputStream(i_stream);
	          messageVektor = (Vector)ios.readObject();
                     }		
	     catch(Exception e) {
	          System.out.println("Fehler beim lesen des Objekts");
	     }
				
	     if(messageVektor!=null) {
	          m_server.logmsg(m_server.getTime() + "   " + messageVektor.get(2) + " sagt zu " +
                                                    messageVektor.get(3) + ": " + messageVektor.get(1));
   	          messageVektor=null;
	     }
	     else {
	          System.out.println("IOException by Client");
	          break;
	     }					
               }
          }							
     }
}
```


----------



## Alex (15. Jan 2004)

Mir ist da gerade noch etwas zu dem Problem aufgefallen was vielleicht zur Lösung des Problems beitragen könnte.

Und zwar kommt der Nachrichtentext der in dem Vector gesendet wird aus einer TextArea. Wenn ich jetzt
nach der Funktion NachrichtSenden(nachrichtentext, sender, empfänger) die TextArea mit .setText(String); auf einen
anderen Wert setze dann wird genau dieser Wert bei den Wiederholungen angezeigt.


```
public void keyReleased(KeyEvent ke1) {
     if( ke1.getKeyCode() == KeyEvent.VK_F9 ) { 
          sendMessage(ta_messagetext.getText(), t_nick.getText(), ta_useronline.getSelectedItem()); 	
          f_main2.hide();  //Das Nachrichteneingabefenster schliessen
     }		   	
}
```

Der Vollständigkeit halber schreibe ich hier noch mal den Source von sendMessage hinterher



```
public void sendMessage(java.lang.String message, java.lang.String user_from, java.lang.String user_to) {
     if(m_socket != null) {
          messageVektor.removeAllElements();
          messageVektor.add(0, "[/START_Message]");
          messageVektor.add(1, message);
          messageVektor.add(2, user_from);
          messageVektor.add(3, user_to);
										
          try {				
               OutputStream os = m_socket.getOutputStream();
               oos = new ObjectOutputStream(os);				
               oos.writeObject(messageVektor);
               oos.flush();
          }
          catch(Exception ioex) {
               sendLog("User: " + t_nick.getText() + " Nachricht in Vektor schreiben fehlgeschlagen");
          }							
     }		
}
```

Gruß

Alex


----------

