Thread gibt Nachrichten mehrmals aus (Messenger in Java)

  • Themenstarter Themenstarter Alex
  • Beginndatum Beginndatum
Status
Nicht offen für weitere Antworten.
A

Alex

Gast
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
 
Hi sigma,

hier ist der Source von dem Server Thread:

Code:
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;
	     }					
               }
          }							
     }
}
 
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.

Code:
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


Code:
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
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben