Autor Beitrag
MiHa80
Hält's aus hier
Beiträge: 9



BeitragVerfasst: Fr 24.10.08 12:30 
Hallo,
ich schaffe es nicht, das der Text "verbunden" angezeigt wird, sobald sich der Server verbunden hat.
Wie kann ich das Label ereignisfenster von der KLasse ServerThread verändern ?

Desweiteren möchte ich noch die IP-Adresse von den verbundenen Clients ausgeben. Wie kann ich diese IP-Adressen herausfinden ?

Könnt ihr mir helfen ?


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:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
132:
133:
134:
135:
136:
137:
138:
139:
140:
141:
142:
143:
144:
145:
146:
147:
148:
149:
150:
151:
namespace Backup_Test

{
    public partial class MainForm : Form
    {
        private static TcpListener tcpListener;
        private static ArrayList threads = new ArrayList();
        private static int maxConnections = 100;

        public MainForm()
        {
            InitializeComponent();
        }

        void MainFormLoad(object sender, EventArgs e)
        {
            ServerStarten();
        }

//dies wird benötigt um Controls threadsicher auszuführen bzw. wenn sich das aufrufen
//des Controls in einem anderen Thread als dem Hauptthread befindet--------------------------
         public delegate void SetTextCallback(string text);
         public void SetText(string text)
        {
            if (this.ereignisfenster.InvokeRequired)
            {
                SetTextCallback d = new SetTextCallback(SetText);
                this.Invoke(d, new object[] { text });
            }
            else
            {
                this.ereignisfenster.Text = (ereignisfenster.Text + text);
            }
        }

// Server starten ------------------------
         public void ServerStarten()
        {
            tcpListener = new TcpListener(IPAddress.Any, 9050);
            tcpListener.Start();
            Thread mainThread = new Thread(new ThreadStart(Run));
            mainThread.Start();
            this.ereignisfenster.Text = (ereignisfenster.Text + "Backup-Server");
            this.ereignisfenster.Text = (ereignisfenster.Text + "\nWarte auf Verbindungen...");

// Dies aktivieren um den Server zu beenden-------------------
//            mainThread.Abort();
//            for (IEnumerator e = threads.GetEnumerator(); e.MoveNext(); )
//            {
//                ServerThread st = (ServerThread)e.Current;
//                st.stop = true;
//                while (st.running)
//                {
//                    Thread.Sleep(1000);
//                }
//            }
//            tcpListener.Stop();
//-------------------------------------------
        }

// Server läuft ---------------------
        public void Run()
        {
            while (true)
            {
                if (threads.Count < maxConnections)
                {
                    TcpClient c = tcpListener.AcceptTcpClient();
                    this.SetText("\nVerbindungsanfrage erkannt\n");
                    threads.Add(new ServerThread(c));
                 }
            }
        }

// Server Thread starten----------

        class ServerThread
        {
            public static int uebergabe;
            public bool stop = false;
            public bool running = false;
            private TcpClient connection = null;
            private NetworkStream networkStream;
            private byte[] data = new byte[1024];
            private int received;
            private string empfangen;

            public ServerThread(TcpClient connection)
            {
                this.connection = connection;
                new Thread(new ThreadStart(Run)).Start();
            }

            public void Run()
            {

                // meineForm.SetText("verbunden");
                this.running = true;
                networkStream = connection.GetStream();
                bool loop = true;

                data = "Willkommen auf Backup-Server".ToByteArray();
                networkStream.Write(data, 0, data.Length);

//---hiermit-kann-die-verbindung-getrennt-werden stopwunsch-muss-in-die-schleife-programmiert-werden
                while (loop)
                {
                    try
                    {
                        Listen();
                // Wiederhole die Schleife so lange bis von außen der Stopwunsch kommt
                        loop = !this.stop;
                    }
                    catch (Exception)
                    {
                // oder bis ein Fehler aufgetreten ist
                        loop = false;
                    }
                }
                networkStream.Close();
                // Schließe die Verbindung zum Client
                this.connection.Close();
                // Setze das Flag "Thread läuft" zurück
                this.running = false;
//-------------------------------------------------------- 
            }

            public void Listen()
            {
                var arrOK = "Client1".ToByteArray();
                var arrNOK = "Client2".ToByteArray();
                while (true)
                {
                    data = new byte[1024];
                    received = networkStream.Read(data, 0, data.Length);
                    if (received == 0)
                        break;

                    empfangen = Encoding.ASCII.GetString(data, 02);
                    //            meineForm.SetText("gesendet " + empfangen);

                    switch (empfangen)
                    {
                        case "10": networkStream.Write(arrOK, 0, arrOK.Length);
                            break;
                        case "20": networkStream.Write(arrNOK, 0, arrOK.Length);
                            break;
                    }
                }
            }
        }


Moderiert von user profile iconChristian S.: Highlight- durch C#-Tags ersetzt
bakachan
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 503
Erhaltene Danke: 34

W7 (x64) Ultimate
C# / VB.NET (VS2010 Ultimate)
BeitragVerfasst: Fr 24.10.08 13:05 
Hallo,
ich habe mir den Quellcode jetzt nicht so wirklich angesehn(Hinweis: es gibt Code-Tags oder auch C#-Code-Tags hier im Forum damit wird der Quellcode besser lesbar).

die sauberere Variante:
Events
Mach dir ein paar Events in deiner Klasse und koppel die in deiner Oberfläche.
An den Stellen wo der Text verändert werden soll löst du das entsprechende Event aus sodass deine Oberfläche weiss wann sie den Text zu ändern hat.

die unschöne Variante:
Referenz des Objekts mit in die Funktionen übergeben.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19341
Erhaltene Danke: 1752

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Fr 24.10.08 13:05 
Hallo und :welcome: hier!

So wie du den Quelltext gepostet hast ist der leider unlesbar. Erstens fehlt jede Einrückung, so dass man schon keinen Überblick hat, und dann hast du noch Highlight-Tags statt C#-Tags verwendet, so dass das den Quelltext gänzlich unlesbar macht.

Manchmal habe ich den Eindruck, dass sich niemand den abgeschickten Beitrag noch einmal durchliest, das musst du doch selbst merken, dass der Quelltext so nicht überschaubar ist. :roll:
MiHa80 Threadstarter
Hält's aus hier
Beiträge: 9



BeitragVerfasst: Fr 24.10.08 13:11 
Sorry,

hab die C# Tags nicht gefunden. Werde es beim nächsten mal beachten.

Das mit den Events funktioniert leider nicht, wohl wegen der Klasse ServerTHread, die ja was übergeben haben will. Deshalb bekam ich beim Compilieren immer Fheler als ich das mit Events versucht habe.

Vielleicht kann mir hier jemand einen Vorschlag machen, wie das anhand dieses Quellcodes mit Events funktioniert.

Wie funktioniert das mit der Referenz des Objektes mit in die Funktion übergeben ?

Danke für eure Hilfe.
bakachan
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 503
Erhaltene Danke: 34

W7 (x64) Ultimate
C# / VB.NET (VS2010 Ultimate)
BeitragVerfasst: Fr 24.10.08 15:17 
Das mit Events sollte eigentlich funktionieren (zumindest wenn ich nicht grad irgend nen Leichtsinnsfehler mache, was Freitag Nachmittag durchaus möglich wäre):
Erstelle in deiner ServerThread-Klasse ein/mehrere Event/-s
z.B.
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
class ServerThread

    public event EventHandler TestEvent;
    .
    .
    .
}

An der entsprechenden Stelle (also da wo sich bei dir z.B. der Status ändern sollte) rufst du das Event auf:
ausblenden C#-Quelltext
1:
TestEvent(this,new EventArgs());					


Damit das ganze nicht ins leere läuft musst du aber von deiner Oberflächen-Form aus noch abonieren(oder koppeln oder wie auch immer man es nennen will).
z.B.:
ausblenden C#-Quelltext
1:
2:
3:
4:
this.SetText("\nVerbindungsanfrage erkannt\n");
ServerThread server = new ServerThread(c);
server.TextEvent += new EventHandler(Funktion);
threads.Add(server);


und dazu noch die Funktion an die du es aboniert hast(in die Formklasse):
ausblenden C#-Quelltext
1:
2:
3:
4:
private void Funktion(object sender, EventArgs e)
{
//Befehle
}
Kha
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Fr 24.10.08 15:21 
user profile iconMiHa80 hat folgendes geschrieben Zum zitierten Posting springen:
Das mit den Events funktioniert leider nicht, [...]
Doch ;) . Gib deiner ServerThread-Klasse ein neues Event vom Typ SetTextCallback, rufe es in ServerThread.Run auf und verknüpfe es in MainForm.Run:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
TcpClient c = tcpListener.AcceptTcpClient();
this.SetText("\nVerbindungsanfrage erkannt\n");
var thread = new ServerThread(c);
thread.Log /* dein Event */ += SetText;
threads.Add(thread);

PS: InvokeRequired finde ich persönlich schrecklich, ich mache es immer so (.Net 3.5):
ausblenden C#-Quelltext
1:
2:
3:
thread.Log += message => Invoke(new Action(() => {
  ereignisFenster.Text += message;
}));


PS: bakachan war zwar schneller :evil: , aber ich lasse es mal stehen, vielleicht hilft's.

_________________
>λ=
MiHa80 Threadstarter
Hält's aus hier
Beiträge: 9



BeitragVerfasst: Fr 24.10.08 16:08 
Super,

ihr seid die Besten.
Hat auf Anhieb funktioniert und ich weiß wieder ein wenig mehr.

Übrigens, das ist ein super Forum hier.

Wisst ihr evtl. auch noch wie man die IP-Adresse der verbundenen Clients auslesen kann ?
MiHa80 Threadstarter
Hält's aus hier
Beiträge: 9



BeitragVerfasst: Fr 24.10.08 19:44 
gerade ist mir noch aufgefallen, wenn ich das Fenster mit dem X beende, läuft immer noch das Programm weiter. Der Debugger bei SharpDevelop läuft dann nämlich immer noch.

Hab auch schon mit dem OnClose Event die Application.Exit eingefügt, bringt aber auch nichts
Kha
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Sa 25.10.08 00:16 
Setze IsBackground deiner Thread auf true. Warum, das verrät dir die Hilfe ;) . Bei weitergehenden Fragen über die ursprüngliche Frage hinaus solltest du aber der Übersichtlichkeit zuliebe lieber einen neuen Thread aufmachen.

_________________
>λ=