# Login Chatsystem



## HawkofHell (19. Jun 2007)

Nach einem langen Leidensweg, mit einigen Tutorials und mehr oder weniger unbrauchbaren Fremdcodeschnippsel, bin ich nun hier gelandet.

Ich versuche eigentlich nur einen recht simplen *Chatserver* zu schreiben, der ein *Login System *(MySQL) unterstützt & verschiedene *Räume* hat. Viel mehr auch nicht (außer Standartbefehle)...
Prinzipiell, verwöhnt von Sprachen wie C# & PHP, machte ich mich also an die Arbeit... und verzweifle nun seit 3 Monaten schon am Grundansatz. 

Eine einfache Client -> Server verbindung klappt schonmal, bloß da tut sich natürlich schonmal die Grundsätzliche Frage auf, wie realisiere ich das Login?
Prinzipiell ist es ja nur 'einfaches' akzeptieren der Verbindung des Clienten, Lesen der Logindaten, Vergleichen mit der SQL & dann zuweisen bei den Objekten der Klassen Chatter & später dann Room, die die jeweilligen Informationen des Chatters beinhalten sollen, insbesondere der Verbindungsdaten...
Room sollte außerdem die ganzen *Sockets per Multiplex* mit Daten rein und raus Versorgen, da es eventuell zu großen Auslastungen kommen kann, doch so richtig klappt auch das nicht. So richtige Tutorials habe ich dazu bisher auch nicht gefunden...

Irgendwie bekomm ich es nicht richtig hin... Wenn jemand einen Denkansatz posten könnte, einen Beispielcode oder so wäre das Ideal, denn ich glaube ich bin schon vom Ansatz her vollkommen falsch. Jemand, der mir sowas 'schnell' mal programmiert, kann sich als meine Gottheit ansehen.

Bitte helft einen armen, unwissenden Programmierer  :cry:


----------



## HawkofHell (19. Jun 2007)

Nachdem ich mir 3 Kannen Kaffe hinter die Ohren gekippt habe, ist mir nun doch eine Lösung eingefallen, bloß es gibt da noch einige Problemchen.

*Multiplex für Socket Threads*
Nicht implementiert... Beispiele?

*Räume*
Also... ich habe die Räume in einer static LinkedList gespeichert. Nun möchte ich auf einen der Räume zugreifen und den Raum als Rückgabewert einer Prozedur übergeben, damit ich damit weiterarbeiten kann (z.B. User hinzufügen).
Aber es klappt leider nicht...


```
/**
 * Diese Prozedur sucht nach dem Vorkommen des Strings Name in der Raumliste und übergibt dann
 * den Raum als solches. Class: Communication.
 * @param Name => Der Raumname
 * @return => Einen Raum
 */
public static Room isRoom(String Name)
{
	Room raum = new Room();
	
	for(int i = 0; i<Startup.Raeume.size(); i++)
	{
			raum = (Room) Startup.Raeume.get(i);
			if(raum.getRoomName()==Name)
			{
				return (Room) Startup.Raeume.get(i);
			}
	}
	return null;
}
```

Damit wird dann wie folgt weitergearbeitet:

```
Room isRoom = Communication.isRoom(this.Roomname);
if(isRoom!=null && isRoom.getRoomName()==this.Roomname)
{
		isRoom.addChatter(this);
}
else
{
out.print("Room full or non existent - sorry");
}
```

*Login - Lesen der Werte*
Beim Lesen der Werte für das Login (Nickname, Passwort...) passiert es, dass folgender Code, immer zu einem 'Nick existiert nicht' führt...

```
this.Nickname = (String)in.readLine();
if(this.Nickname == "HawkofHell")
{
out.println("Funzt");
}
else
{
out.println("Nick existiert nicht");
}
```
Aber warum? Bei der Ausgabe kommt immer "HawkofHell" als Wert von this.Nickname raus, trotzdem ist es nicht "HawkofHell"...


----------



## FelixR (19. Jun 2007)

```
this.Nickname = (String)in.readLine();
if(this.Nickname.equals("HawkofHell"))
{
out.println("Funzt");
}
else
{
out.println("Nick existiert nicht");
}
```


Bei Strings immer Equals verwenden.


----------



## HoaX (19. Jun 2007)

gleiches bei deinem room-zeug - wieso erstellst du oben einen neuen raum der eh nie verwendet wird? außerdem erwarte ich bei einer funktion die mie "is" anfängt dass sie einen boolean zurück gibt. was du da hast ist ehr ein "getRoomByName". die liste mit den räumen würde ich nicht statisch machen - man will ja vielleicht mal mehrere server erstellen können ...


----------



## HawkofHell (20. Jun 2007)

HoaX hat gesagt.:
			
		

> wieso erstellst du oben einen neuen raum der eh nie verwendet wird?


Er wird Verwendet, es ist nur ein Codeausschnitt :wink:
Außerdem werde ich ihn warscheinlich fürs spätere Multiplex benötigen. 



			
				Hoax hat gesagt.:
			
		

> außerdem erwarte ich bei einer funktion die mie "is" anfängt dass sie einen boolean zurück


Okay... akzeptiert.



			
				Hoax hat gesagt.:
			
		

> die liste mit den räumen würde ich nicht statisch machen - man will ja vielleicht mal mehrere server erstellen können ...


Ich bin Faul, ein anderer Zugriff auf die Liste - von meiner Programmstruktur aus - würde zu viel meiner Lebenszeit im Anspruch nehmen. Außerdem habe ich nicht vor mehrere Server davon zu erstellen, falls ein anderer das will: Heute gibt es schöne Virtualisationstechnologien  :bae: 



			
				FelixR hat gesagt.:
			
		

> Bei Strings immer Equals verwenden.


Ich danke dir ... bin noch viel zu C# verwöhnt, hätte ich mir aber auch denken können. Problem war, dass er den Speicherbereich verglichen hat, ne? Hätt ich auch selber drauf kömmen können...  :roll:


----------



## HawkofHell (11. Jul 2007)

Da meld ich mich doch mal wieder zurück... der Chatserver mit Sockets, Loginsystem & MySQL läuft soweit ganz gut. Die Performance ist für java.io.* eigentlich auch gar nicht mal so schlecht, soweit ich das beurteilen kann, aber man will sich ja ständig weiterbilden und nun bin ich auf *java.nio.** gestoßen   

An sich ein (finde ich) einfaches Konzept, was sehr flexibel ist und blaa blaaa... aber ich hab nen Problem bei dem empfangen von Messages vom Clienten zum Server (andersherum klappts auch noch nicht so ganz, aber da probier ich nochn bissl rum, das wird schon noch)

Die NullPointerException ist gegessen, war ein unglücklicher Sprung in einen catch() Block, der nicht sein sollte 

Er liest trotzdem nichts... Geschweige denn schreibt etwas... *säufz*
Ich hab mal alle Klassen die dazugehören hochgeladen, wenn jemand so nett wäre, sie mal durchzuschauen, wäre ich ihm echt verbunden.

multiplexServer

Die Klasse die mir insbesondere Sorgen macht:

```
package multiplexServer;

import java.nio.channels.*;
import java.util.Iterator;
import java.util.Set;
import java.io.*;


public class tInput extends Thread {

protected Selector iSelector;
protected Set selectedKeys;
public void addChannel(SocketChannel channelname)
{
	try
	{
		System.out.println("da");
		channelname.register(this.iSelector, SelectionKey.OP_READ); // Momentan hängt er - genau wie vorher - hier. "da" gibt er noch aus, aber "hier" streikt er leider :(
		System.out.println("hier");
	}
	catch(ClosedChannelException e)
	{
		System.err.println(e.toString());
	}
}

public Selector getSelector()
{
	return this.iSelector;
}

public void run()
{
	try
	{
		initialize();
		while (true) 
		{
			int ready = this.iSelector.select(5000);
			if (ready == 0) continue; 
			selectedKeys = this.iSelector.selectedKeys();
			Iterator it = selectedKeys.iterator();
			while (it.hasNext()) 
			{
				SelectionKey key = (SelectionKey) it.next();
				if ((key.readyOps() & SelectionKey.OP_READ)==SelectionKey.OP_READ)
				{
					SocketChannel sc = (SocketChannel) key.channel();
					//TODO ReadingAll
				}
				it.remove();
			}
		}
	}
	catch(IOException e)
	{
		System.err.println(e.toString());
	}
}

public void initialize()
{
	try
	{
		this.iSelector = Selector.open();
	}
	catch(IOException e)
	{
		System.err.println(e.toString());
	}
}


}
```


----------

