Autor Beitrag
paddy14
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 122



BeitragVerfasst: Do 10.03.11 12:42 
Guten Tag Forum,

ich hoffe das ihr mir weiterhelfen könnt.

Also ich habe mir einen kleinen Sever erstellt und einen Client.
Beides noch net fertig, also nicht wundern.

Meine frage ist wie bekomme ich das mit den Code den ich habe hin, das die Clients untereinander kommunizieren können.
Bisher habe ich es nur geschaft das diese mit den Server kommunizieren. Hier der Code.
ausblenden volle Höhe 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:
namespace server
{
    class Program
    {
        public static TcpListener server = null;
        public static void verbinden()
        {
            while (true)
            {
                string daten = "es geht";
                Console.WriteLine("thread gestartet");
                TcpClient c = server.AcceptTcpClient();                
                Console.WriteLine("Verbindung zustande gekommen C");
                new serverthread(c, daten);
                
                
                TcpClient d = server.AcceptTcpClient();
                new serverthread(d, daten);
                Console.WriteLine("Verbindung zustande gekommen D");
                
                
            }
            
        }
        static void Main(string[] args)
        {
            
            Console.WriteLine("starte Server...");
            IPAddress ip = IPAddress.Parse("192.168.2.103");
            int port = 13000;
            server = new TcpListener(ip, port);
            server.Start();
            Console.WriteLine("Server gestartet");
            Thread th = new Thread(new ThreadStart(verbinden));
            th.Start();
            

        }
    }
}

ausblenden volle Höhe 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:
namespace server
{
    class serverthread
    {
        
        private TcpClient connection;
        bool loop = true;
        public serverthread(TcpClient connection, string daten)
        {
            this.connection = connection;
            Thread empfang = new Thread(new ThreadStart(senden));
            Thread gesendet = new Thread(new ThreadStart(empfangen));
            empfang.Start();
            gesendet.Start();
            
        }
        
        public void senden()
        {
            
            string data;
            NetworkStream stream = this.connection.GetStream();
            byte[] empfangen = new byte[1024];
            while (loop)
            {
                try
                {
                    stream.Read(empfangen, 01024);
                    data = Encoding.ASCII.GetString(empfangen);
                    Console.WriteLine(data);
                }
                catch
                {
                    this.connection.Close();
                }
            }
            
        }

        public void empfangen()
        {            
            NetworkStream stream = this.connection.GetStream();
            byte[] gesendet = new byte[1024];
            while (loop)
            {
                try
                {
                    byte[] send = Encoding.ASCII.GetBytes(Console.ReadLine());
                    stream.Write(send, 0, send.Length);
                }
                catch
                {
                    this.connection.Close();
                }
            }

        }
    }
}

Falls Ihr Verbesserungsvorschläge habt oder wisst wie man es einfacher gestallten kann bitte ich euch es mir zusagen.
Danke!!!

---Moderiert von user profile iconNarses: Beiträge zusammengefasst---

weis denn keiner ne antwort???

das einzige was ich will ist das ich 2 clients miteinander verbinden kann aber ich weis nicht wie.

Hoffe ihr könnt mir das sagen.
Kha
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Do 10.03.11 19:08 
Das mit "Client" und "Server" darfst du nicht zu wörtlich nehmen - soll ein Client auch Verbindungen annehmen können, benötigt er eben wie ein Server einen TcpListener.

_________________
>λ=
paddy14 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 122



BeitragVerfasst: Do 10.03.11 19:50 
ok ich dachte ich bräuchte einen Server der die Verwaltung übernimmt.

Sprich ich hatte mir das so gedacht, der Client meldet sich über TcpClient client = ListnerAcceptTcpClient();
dann sende ich dem Server einen Stream Speichert ihn und dann wird der Weitergeleitet und umgekehrt.

Liege ich da so falsch???

Habe das so versucht bin aber gescheitert.

Hast du vllt nen Bsp. Code wo ich mir das ma anschauen kann wie sowas gemacht worden ist.

Stehe auf dem Schlauch.

Danke!!!

--- Moderiert von user profile iconKha: Beiträge zusammengefasst ---

Könnte man das vllt so machen??

In einem Thread lauscht der Listner, und in dem anderen Thread versucht er eine verbindung aufzubauen.

Ich würde mir das so vorstellen wenn ich den Client starte dann verbindet er sich zum Server, holt dich dort z.B. eine IP und den Port meiner Wahl.
Dann schließt er die Verbindung und versucht sich zum anderen Client zu verbinden, da dieser ebenfalls "lauscht" nimmt er die Verbindung an und ich kann direkt mit Ihm schreiben.

Wäre das so etwa Inordnung, könnte das so klappen????

Vllt könntest du mir auch mal in einer Kurzfassung erklären wie das z.B. bei icq geregelt ist damit ich grobe Vorstellungen davon habe.

Zu meiner Verteidigung, ich habe erst vor 3 Tagen angefangen mit Objekten und Klassen zu arbeiten, sprich noch so gut wie keine Erfahrung.

Hoffe das du mir da weiterhelfen kannst.

DANKE!!!!
Kha
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Do 10.03.11 20:35 
user profile iconpaddy14 hat folgendes geschrieben Zum zitierten Posting springen:
Vllt könntest du mir auch mal in einer Kurzfassung erklären wie das z.B. bei icq geregelt ist damit ich grobe Vorstellungen davon habe.
Ich bin erstmal von Intranet ausgegangen; übers Internet verwenden übliche Chat-Protokolle tatsächlich einen Server, über den jegliche Kommunikation läuft. In dem Fall bruachen deine Clients also doch keinen Listener. Viel mehr kann ich zum Thema Netzwerk aber auch nicht sagen :nixweiss: .

_________________
>λ=
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19272
Erhaltene Danke: 1740

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Do 10.03.11 23:09 
Wenn du einen Chat übers Internet realisieren willst, brauchst du einen Server, der von außen erreichbar ist. Zu dem verbinden sich die Clients.

Alles wird an den Server geschickt, der leitet es dann an die Empfänger weiter.

Direkt mit einem anderen Client verbinden ist nicht so trivial, da die ja normalerweise nicht von außen erreichbar sind. Das Stichwort ist hier "hole punching". So kann man auch die Clients direkt verbinden. Ein unabhängiger Server ist aber in jedem Fall notwendig.
paddy14 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 122



BeitragVerfasst: Sa 12.03.11 01:58 
Ok so wie ich mir das gedacht habe.
Aber ich habe ein anderes Problem.
Ich hoffe ich kann es richtig ausdrücken, naja ich werde es mal versuchen;)

Hier Noch mal der aktuelle Code, ich weiss er ist nicht gerade schön aber nun ja das behebe ich dann noch wenn es geht.
ausblenden volle Höhe 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:
namespace server
{
    class Program
    {
        
        public static NetworkStream stream;
        public static TcpListener server;
        public static serverthread st1;
        public static serverthread st2;
        
        public static void verbinden()
        {
            while (true)
            {
                
                TcpClient c = server.AcceptTcpClient();
                st1 = new serverthread(c);
                while(true)
                {
                    string a = "a";
                    st1.eingang(a);
                }
"**"
                TcpClient c2 = server.AcceptTcpClient();
                serverthread st2 = new serverthread(c2);
                while(true)
                {
                    string b = "b";
                    st2.eingang(b);
                }
                
            }
        }
        
        static void Main(string[] args)
        {
            
            Console.WriteLine("Starte Server...");
            IPAddress ip = IPAddress.Parse("192.168.2.103");
            int port = 13000;
            server = new TcpListener(ip, port);
            server.Start();
            Console.WriteLine("Server gestartet");
            Thread th = new Thread(new ThreadStart(verbinden));
            th.Start();
            
            
        }
    }
}

ausblenden volle Höhe 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:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
class serverthread
    {
        
        public string data;
        private TcpClient connection;
        bool loop = true;
        
        public serverthread(TcpClient connection)
        {
            this.connection = connection;
            Thread empfang = new Thread(new ThreadStart(senden));
            Thread gesendet = new Thread(new ThreadStart(empfangen));
            empfang.Start();
            gesendet.Start();
            
        }
        
        private string daten;
        public string ausgabe_daten()
        {
            return daten;
        }

        private string einn;
        public void eingang(string ein)
        {
             einn = ein;            
        }

        public void empfangen()
        {
            NetworkStream stream = this.connection.GetStream();
            
            while (loop)
            {
                try
                {
                    
                        byte[] empfangen = new byte[1024];
                        stream.Read(empfangen, 01024);
                        data = Encoding.ASCII.GetString(empfangen);
                        daten = data;
                        //Console.WriteLine(data);
                
                }
                catch
                {
"catch"
                    Console.WriteLine("geht nicht");
                    this.connection.Close();
                    loop = false;
                }
            }
            
        }

        public void senden()
        {
            
                NetworkStream stream = this.connection.GetStream();
                
                while (loop)
                {
                    Thread.Sleep(1000);
                    if (einn != "")
                    {
                        try
                        {

                            byte[] send = Encoding.ASCII.GetBytes(einn);
                            stream.Write(send, 0, send.Length);

                        }
                        catch
                        {
                            this.connection.Close();
                        }
                    }
                }
            
        }
    }


Ich habe mir das so gedacht, das ich aus dem Thread "empfangen" den String der an den Server gesendet wurde
an die Methode "ausgabe_daten" übergebe. Dieser solle dann an das andere Objekt übergeben werden, undzwar an die Methode "eingang", sodas der Server diesen dank "stream.write" an den anderen client weiterleitet. Zum testen habe ich wie oben "**" gezeigt mal 2 streams an die beiden Clients geschickt, um zu schauen ob mein Senden geht. So weit so gut. Wenn ich allerdings statt des Strings ein "console.readline()" einfüge, dann springt mir der Code in den catch-Block an dieser Stelle "catch".
Wenn ich allerdings an dieser Stelle ein "console.readline()" einfüge dann geht die Kommunikation mit dem Client. Kann mir das einer erklären???
Und wenn mir vllt noch einer oder eine sagen könnte ob ich auf dem Holzweg bin wie ich das gestallten will und wenn er oder sie noch lust hat mir zu erklären wie es sonst zu bewerkstelligen ist wäre ich sehr dankbar dafür.

lg paddy.
paddy14 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 122



BeitragVerfasst: So 13.03.11 14:11 
Weis vllt einer eine Antwort???
paddy14 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 122



BeitragVerfasst: So 13.03.11 20:22 
Wäre es vllt beser eine asynchrone kommunikation zu verwenden.

Weil wenn ich das richtig verstanden habe, wenn ich asynchron verwende, dann wartet Networkstream auf eingehende Nachrichten.

Wenn ja habt ihr vllt ein paar Tutorials wo ich mich reinlesen könnte???