Autor Beitrag
mrs doubtfire
Hält's aus hier
Beiträge: 4



BeitragVerfasst: Mo 01.02.10 19:59 
hallo leute,
hoffe das ich hier das thema nicht verpasst habe....
ich binn neu hier und brauche hilfe

ich habe vor ein pokerspiel zu schreiben, was über das netzwerk läuft, da poker an einem rechner ja eher sinnlos ist.....

das einziege was mir noch fehlt ist, das die daten der spieler über das lokale netz zu senden.
ich habe mir schon einige beispiele für client server verbindungen angesehen, die habe ich aber leider auch nicht so ganz verstanden..... :(
zu meinem problem:

ich möchte ein string [] von einem client zu einem server schicken, der soll dan die handlung auswerten, also ob wer die karten weg geworfen hatt.. und dieses dan an die anderen spieler weiterschicken, danach soll der nächste spieler den "Aufruf" bekommen das er dran ist usw, bis das spielr beendet ist

das man dazu einen stream reader/writer braucht habe ich inzwischen herraus gefunden,
aber das ist auch schon alles...

könnt ihr mir villeicht helfen wie ich das genau machen kann?
ich liebe zwar das programieren, habe aber keine ahnung von netzwerk funktionen
und wäre über eure hilfe sehr dankbar
danielf
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1012
Erhaltene Danke: 24

Windows XP
C#, Visual Studio
BeitragVerfasst: Mo 01.02.10 22:45 
Hallo und :welcome:,

den Stream hast du ja schon entdeckt ;) Um ein string Array zu versenden gibt es mehrere Möglichkeiten. Du könntest die einzelnen Strings aneinanderer Ketten und mit einem bestimmten Trennzeichen (Newline, "-", ":", usw.) trennen. Auf der Gegenseite muss man daraus nur wieder einen String machen.

Sollte also kein Problem sein. Wie deine Kommunikation aufgebaut ist, wird in einem Protokoll festgelegt.

Gruß Daniel
mrs doubtfire Threadstarter
Hält's aus hier
Beiträge: 4



BeitragVerfasst: Mo 01.02.10 23:13 
thx,
das mit dem aneinanderreihen habe ich auch schon gedacht, das wollte ich dam mit der # machen und das ganze mit der split funktion wieder aufteilen,

mein problem liegt eher darin, das ich nicht so genau weiß was man für den server/client alles braucht,

alsi ip und port ist klar,
aber irgendwo mussen die ip's ja auch im server gespeichert sein, ich muss ja wissen was zu wem kommt und wieviele spieler teilnehmen wollen

und wie ich nun was an was schicke weiß ich auch noch nicht so genau,

wäre nett, wen du mir son kleines "einfaches" beispiel gibst,

ich habe mir zwar schon einige server beispiele angesehen und auch ausprobiert, aber irgendwie war das alles nicht so das richtige.....

ich habe auch schon versucht selber einen server zu schreiben, aber immer wen ich den stram abgehört habe ist der da einfach nicht mehr von los gekommen...
dh. die daten wurden zwar über den server von client zu client geschickt, aber der server konnte nichts anderes und es funktionierte auch nur mit 2 clients

das habe ich aus nem chat beispiel abgewandelt, aber da ich nicht genau wusste was für was zuständig ist hat das nicht so ganz gklappt...

und ich fand den quelltext nur zum senden und empfangen der daten nen bischen lang, das waren an die 200 zeilen

kennst du da was einfacheres, wo man nur die ip und den port eingibt und das ganze wegschickt zum server?

also etwas was nicht so kompliziert ist?
danielf
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1012
Erhaltene Danke: 24

Windows XP
C#, Visual Studio
BeitragVerfasst: Mo 01.02.10 23:45 
In .NET gibt es dafür den TcpClient und TcpListener. Der die alle grundlegenden Aufgaben einer Netzwerkverbindung abnimmt.

Du musst dir jetzt halt überlegen, wie alles ablaufen soll. Wahrscheinlich ist das Einfachste eine Client/Server-Architektur. Sprich ein Spieler (oder auch Standalone-Programm) macht einen Server auf. Andere Clients können sich dann auf diesen Server connecten. Der Server informiert die angemeldeten Clients über diverse Sachen (wie zum Beispiel neuer Spieler, Flop gegeben, Race, usw.).

Vlt. solltest du zuerst ein einfaches Chat-Programm machen um zu verstehen, wie das ganze ablaufen soll.

Alternativ kannst du es dir auch komplizierter (aber sicher eleganter) mit WCF machen. Da kann ich dir aber nicht helfen :/
mrs doubtfire Threadstarter
Hält's aus hier
Beiträge: 4



BeitragVerfasst: Mo 01.02.10 23:55 
also ich wollte schon bei c# bleiben,

ich habe auch schon einige beispiele zu tcp gefunden, aber ich frage mich immernoch wo da die ip's der angemeldeten user sind
und wie man die verschiedenen streams dan adressiert,

bis jezt habe ich nur die aufgaben wer was machen soll, und was ich übertragen will

funktioniert das den, das ich immer nur einen client anschreibe und den stream dan wieder beende??

als ich das versucht habe hat der server dan keine weitere verbindung mehr aufbauen können..
danielf
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1012
Erhaltene Danke: 24

Windows XP
C#, Visual Studio
BeitragVerfasst: Di 02.02.10 10:34 
.NET ist nur das Framework. Du kannst als Programmiersprache schon C# verwenden, oder halt eine ander .NET-Sprache (Vb.NET, Visual C++, ...).

Du musst dem Server halt sagen, dass er ständig auf weitere Clients warten soll. Am Besten machst du einen Thread auf, in dem du nur auf neue Clients wartest. Wenn sich ein Client anmeldet schmeißt du ein Event, dass ein neuer Client anwesend ist.

Die Klasse legt standardmäßig automatisch (im Hintergrund) die eingehende Verbindung auf einen anderen Port, so dass du mehrere Verbindungen annehmen kannst.

Versuch fürs erste einfach einen simplen Server der mehrere Clients handeln kann zu programmieren. Zum Beispiel einen TimeServer für mehrere Clients. Wenn das geht brauchst du nur noch den "Inhalt" austauschen.
mrs doubtfire Threadstarter
Hält's aus hier
Beiträge: 4



BeitragVerfasst: Di 02.02.10 10:58 
also braucht jeder client seinen eigenen port?

kan man nicht alle über einen port laufen lassen?
danielf
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1012
Erhaltene Danke: 24

Windows XP
C#, Visual Studio
BeitragVerfasst: Di 02.02.10 12:34 
Zitat:
Die Klasse legt standardmäßig automatisch (im Hintergrund) die eingehende Verbindung auf einen anderen Port, so dass du mehrere Verbindungen annehmen kannst.


Versuch es doch einfach mal, dann wirst du schon merken, dass du nichts denken/tun musst ;)
Red2Devil
Hält's aus hier
Beiträge: 12



BeitragVerfasst: So 28.03.10 19:47 
Hallo,

ich bin zur Zeit auch dran ein Netzwerkprogramm zu schreiben und bin während der Suche in dem Forum auf diesen Beitrag hier gestoßen.
Ich habe bisher auch TCPClient und TCPListener benutzt und es funktioniert soweit ganz gut.
Ich bin soweit, dass mein Programm (Server-Seite) während der Laufzeit immer einen Port abcheckt, ob neue Verbindungen eingehen.

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
     static internal void server()
        {
            while (true)
            {
                Console.WriteLine("Function {0} start""server()");
                TcpListener listener = new TcpListener(IPAddress.Any, port);
                Console.WriteLine("Listening on Port {0}", port);
                try
                {
                    listener.Start();
                    Console.WriteLine("Start listening...");
                    while (!listener.Pending())
                    {
                        Console.WriteLine("No incoming requests - Waiting!");
                        Thread.Sleep(200);
                    }
                    clientSocket = listener.AcceptSocket();
                    Thread tacceptedSocket = new Thread(acceptedSocket);
                    tacceptedSocket.Start();
                }
                catch (Exception serverexc)
                {
                    Console.WriteLine("Error: {0}", serverexc);
                }
            }
        }


Die Konsolenausgaben könnt ihr erstmal ignorieren, da ich die nur zum testen drin hab.

Jedoch verstehe ich nicht ganz, wie das Programm jede Verbindung auf einen neuen Port umleiten sollte, da man doch nur einen Port angibt!?!?!?

Nachdem bei mir eine Verbindung erkannt wurde, wird ein neuer Thread erstellt indem dann später ein Datentransfer (Server: eigehend & Client: ausgehen) stattfinden soll.
Das ganze Programm soll im Sinne P2P laufen und stellt gleichzeitig Server und Client zur Verfügung.

Meine eigentlich Frage ist aber, wie ich per Socket dann Daten erhalte und auf Festplatte speichern kann!?!?!?
Es geht hier nicht um ein paar "strings" mit Textinhalten, sondern um Datenmengen, auch im Bereich 2GB, die von Rechner A nach Rechner B gesendet werden sollen. Sowas kann man natürlich nicht in einer Variable speichern.
Da ich gesehen habe, dass die Methode .Receive(); daten in ein byte[] Array speichern will, was eine bestimmte größe hat, weiß ich leider nicht genau, wie ich das zusammen mit der Klasse System.IO auf meinem rechner bekomme!?

Kann mir da vielleicht auch jemand kurz helfen das zu realisieren?

Das ganze muss ja irgendwie über eine while-Schleife zu realisieren sein, so in etwa:

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
byte[] bytearray = new byte[Size];
int size = 0;
while ((size = socket.Receive(bytearray, SocketFlags.None) > 0
{
    // ???? Mein Problem....
}


ist der Ansatz richtig oder geht das anders?

Ich danke euch schonmal
MoBBer
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 37
Erhaltene Danke: 1



BeitragVerfasst: So 04.07.10 20:12 
Hallo zusammen,

ich halte es nicht für nötig das die Ports umgeschrieben werden müssen du kannst dir ja eine Liste mit allen Clients und den NetzwerkStreams anlegen. Eventuell eine eigene Klasse damit die zusammen gehörigen in einem Objekt gespeichert sind.

Über Socket weiß ich auch nicht ich benutze immer den Netzwerk Stream habe hier mal eine allgemeine Senden und Erhalten Methode geschrieben.


ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
        public static void Senden(string daten)
        {
            //Den String in Bytes encodieren und auf den NetzwerkStream schreiben
            Byte[] datenBytes = Encoding.ASCII.GetBytes(daten);
            ns.Write(datenBytes, 0, datenBytes.Length);
        }
        
        public static string HoleString()
        {
            //Die Menge der abrufbaren Daten des TcpClients abfragen
            int menge = client.Available;
            //Solange keine Daten abrufbar sind
            while (menge == 0
            {
                //Menge der abrufbaren Daten abfragen
                menge = client.Available;
            }
            //Die Datenbytes Encodieren und den String zurück geben
            Byte[] datenBytes = new Byte[menge];
            ns.Read(datenBytes, 0, datenBytes.Length);
            string daten = Encoding.ASCII.GetString(datenBytes);
            return daten;
        }


Deine Datenmengen musst du dann an festgelegten Punkten trennen und wieder zusammensetzen