Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Tician

Frischling

  • »Tician« ist der Autor dieses Themas

Beiträge: 32

Wohnort: Bad Friedrichshall

Beruf: FISI

  • Private Nachricht senden

1

08.07.2016, 10:03

Start in die Netzwerkprogrammierung

Moinsen,

ich würde gerne (auch Berufsbedingt) ein wenig in die Netzwerktechnik in der Programmierung mit C# einsteigen.
Die Umegbung ist erstmal nur ein lokales Netzwerk mit festen IP-Adressen und deaktivierter Firewall.
Benutzen möchte ich nur Visual Studio. Die Idee ist eine Client-Server-Struktur zu haben. Ich habe mir ein paar Beispiele angesehen und anhand denen versuche ich mit das was ich brauche abzuleiten, aber ich würde mich immer noch Laie nennen weswegen ich hier im Hilfe und Feedback fragen möchte bevor ich mich an den Code mache.
Wie man einen Kreis erzeugt und diesen über die Pfeiltasten bewegt weiß ich und funktioniert auch.

Meine Idee ist nun das ich gerne einen Client hätte der sich zu einem Server verbinden und die Position des Punktes immer wieder an den Server sendet. Dann soll sich ein 2. Client verbinden und der Server soll die Punkte so synchronisieren das beide "Spieler" sich selbst bewegen können und den jeweils anderen auch sehen wie er sich bewegt.

Für mich würde das theoretisch (ohne Vorwissen) Code-mäßig so aussehen:
Der Server empfängt Verbindungen über einen definierten Port über seine IP-Adresse, das würde ich vermutlich noch hinbekommen. Er "lauscht" (listener?) auf Daten (x und y koordinate des Kreises) und gibt diese an andere CLients weiter.
Der Client beinhaltet die ganze Logik zum Spiel, muss aber irgendwie angewiesen werden für jeden Client der sich zum Server verbinden einen "Punkt" zu zeichnen der sich natürlich auf der richtigen Koordinate befindet und ebenfalls Daten zu empfangen.
Schlagt mich nicht wenn das hier kompletter Unfug ist ;(

Praktisch glaube ich das ich erstmal auf tausend Probleme treffen werde weil ich viele Dinge noch gar nicht bedacht habe oder es einfach nicht so ist wie ich es mir vorstelle.
Was sagt ihr dazu, gibt es vielleicht doch einen einfacheren Einstieg?

fraggr

unregistriert

2

08.07.2016, 13:22

ich würde mich immer noch Laie nennen weswegen ich hier im Hilfe und Feedback fragen möchte bevor ich mich an den Code mache. [...] Praktisch glaube ich das ich erstmal auf tausend Probleme treffen werde weil ich viele Dinge noch gar nicht bedacht habe oder es einfach nicht so ist wie ich es mir vorstelle.
So ist es und darum solltest du einfach mal anfangen, anstatt schon um Hilfe zu bitten, bevor du überhaupt eine konkrete Frage hast.

Der einfachere Einstieg ist ein Echo-Server, der einfach einen empfangenen Text an den Client zurücksendet. Damit würde ich anfangen.

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

3

08.07.2016, 13:26

Wie fraggr schon sagt erst mal anfangen. Dafür kannst du dir zum Beispiel die Tutorials auf MSDN zu dem Thema ansehen. Ein Echo-Server wäre da wie fraggr schon sagt ein sehr minimales Beispiel für den Anfang. Ansonsten würde ich bei deinem Programm erst mal gucken dass Server und 1 Client miteinander zurecht kommen. Danach kannst du dich dann an weitere Clients machen. Schön alles Schritt für Schritt.
Je nachdem wie gut du dich mit Multithreading auskennst solltest du dir vielleicht mal asynchrone Übertragung ansehen. Dann musst du die Threads nicht selbst verwalten. Das macht dir sicher erst mal einfacher.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

KeksX

Community-Fossil

Beiträge: 2 107

Beruf: Game Designer

  • Private Nachricht senden

4

08.07.2016, 17:39

Wenn du wie Schorsch schon sagt mit async / multithreaded anfangen möchtest, kannst du dir mal boost/asio anschauen:
http://www.boost.org/doc/libs/1_61_0/doc…boost_asio.html

Ich hab erst in diesem Semester für Verteilte Systeme damit gearbeitet, kanns nur empfehlen :)
WIP Website: kevinheese.de

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

5

08.07.2016, 19:34

Wenn du wie Schorsch schon sagt mit async / multithreaded anfangen möchtest, kannst du dir mal boost/asio anschauen:
http://www.boost.org/doc/libs/1_61_0/doc…boost_asio.html

Ich hab erst in diesem Semester für Verteilte Systeme damit gearbeitet, kanns nur empfehlen

ich würde gerne (auch Berufsbedingt) ein wenig in die Netzwerktechnik in der Programmierung mit C# einsteigen.


Boost ist nicht C# sondern C++. Hast vermutlich nicht genau gesehen. Aber Async gibt es schon fertig von .Net, brauchst also keine externen Bibliotheken.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

KeksX

Community-Fossil

Beiträge: 2 107

Beruf: Game Designer

  • Private Nachricht senden

6

08.07.2016, 19:37

Narf, das ist der Schlafmangel. Ich hab C++ gelesen.

Mein Fehler.
WIP Website: kevinheese.de

Toemsel

Treue Seele

Beiträge: 310

Wohnort: OÖ

Beruf: Student und Programmierer

  • Private Nachricht senden

7

08.07.2016, 19:53

Eigenwerbung: Schau mal bei meinem Thread vorbei.

Probleme werden genauso bei der Synchronisation auftreten.
Wird jede noch so kleine Bewegung synchronisiert, wirst du das Netzwerk oder den Buffer auslasten.
Synchronisierst du nur in kleinen Intervallen, wird das Spiel "laggs" aufweisen.
Hierbei gibt es viele Lösungsmöglichkeiten. (z.B Richtungsvektoren mit Geschwindigkeiten, Interpolation etc...)

Das Senden + Empfangen sollte an sich mit C# kein Problem sein.
Da wird die Server/Client Logik anspruchsvoller ;)

xardias

Community-Fossil

Beiträge: 2 731

Wohnort: Santa Clara, CA

Beruf: Software Engineer

  • Private Nachricht senden

8

08.07.2016, 20:21

Als einfacher Einstieg in den Netzwerkkram bietet es sich auch an eine kleine Chatfunktion zu schreiben. Chatnachrichten nehmen einen aehnlichen Pfad wie andere Nachrichten spaeter und es laesst sich einfach testen.

Tician

Frischling

  • »Tician« ist der Autor dieses Themas

Beiträge: 32

Wohnort: Bad Friedrichshall

Beruf: FISI

  • Private Nachricht senden

9

15.07.2016, 11:52

Ich habe es mal soweit geschafft das ich eine Eingabe machen kann und diese vom Server zurück gegeben wird.
Es gibt wirklich wenig im Internet das mich anspricht und das ich auch verstehe, MSDN gehört meist nicht dazu, war diesmal aber hilfreich (auch wenn ich ein paar Dinge noch nicht ganz verstehe)

Angefangen hatte ich hiermit
http://stackoverflow.com/questions/10182…ive-simple-text
das habe ich noch super verstanden und es ist meiner Meinung nach einfach gehalten.

Weitergemacht und fertig gestellt dann doch mit MSDN's Lösung zu einer Schleife um Daten einzulesen.
https://msdn.microsoft.com/de-de/library…(v=vs.110).aspx
Wie gesagt 100% hab ich es nicht verstanden, aber ich habe es mir so hingebogen das es funktioniert.

Hier mal der Code für Server und für CLient:

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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
using System.Net.Sockets;
using System.Net;
using System.Threading;

namespace ChatServer
{
    public class Program
    {

        static void Main(string[] args)
        {
            const int port = 31243;
            TcpListener listener = null;

            try
            {
                //start listen to Port
                Console.WriteLine("Start server...");
                listener = new TcpListener(IPAddress.Any, port); //Every Computer is allowed
                listener.Start();
                Console.WriteLine("Server started!");

                //Buffer for reading data
                byte[] buffer = new byte[256];

                while (true)
                {
                    //establish connection
                    Console.WriteLine("Listening on port " + port);
                    Console.WriteLine("Waiting for connection...");
                    TcpClient client = listener.AcceptTcpClient();
                    Console.WriteLine("Connection Established!");

                    NetworkStream inOut = client.GetStream();

                    int i;

                    //Loop to receive data by client
                    while ((i = inOut.Read(buffer, 0, buffer.Length)) != 0)
                    {
                        //convert the data back to string and show it
                        string data = Encoding.ASCII.GetString(buffer, 0, i);
                        Console.WriteLine("Received: " + data + " with " + i + " bytes");

                        //Write Back the text to the client
                        Console.WriteLine("Sending back: " + data);
                        inOut.Write(buffer, 0, i);
                    }
                    //Close connection
                    client.Close();
                    Console.WriteLine("Connection closed");
                    Console.ReadKey();
                }      
            }
            catch (Exception e)
            {
                throw new Exception("Error: ", e); //funktioniert nicht
            }
            finally
            {
                //stop listening for new clients
                listener.Stop();
            }
        }
    }
}

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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Threading;
using System.IO;
using System.Net;
using System.Net.Sockets;
using System.Security;
using System.Security.Permissions;

namespace ChatClient
{
    public class Program
    {
        static void Main(string[] args)
        {
            TcpClient client = null;
            try
            {
                //type the Server IP
                Console.WriteLine("Insert IP from Server: ");
                string ip = Console.ReadLine();

                //open connection
                client = new TcpClient(ip, 31243);
                NetworkStream inOut = client.GetStream();

                while (true)
                {
                    //read text to send
                    Console.WriteLine("Connection established!");
                    Console.WriteLine("Something to send to server: ");
                    string eingabe = Console.ReadLine();

                    //convert and send
                    byte[] bytes = ASCIIEncoding.ASCII.GetBytes(eingabe);
                    Console.WriteLine("Sending...");
                    inOut.Write(bytes, 0, bytes.Length);

                    //read back
                    byte[] bytesToRead = new byte[client.ReceiveBufferSize];
                    int answer = inOut.Read(bytesToRead, 0, client.ReceiveBufferSize);

                    //convert and output
                    string answerString = ASCIIEncoding.ASCII.GetString(bytesToRead, 0, answer);
                    Console.WriteLine("From Server: " + answerString);
                }              
            }
            catch
            {
                Console.WriteLine("Error. Programm wird beendet");
                Console.ReadKey();
            }
            finally
            {
                client.Close();
            }
        }
    }
}


Jetzt habe ich erstmal das Problem das wenn ich den Client schließe mein Server crasht - wie verhinder ich das?

Nimelrian

Alter Hase

Beiträge: 1 216

Beruf: Softwareentwickler (aktuell Web/Node); Freiberuflicher Google Proxy

  • Private Nachricht senden

10

15.07.2016, 12:28

Was passiert denn auf der Serverseite, wenn der Client die Verbindung schließt?
Ich bin kein UserSideGoogleProxy. Und nein, dieses Forum ist kein UserSideGoogleProxyAbstractFactorySingleton.

Werbeanzeige