C# TCP Client design frage

07/03/2011 01:01 Atheuz#1
Ich stehe im Moment vor einer Frage, ich habe eine Konsolenanwendung die sich auf einen Server verbindet und je nach antworten des Servers reagiert. Ein clientless bot eben. Allerdings stehe ich vor einem Problem wie ich das ganze nun gestalten soll, ich habe mit der Basis des codes was ich gerade benutze einen ähnlichen Bot erstellt gehabt der das Auktionshaus gecrawled hatte. War mir allerdings irgendwie zu unsicher in der Lauffähigkeit.

Hier mal etwas Pseudocode

PHP Code:
void main()
{
client.connect("blablabla",7777);
while(
true)
{
  
DoEvents(readstream());
}
client.Close();

PHP Code:
DoEvents(networkstream stream)
{
  if(
blablabla regex oder contains)
   {
     
tu das
   
}
  
Hier folgen dann dutzend andere if anweisungen

Mein Problem ist jetzt einfach das ich einen sehr simplen event handler in einer while schleife habe wo ich zum server verbunden bin, und viele if anweisungen in der doevents funktion habe. Ich übergebe also den stream bzw eigentlich nur das letzte packet der funktion welche dann daraufhin antwortet.

Gibt es irgendwelche anderen Wege damit ich so ein Bot leichter gestalten kann? Bin wohl etwas dumm gerade was OOP angeht.
07/03/2011 01:24 boxxiebabee#2
Quote:
Originally Posted by Atheuz View Post
Ich stehe im Moment vor einer Frage, ich habe eine Konsolenanwendung die sich auf einen Server verbindet und je nach antworten des Servers reagiert. Ein clientless bot eben. Allerdings stehe ich vor einem Problem wie ich das ganze nun gestalten soll, ich habe mit der Basis des codes was ich gerade benutze einen ähnlichen Bot erstellt gehabt der das Auktionshaus gecrawled hatte. War mir allerdings irgendwie zu unsicher in der Lauffähigkeit.

Hier mal etwas Pseudocode

PHP Code:
void main()
{
client.connect("blablabla",7777);
while(
true)
{
  
DoEvents(readstream());
}
client.Close();

PHP Code:
DoEvents(networkstream stream)
{
  if(
blablabla regex oder contains)
   {
     
tu das
   
}
  
Hier folgen dann dutzend andere if anweisungen

Mein Problem ist jetzt einfach das ich einen sehr simplen event handler in einer while schleife habe wo ich zum server verbunden bin, und viele if anweisungen in der doevents funktion habe. Ich übergebe also den stream bzw eigentlich nur das letzte packet der funktion welche dann daraufhin antwortet.

Gibt es irgendwelche anderen Wege damit ich so ein Bot leichter gestalten kann? Bin wohl etwas dumm gerade was OOP angeht.
such mal in google einfach nach "socket client server codeproject"
07/03/2011 13:42 ms​#3
Ich weiß nicht genau, ob ich dein Problem so richtig verstanden habe. :o

Ich würde eine seperate Klasse à la "PacketParser" erstellen, mit einer Public-Methode wie "Recv". In deiner Main-Funktion wird diese Funktion dann in der Schleife ständig aufgerufen.

Diese Klasse zerteilt dann die ankommenden Pakete einzeln. Es kommt ja nicht immer genau 1 Paket an, manchmal sind es mehrere und manchmal auch nur der Bruchteil. Das kannst du dann in eine Klasse "Packet" verpacken, in das jedes Paket übersichtlich gespeichert wird (z.B. in Variablen wie "length", "opcode", etc.).

Dieses "Packet"-Objekt kannst du dann wieder an eine weitere Klasse wie "EventHandler" übergeben, die dann darauf reagiert.
07/04/2011 02:41 Atheuz#4
Quote:
Originally Posted by Lizzaran View Post
such mal in google einfach nach "socket client server codeproject"
Öhm, der Client ist fertig sowas brauche ich nicht und den GameServer gibt es ja schon.

Quote:
Originally Posted by Disconnect View Post
Ich würde eine seperate Klasse à la "PacketParser" erstellen, mit einer Public-Methode wie "Recv". In deiner Main-Funktion wird diese Funktion dann in der Schleife ständig aufgerufen.
Die Funktion dafür ist 4-6 Zeilen groß, dafür ne Klasse zu erstellen.. hmm.

Quote:
Originally Posted by Disconnect View Post
Diese Klasse zerteilt dann die ankommenden Pakete einzeln. Es kommt ja nicht immer genau 1 Paket an, manchmal sind es mehrere und manchmal auch nur der Bruchteil. Das kannst du dann in eine Klasse "Packet" verpacken, in das jedes Paket übersichtlich gespeichert wird (z.B. in Variablen wie "length", "opcode", etc.).

Dieses "Packet"-Objekt kannst du dann wieder an eine weitere Klasse wie "EventHandler" übergeben, die dann darauf reagiert.
Werde ich dann wohl so machen müssen da mir selber auch keine andere methode einfällt, wollte nur mal fragen was der census hier ist wie ein bot pakete abarbeiten soll.