package example;
import gdwNet.server.BasicClientConnection;
import gdwNet.server.BasicServer;
import gdwNet.server.ConnectionInfo;
import gdwUtils.DefaultCharSet;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.util.HashSet;
/**
* Beispielimplementierung für den Server.
* So eine Klasse müsst ihr auch haben. Sie ist euere Anlaufstelle, wenn ihr Nachrichten bekommt
* oder über einen Verbindungsaufbau bzw. -abbau informiert werdet. Hier könnt ihr auch Steuern ob
* ein Client abgewiesen wird(vielleicht mögt seinen Nick nicht)
* @author firen
*
*/
public class ChatServer extends BasicServer
{
private ServerCoreLoop coreLoop;
private HashSet<String> takenNames;
/**
* Ihr müsste der Basisklasse die Spieleranzahl und den Infotext übergeben
* @param maxPlayer Maximale Spieleranzahl die ihr erlauben wollt
* @param infoText Der Text, der dem Client bei einer Listeabfrage gesendet wird.
* @throws IOException Ja es kann sein das es Probleme gibt bei erstellen der Netzwerkschnitstellen,
* dies ist meistens der Fall falls noch ein Serverläuft. Eingestellter Port wird bereitsverwendet.
*/
public ChatServer(int maxPlayer, String infoText) throws IOException
{
super(maxPlayer, infoText,false,false);
this.takenNames = new HashSet<String>();
this.coreLoop = new ServerCoreLoop(this);
this.coreLoop.start();
}
public static void main(String[] args)
{
try
{
new LogViewerChatServer().setRef(new ChatServer(5,
"Chatserver"));
} catch (IOException e)
{
e.printStackTrace();
System.exit(2);
}
}
/**
* Ein Client möchte sich verbinden, so schaut nach was er möchte und winkt ihn durch oder
* nicht.
* Gebt ihn dieser Klasse die von {@link BasicClientConnection} abgeleitet ist wenn ihr ihn akzeptiert
* oder eine <code>null</code> wenn nicht.
*
* @param info Enthällt alle Informationen
*/
@Override
protected BasicClientConnection incomingConnection(ConnectionInfo info,
ByteBuffer data)
{
try
{
byte[] arr = new byte[data.get()];
data.get(arr);
String name = new String(arr, DefaultCharSet.getDefaultCharset());
if(name.equalsIgnoreCase("idiot"))
{
return null;
}else if(this.takenNames.contains(name))
{
return null;
}else
{
return new MyBasicClientConnection(info, this, name);
}
}catch (Exception e)
{
return null;
}
}
/**
* Ein Spieler hat die Verbindungverloren, das kann euer verschulden sein(kick)
* oder er hat einfach die Verbindung verloren.
* @param client Eine Referenz auf den Spieler
*/
@Override
protected void playerDisconnected(BasicClientConnection client)
{
this.coreLoop.addLeaverName(((MyBasicClientConnection)client).name);
}
/**
* Eine Chatnachricht kommt rein, diese Methode ist von mir für Beispielzwecke.
*
* @param name Der Nickname vom Spieler
* @param msg Die ChatNachricht
*/
protected void chatIncom(String name, String msg)
{
this.coreLoop.addMessage(name + ":> " + msg);
}
@Override
protected void playerReconnected(BasicClientConnection client)
{
this.coreLoop.addJoinerName(((MyBasicClientConnection)client).name);
}
}