myCSharp.de - DIE C# und .NET Community
Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 
 | Suche | FAQ

» Hauptmenü
myCSharp.de
» Startseite
» Forum
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Suche
» Regeln
» Wie poste ich richtig?
» Forum-FAQ

Mitglieder
» Liste / Suche
» Wer ist wo online?

Ressourcen
» openbook: Visual C#
» openbook: OO
» Microsoft Docs

Team
» Kontakt
» Übersicht
» Wir über uns

» myCSharp.de Diskussionsforum
Du befindest Dich hier: Community-Index » Diskussionsforum » Entwicklung » Netzwerktechnologien » TCP/IP Daten senden/empfangen
Letzter Beitrag | Erster ungelesener Beitrag Druckvorschau | Thema zu Favoriten hinzufügen

Seiten (2): [1] 2 nächste » Antwort erstellen
Zum Ende der Seite springen  

TCP/IP Daten senden/empfangen

 
Autor
Beitrag « Vorheriges Thema | Nächstes Thema »
myCSharp.de
Moderationshinweis von herbivore (07.03.2006 00:10):

Dies ist ein Thread, auf den aus der FAQ verwiesen wird. Bitte keine weitere Diskussion, sondern nur wichtige Ergänzungen und diese bitte knapp und präzise. Vielen Dank!
 
alf468
myCSharp.de-Mitglied

Dabei seit: 20.02.2005
Beiträge: 196
Entwicklungsumgebung: Visual Studio .NET 2005


alf468 ist offline

TCP/IP Daten senden/empfangen

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Ich möchte gerne die Location eines Labels an einem anderen Rechner senden, damit dort das Label genau so positioniert ist.
Das Problem ist ich habe keine Ahnung wie das genau geht enttäuscht . Könnt ihr mir ein Beispiel oder ein Hinweis zeigen wo Daten gesendet bzw empfangen werden über TCP/IP ?!
12.08.2005 11:25 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
herbivore
myCSharp.de-Poweruser/ Experte

avatar-2627.gif


Dabei seit: 11.01.2005
Beiträge: 49.478
Entwicklungsumgebung: csc/nmake (nothing is faster)
Herkunft: Berlin


herbivore ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo alf468,

das scheint mir doch eher ein Fall für .NET Remoting (über TCP/IP) - wie in  Dateiassoziation gezeigt - zu sein, als für native TCP/IP.

herbivore
12.08.2005 11:29 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
norman_timo norman_timo ist männlich
myCSharp.de-Mitglied

avatar-1775.jpeg


Dabei seit: 13.07.2004
Beiträge: 4.506
Entwicklungsumgebung: .NET 2.0/3.5 und VS2005/VS2008
Herkunft: Wald-Michelbach (Odw)


norman_timo ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo alf468!

Wenn Du allgemeine Info's zu TCP/IP haben möchtest, dann schau Dir das an:

 MSDN - Networking...

Allerdings muss ich Herbivore recht geben, Remoting ist hier eher ein Stichwort!

Ciao
Norman-Timo
12.08.2005 11:34 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
alf468
myCSharp.de-Mitglied

Dabei seit: 20.02.2005
Beiträge: 196
Entwicklungsumgebung: Visual Studio .NET 2005

Themenstarter Thema begonnen von alf468

alf468 ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Danke für die Antwort Daumen hoch
Ich werde mir das mal anschauen und versuchen in mein Projekt zu übertragen.
12.08.2005 12:45 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
alf468
myCSharp.de-Mitglied

Dabei seit: 20.02.2005
Beiträge: 196
Entwicklungsumgebung: Visual Studio .NET 2005

Themenstarter Thema begonnen von alf468

alf468 ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Ich verstehe nicht wie ich das bei mir einbauen kann enttäuscht Also was ich vor habe ist ein kleines Brettspiel welches je nach Auswahl alleine oder im Netzwerk gespielt werden kann.
Wenn Multiplayer ausgewählt wurde geht es auf das Spielfeld wo Spieler1 würfelt und die Spielfigur bewegt sich.Spieler2 soll den den gewürfelten Wert sehen zB in einer TextBox oder MessageBox und auch wie sich die Spielfigur bewegt.
Später kommen da noch andere Dinge hinzu die Spieler2 erfahren muss.
Klickt der Spieler auf Würfeln passiert folgendes:

C#-Code:
private void button1_Click(object sender, System.EventArgs e)
        {
            int zuz=zz.Next(1,6);
            this.textBox1.Text=zuz.ToString();
            for(int j=1;j<=zuz;j++)
            {
                if(i==8)
                {
                    i=0;
                }
                this.label9.Location=new Point(Spieler.spieler1x[i],Spieler.spieler1y[i]);    // Die Punkte kommen aus einem Array
                i++;
                this.Refresh();
                Thread.Sleep(600);

            }

        }

Nun müsste beim Multiplayer ja die Location an den Client (Spieler2) gesendet werden.Dazu könnte man eine Methode schreiben welche die Location an alle verbunden IPs schicken bis auf die eigene IP.

Ist für sowas nicht doch native TCP/IP besser?
12.08.2005 19:42 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
herbivore
myCSharp.de-Poweruser/ Experte

avatar-2627.gif


Dabei seit: 11.01.2005
Beiträge: 49.478
Entwicklungsumgebung: csc/nmake (nothing is faster)
Herkunft: Berlin


herbivore ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo alf468,

nein! :-)

herbivore
12.08.2005 20:44 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
alf468
myCSharp.de-Mitglied

Dabei seit: 20.02.2005
Beiträge: 196
Entwicklungsumgebung: Visual Studio .NET 2005

Themenstarter Thema begonnen von alf468

alf468 ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Ich finde das mit native TCP/IP einfacher und habe es mal damit Versucht.

1.Problem der Thread

C#-Code:
public class ServerThread
    {
        // Stop-Flag
        public bool stop = false;
        // Flag für "Thread läuft"
        public bool running = false;
        // Die Verbindung zum Client
        private TcpClient connection = null;
        // Speichert die Verbindung zum Client und startet den Thread
        public ServerThread ( TcpClient connection )
        {
            // Speichert die Verbindung zu Client,
            // um sie später schließen zu können
            this.connection = connection;
            // Initialisiert und startet den Thread
            new Thread ( new ThreadStart ( Run ) ).Start ();
        }
        // Der eigentliche Thread
        public void Run ()
        {
            // Setze Flag für "Thread läuft"
            this.running = true;
            // Hole den Stream für's schreiben
            Stream outStream = this.connection.GetStream ();
            int buf = 0;
            bool loop = true;
            while ( loop )
            {
                try
                {
                    // Hole die aktuelle Zeit als String
                    int i = Form1.i;
                    // Sende Zeit nur wenn sie sich von der vorherigen unterscheidet
                    if ( i!=buf )
                    {
                        // Wandele den Zeitstring in ein Byte-Array um
                        // Es wird noch ein Carriage-Return-Linefeed angefügt
                        // so daß das Lesen auf Client-Seite einfacher wird
                        Byte[] sendBytes = Encoding.ASCII.GetBytes ( i + "\r\n" );

                        // Sende die Bytes zum Client
                        outStream.Write ( sendBytes, 0, sendBytes.Length );
                        // Merke die Zeit
                        buf = i;
                    }
                    // 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;
                }
            }

        }
        public void close()
        {
            // Schließe die Verbindung zum Client
            this.connection.Close ();
            // Setze das Flag "Thread läuft" zurück
            this.running = false;
        }
    }

Ich bin nach der Anleitung auf  http://www.microsoft.com/germany/msdn/li...gMitCSharp.mspx vorgegangen.
Hier wird die Schleife in der run() ja solange durchlaufen bis die Verbindung getrennt wird.Ich will aber dann Daten senden wenn sich die Spielfigur bewegt und somit die 100% Prozessor auslastung vermeiden.

2.Problem der Client
Der Client stürzt ab was aber auch an der 100% Prozessor auslastung liegen könnte.Den es müsste eigentlic alles stimmen:

C#-Code:
private void client()
        {
            // Verbindung zum Server aufbauen
            c = new TcpClient ( "localhost", 4711 );
            // Stream zum lesen holen
            String buff=null;
            StreamReader inStream = new StreamReader ( c.GetStream () );
            if(inStream.ReadLine().ToString()!=buff)
            {
                try
                {
                    MessageBox.Show(inStream.ReadLine().ToString());
                    // Hole nächsten Zeitstring vom Server
                    /*int j= int.Parse(inStream.ReadLine ());
                    this.label9.Location=new Point(Spieler.spieler1x[j],Spieler.spieler1y[j]);
                    this.Refresh();*/

                    buff=inStream.ReadLine().ToString();
                }
                catch ( Exception )
                {
                    // Setze das Schleifen-Flag zurück
                    // wenn ein Fehler in der Kommunikation aufgetreten ist
                    this.clientclose();
                }
            }
        }

Eine Verbindung zum Server wird per Buttonklick hergestellt
12.08.2005 21:59 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Programmierhans
myCSharp.de-Poweruser/ Experte

avatar-1651.gif


Dabei seit: 05.04.2005
Beiträge: 4.221
Entwicklungsumgebung: VS2003-VS2013 / SAP WebIDE
Herkunft: Zentralschweiz


Programmierhans ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Ich geb Dir erst mal nur ein paar Stichworte. Da es wichtig ist auch zu VERSTEHEN was im Code abläuft.

GuckstDu in SDK:

-DataAvailable (nur dann liegen Daten an)
-Thread.Sleep (legt den arbeitswütigen Thread schlafen wenn's nix zu tun gibt)
-Thread.Join (wartet beim herunterfahren darauf bis ein anderer Thread ausläuft (sich beendet)) ....


Die Variable loop ist doppelt gemoppelt this.stop reicht doch
12.08.2005 22:13 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
alf468
myCSharp.de-Mitglied

Dabei seit: 20.02.2005
Beiträge: 196
Entwicklungsumgebung: Visual Studio .NET 2005

Themenstarter Thema begonnen von alf468

alf468 ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Thread.Sleep und Thread.Join sind mir bekannt, ich weiß aber nicht wo ich das anwenden soll unglücklich
Ich denke du meinst ich soll das Senden der Daten an Client schlafen legen wenn es nix zu gibt.Aber woher soll die Methode wissen wann die Spielfigur sich bewegt ?? verwundert
Mit this.label9.LocationChanged+=new EventHandler(label9_LocationChanged); wird bei Location änderung eine Methode aufgerufen und müsste dann die Daten an den Client gesendet werden
12.08.2005 22:38 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Programmierhans
myCSharp.de-Poweruser/ Experte

avatar-1651.gif


Dabei seit: 05.04.2005
Beiträge: 4.221
Entwicklungsumgebung: VS2003-VS2013 / SAP WebIDE
Herkunft: Zentralschweiz


Programmierhans ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

alf486 nimm es mir nicht übel.... aber Du bist relativ weit vom Ziel entfernt.

Ich hab Dir mal ein umfangreiches Sample gebaut, welches auch mit MEHREREN Clients gleichzeitig umgehen kann.

C#-Code:
using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
using System.Net;
using System.Net.Sockets;
using System.Threading;
using System.Globalization;
using System.Text;

namespace WindowsApplication9
{
    /// <summary>
    /// Summary description for Form1.
    /// </summary>
    public class Form1 : System.Windows.Forms.Form
    {
        private System.Windows.Forms.Button btnSend;
        private System.Windows.Forms.Button btnListen;
        private System.Windows.Forms.Button btnConnect;
        private System.Windows.Forms.Button btnCloseSender;
        private System.Windows.Forms.Button btnStopListen;
        /// <summary>
        /// Required designer variable.
        /// </summary>
        private System.ComponentModel.Container components = null;

        public Form1()
        {
            //
            // Required for Windows Form Designer support
            //
            InitializeComponent();

            //
            // TODO: Add any constructor code after InitializeComponent call
            //
        }

        /// <summary>
        /// Clean up any resources being used.
        /// </summary>
        protected override void Dispose( bool disposing )
        {
            if( disposing )
            {
                if (components != null)
                {
                    components.Dispose();
                }
            }
            base.Dispose( disposing );
        }

        #region Windows Form Designer generated code
        /// <summary>
        /// Required method for Designer support - do not modify
        /// the contents of this method with the code editor.
        /// </summary>
        private void InitializeComponent()
        {
            this.btnSend = new System.Windows.Forms.Button();
            this.btnListen = new System.Windows.Forms.Button();
            this.btnConnect = new System.Windows.Forms.Button();
            this.btnCloseSender = new System.Windows.Forms.Button();
            this.btnStopListen = new System.Windows.Forms.Button();
            this.SuspendLayout();
            //
            // btnSend
            //
            this.btnSend.Location = new System.Drawing.Point(200, 80);
            this.btnSend.Name = "btnSend";
            this.btnSend.Size = new System.Drawing.Size(88, 23);
            this.btnSend.TabIndex = 0;
            this.btnSend.Text = "Send";
            this.btnSend.Click += new System.EventHandler(this.btnSend_Click);
            //
            // btnListen
            //
            this.btnListen.Location = new System.Drawing.Point(24, 32);
            this.btnListen.Name = "btnListen";
            this.btnListen.TabIndex = 1;
            this.btnListen.Text = "Listen";
            this.btnListen.Click += new System.EventHandler(this.btnListen_Click);
            //
            // btnConnect
            //
            this.btnConnect.Location = new System.Drawing.Point(200, 32);
            this.btnConnect.Name = "btnConnect";
            this.btnConnect.Size = new System.Drawing.Size(88, 23);
            this.btnConnect.TabIndex = 2;
            this.btnConnect.Text = "Connect";
            this.btnConnect.Click += new System.EventHandler(this.btnConnect_Click);
            //
            // btnCloseSender
            //
            this.btnCloseSender.Location = new System.Drawing.Point(200, 128);
            this.btnCloseSender.Name = "btnCloseSender";
            this.btnCloseSender.Size = new System.Drawing.Size(88, 23);
            this.btnCloseSender.TabIndex = 3;
            this.btnCloseSender.Text = "Close Sender";
            this.btnCloseSender.Click += new System.EventHandler(this.btnCloseSender_Click);
            //
            // btnStopListen
            //
            this.btnStopListen.Location = new System.Drawing.Point(24, 80);
            this.btnStopListen.Name = "btnStopListen";
            this.btnStopListen.TabIndex = 4;
            this.btnStopListen.Text = "Stop Listen";
            this.btnStopListen.Click += new System.EventHandler(this.btnStopListen_Click);
            //
            // Form1
            //
            this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
            this.ClientSize = new System.Drawing.Size(328, 301);
            this.Controls.Add(this.btnStopListen);
            this.Controls.Add(this.btnCloseSender);
            this.Controls.Add(this.btnConnect);
            this.Controls.Add(this.btnListen);
            this.Controls.Add(this.btnSend);
            this.Name = "Form1";
            this.Text = "t";
            this.ResumeLayout(false);

        }
        #endregion

        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main()
        {
            Application.Run(new Form1());
        }

        private Hashtable _HtClients=new Hashtable();
        private TcpClient _TcpClientSender;
        private NetworkStream _SendStream;
        private Thread _ListenerThread;
        private bool _ListenerStop=false;
        private TcpListener _TcpListener;

        private void Listen()
        {
            this._TcpListener=new TcpListener(IPAddress.Parse("0.0.0.0"),6667);
            this._TcpListener.Start();
            do
            {
                bool iHadWork=false;
                //prüfe ob Verbindungsanforderungen anstehen
                if (this._TcpListener.Pending())
                {
                    TcpClient client=this._TcpListener.AcceptTcpClient();
                    this._HtClients.Add(client,client.GetStream());
                    iHadWork=true;
                }
                else
                {
                    //prüfe ob für offene Clients Daten da sind
                    foreach (TcpClient client in this._HtClients.Keys)
                    {
                        NetworkStream ns=this._HtClients[client]as NetworkStream;
                        if (ns.DataAvailable)
                        {
                            //oho wir haben Daten erhalten
                            byte[] bytes=new byte[client.ReceiveBufferSize];
                            int intBytesRead=ns.Read(bytes,0,client.ReceiveBufferSize);
                            string sReceived=Encoding.Default.GetString(bytes,0,intBytesRead);
                            this.Text=sReceived;
                            iHadWork=true;
                        }
                    }
                }
                if (!iHadWork)
                {
                    Thread.Sleep(100);
                }
            }while (!this._ListenerStop);

            foreach (TcpClient client in this._HtClients.Keys)
            {
                NetworkStream ns=this._HtClients[client]as NetworkStream;
                ns.Close();
                client.Close();
            }

        }
        private void btnListen_Click(object sender, System.EventArgs e)
        {
            this._ListenerThread=new Thread(new ThreadStart(this.Listen));
            this._ListenerThread.Start();
        }

        private void btnStopListen_Click(object sender, System.EventArgs e)
        {
            this._ListenerStop=true;
            this._ListenerThread.Join();
        }

        private void btnConnect_Click(object sender, System.EventArgs e)
        {
            this._TcpClientSender=new TcpClient();
            this._TcpClientSender.Connect(IPAddress.Parse("192.168.2.2"),6667);
            this._SendStream=this._TcpClientSender.GetStream();
        }

        private void btnSend_Click(object sender, System.EventArgs e)
        {
            string sToSend=DateTime.Now.ToLongTimeString();
            byte[] bytesToSend=Encoding.Default.GetBytes(sToSend);
            this._SendStream.Write(bytesToSend,0,bytesToSend.Length);
        }

        private void btnCloseSender_Click(object sender, System.EventArgs e)
        {
            this._SendStream.Close();
            this._TcpClientSender.Close();
        }


    }
}

Und siehst Du jetzt wo DataAvailable und Thread.Join sind ??

Gruss
Programmierhans
12.08.2005 23:26 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
alf468
myCSharp.de-Mitglied

Dabei seit: 20.02.2005
Beiträge: 196
Entwicklungsumgebung: Visual Studio .NET 2005

Themenstarter Thema begonnen von alf468

alf468 ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Erst einmal vielen vielen Dank für die Arbeit die du dir gemach hast Daumen hoch
Habe aber noch eine Frage wie kann der Server an Client Daten senden??
13.08.2005 11:28 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
herbivore
myCSharp.de-Poweruser/ Experte

avatar-2627.gif


Dabei seit: 11.01.2005
Beiträge: 49.478
Entwicklungsumgebung: csc/nmake (nothing is faster)
Herkunft: Berlin


herbivore ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo alf468,

wenn man keinen Rückkanal öffnet, bei dem der Server zum Client und der Client zum Server wird, nur indem der Server auf eine Anfrage des Clients antwortet.

herbivore
13.08.2005 11:33 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
alf468
myCSharp.de-Mitglied

Dabei seit: 20.02.2005
Beiträge: 196
Entwicklungsumgebung: Visual Studio .NET 2005

Themenstarter Thema begonnen von alf468

alf468 ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Und wie geht sowas??
13.08.2005 12:25 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
herbivore
myCSharp.de-Poweruser/ Experte

avatar-2627.gif


Dabei seit: 11.01.2005
Beiträge: 49.478
Entwicklungsumgebung: csc/nmake (nothing is faster)
Herkunft: Berlin


herbivore ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo alf468,

einen Rückkanal öffnet man genauso wie den Hinkanal, bloß eben mit vertauschten Rollen.

herbivore
13.08.2005 12:37 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
alf468
myCSharp.de-Mitglied

Dabei seit: 20.02.2005
Beiträge: 196
Entwicklungsumgebung: Visual Studio .NET 2005

Themenstarter Thema begonnen von alf468

alf468 ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Ich habe mal versucht das irgendwie zu machen.

C#-Code:
//prüfe ob für offene Clients Daten da sind
                    foreach (TcpClient client in this._HtClients.Keys)
                    {
                        NetworkStream ns=this._HtClients[client]as NetworkStream;
                        if (ns.DataAvailable)
                        {
                            //oho wir haben Daten erhalten
                            Stream outStream=client.GetStream();
                            byte[] bytes=new byte[client.ReceiveBufferSize];
                            int intBytesRead=ns.Read(bytes,0,client.ReceiveBufferSize);
                            String j=Encoding.Default.GetString(bytes,0,intBytesRead);
                            outStream.Write(bytes,0,intBytesRead); //Daten an Client senden?
                            //MessageBox.Show(j);
                            this.label9.Location=new Point(Spieler.spieler1x[int.Parse(j)],Spieler.spieler1y[int.Parse(j)]);
                            this.Refresh();
                            iHadWork=true;
                        }
                    }

C#-Code:
this._TcpClientSender=new TcpClient();
            this._TcpClientSender.Connect(IPAddress.Parse("127.0.0.1"),6667);
            this._SendStream=this._TcpClientSender.GetStream();
            _HtClients2.Add(this._TcpClientSender,this._TcpClientSender.GetStream());
            foreach (TcpClient client in _HtClients2.Keys)
            {MessageBox.Show("kdöl");
                NetworkStream ns=this._HtClients2[client]as NetworkStream;
                if (ns.DataAvailable)
                {

                    //oho wir haben Daten erhalten
                    Stream outStream=client.GetStream();
                    byte[] bytes=new byte[client.ReceiveBufferSize];
                    int intBytesRead=ns.Read(bytes,0,client.ReceiveBufferSize);
                    String j=Encoding.Default.GetString(bytes,0,intBytesRead);
                    outStream.Write(bytes,0,intBytesRead);
                    //MessageBox.Show(j);
                    this.label9.Location=new Point(Spieler.spieler1x[int.Parse(j)],Spieler.spieler1y[int.Parse(j)]);
                    this.Refresh();
                    //iHadWork=true;
                }
            }

Ich hoffe ihr denkt jetzt nicht was macht der da für ein Quatsch aber ich verstehe nicht wie ich das umsetzten soll enttäuscht
13.08.2005 13:40 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
tomaten tomaten ist männlich
myCSharp.de-Mitglied

avatar-1835.jpg


Dabei seit: 27.07.2005
Beiträge: 402
Entwicklungsumgebung: VS2008 Pro
Herkunft: Stolberg (Rhld.)


tomaten ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Oder nimm einfach die bekannte Indy-Library, wenn Du es Dir nicht so schwer machen wills:  Indy Library .NET
13.08.2005 19:16 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Programmierhans
myCSharp.de-Poweruser/ Experte

avatar-1651.gif


Dabei seit: 05.04.2005
Beiträge: 4.221
Entwicklungsumgebung: VS2003-VS2013 / SAP WebIDE
Herkunft: Zentralschweiz


Programmierhans ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Im Prinzip musst Du ja die Positionen eh an alle Clients senden....

Also kopierst Du dir den Code zusammen

foreach client ......

den Stream des Clients verwenden

Daten senden

Den Code hast Du ja schon.... musst nur für die Rückantworten den Code neu zusammensetzen (ohne den anderen Code zu zerstören)
14.08.2005 11:21 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
alf468
myCSharp.de-Mitglied

Dabei seit: 20.02.2005
Beiträge: 196
Entwicklungsumgebung: Visual Studio .NET 2005

Themenstarter Thema begonnen von alf468

alf468 ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Damit der Server an die Clients Daten sendet müsste ich den NetworkStream vom jeweiligen Client nehmen und damit dann die Daten senden.

C#-Code:
foreach (TcpClient client in this._HtClients.Keys)
                    {
                        NetworkStream ns=this._HtClients[client]as NetworkStream;
                        if (ns.DataAvailable)
                        {
                            //oho wir haben Daten erhalten
                            byte[] bytes=new byte[client.ReceiveBufferSize];
                            int intBytesRead=ns.Read(bytes,0,client.ReceiveBufferSize);
                            String j=Encoding.Default.GetString(bytes,0,intBytesRead);
                            ns.Write(bytes,0,client.ReceiveBufferSize); //Senden der Empfangen Daten an Client
                            this.label9.Location=new Point(Spieler.spieler1x[int.Parse(j)],Spieler.spieler1y[int.Parse(j)]);
                            this.Refresh();
                            iHadWork=true;
                        }
                    }

Wobei nach diesem Code jetzt nur an den Client gesendet wird welcher gerade Daten schickt aber zum testen reicht es ja erst einmal.

Damit der Client Daten empfängt müsste ich ein NetworkStream für den Client erstellen.
Ich habe das jetzt mal direkt beim Verbinden zum Server gemacht

C#-Code:
this._TcpClientSender=new TcpClient();
            this._TcpClientSender.Connect(IPAddress.Parse("127.0.0.1"),6667);
            this._SendStream=this._TcpClientSender.GetStream();
            NetworkStream nsc=this._SendStream as NetworkStream;
            if(nsc.DataAvailable)
            {
                byte[] bytes=new byte[this._TcpClientSender.ReceiveBufferSize];
                int intBytesRead=nsc.Read(bytes,0,this._TcpClientSender.ReceiveBufferSize);
                String j=Encoding.Default.GetString(bytes,0,intBytesRead);
                MessageBox.Show(j);
            }

Ist das jetzt Ansatzweise richtig?
14.08.2005 15:09 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
alf468
myCSharp.de-Mitglied

Dabei seit: 20.02.2005
Beiträge: 196
Entwicklungsumgebung: Visual Studio .NET 2005

Themenstarter Thema begonnen von alf468

alf468 ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Sieht ganz so aus als wäre das wieder total falsch unglücklich
16.08.2005 19:45 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Programmierhans
myCSharp.de-Poweruser/ Experte

avatar-1651.gif


Dabei seit: 05.04.2005
Beiträge: 4.221
Entwicklungsumgebung: VS2003-VS2013 / SAP WebIDE
Herkunft: Zentralschweiz


Programmierhans ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Im ersten Codeblock sendest Du ein leeres ByteArray ! GuckstDu Encoding.GetBytes an....

und im zweiten Codeblock läuft er nur einmal direkt durch (weil DataAvailable noch auf false ist).... da muss ne Schlaufe hin (und das ThreadSleep nicht vergessen)

Ich lass Dich nicht ganz hängen, aber alles will ich ja auch nicht für Dich coden... sonst lernst Du ja nichts....
16.08.2005 19:51 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
herbivore
myCSharp.de-Poweruser/ Experte

avatar-2627.gif


Dabei seit: 11.01.2005
Beiträge: 49.478
Entwicklungsumgebung: csc/nmake (nothing is faster)
Herkunft: Berlin


herbivore ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo alf468,

dann versuche ich nochmal ganz zaghaft auf mein Remoting-Beispiel hinzuweisen. Dabei muss man sich gar nicht mit dem Netzwerk auseinandersetzen, sondern spricht in dem einem Prozess nur ganz normal ein Objekt (im Beispiel ArgsReceviver) an, dass sich in dem anderen Prozess befindet und dort die gewünschte Aktion ausführen kann.

herbivore
16.08.2005 19:53 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Programmierhans
myCSharp.de-Poweruser/ Experte

avatar-1651.gif


Dabei seit: 05.04.2005
Beiträge: 4.221
Entwicklungsumgebung: VS2003-VS2013 / SAP WebIDE
Herkunft: Zentralschweiz


Programmierhans ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

@hebivore

Er braucht doch aber eine Bidirektionale Triggerung.... das würde bei Remoting zusätzlich Channels bedeuten.

Wenn nun das Spiel wenn es dann mal fertig wird über das Internet gespielt werden soll läuft er dann mit den Channels nicht voll gegen die Wand (Firewalls) ?

Gruss
Programmierhans
16.08.2005 19:56 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
herbivore
myCSharp.de-Poweruser/ Experte

avatar-2627.gif


Dabei seit: 11.01.2005
Beiträge: 49.478
Entwicklungsumgebung: csc/nmake (nothing is faster)
Herkunft: Berlin


herbivore ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo Programmierhans,

Zitat:
Er braucht doch aber eine Bidirektionale Triggerung.... das würde bei Remoting zusätzlich Channels bedeuten.

Finde ich nicht so schlimm. :-)

Zitat:
Wenn nun das Spiel wenn es dann mal fertig wird über das Internet gespielt werden soll läuft er dann mit den Channels nicht voll gegen die Wand (Firewalls) ?

Doch nicht mehr oder weniger, wenn er direkt mit TCP/IP oder gar Sockets arbeitet.

herbivore
16.08.2005 20:04 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Programmierhans
myCSharp.de-Poweruser/ Experte

avatar-1651.gif


Dabei seit: 05.04.2005
Beiträge: 4.221
Entwicklungsumgebung: VS2003-VS2013 / SAP WebIDE
Herkunft: Zentralschweiz


Programmierhans ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Zitat:
Original von herbivore

Doch nicht mehr oder weniger, wenn er direkt mit TCP/IP oder gar Sockets arbeitet.

herbivore

Doch, denn bei TcpClient oder Sockets definiert er alle Ports.... oder kann man für Channels auch Ports definieren...?

Wobei meine Meinung zu Channels kennst Du ja.... (ich werde mich hüten nochmal was mit Channels zu bauen... denn in einem instabilen Netz bist Du tot mit Channels)... bei Sockets hast Du's wenigstens selber im Griff

Gruss
Programmierhans
16.08.2005 20:08 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
herbivore
myCSharp.de-Poweruser/ Experte

avatar-2627.gif


Dabei seit: 11.01.2005
Beiträge: 49.478
Entwicklungsumgebung: csc/nmake (nothing is faster)
Herkunft: Berlin


herbivore ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo Programmierhans,

Zitat:
oder kann man für Channels auch Ports definieren...?

Wenn du damit meinst, dass man den Port festlegen kann, dann ja:

C#-Code:
ChannelServices.RegisterChannel (new TcpChannel (4711));

herbivore
16.08.2005 20:12 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Programmierhans
myCSharp.de-Poweruser/ Experte

avatar-1651.gif


Dabei seit: 05.04.2005
Beiträge: 4.221
Entwicklungsumgebung: VS2003-VS2013 / SAP WebIDE
Herkunft: Zentralschweiz


Programmierhans ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

ok herbivore

Der mit dem Port geht an Dich.... was aber nichts an meiner Meinung ändert.

Gruss
Programmierhans
16.08.2005 20:16 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
alf468
myCSharp.de-Mitglied

Dabei seit: 20.02.2005
Beiträge: 196
Entwicklungsumgebung: Visual Studio .NET 2005

Themenstarter Thema begonnen von alf468

alf468 ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Zitat:
Original von Programmierhans
Im ersten Codeblock sendest Du ein leeres ByteArray ! GuckstDu Encoding.GetBytes an....

und im zweiten Codeblock läuft er nur einmal direkt durch (weil DataAvailable noch auf false ist).... da muss ne Schlaufe hin (und das ThreadSleep nicht vergessen)

Ich lass Dich nicht ganz hängen, aber alles will ich ja auch nicht für Dich coden... sonst lernst Du ja nichts....

Sollst du ja auch nicht Augenzwinkern

Also das erste habe ich jetzt geändert

C#-Code:
    byte[] bytesToSend=Encoding.Default.GetBytes("test");
                            ns.Write(bytesToSend,0,bytesToSend.Length);

Den zweiten Block auch

C#-Code:
while(!this._ClientStop)
            {

                if(nsc.DataAvailable)
                {
                    byte[] bytes=new byte[this._TcpClientSender.ReceiveBufferSize];
                    int intBytesRead=nsc.Read(bytes,0,this._TcpClientSender.ReceiveBufferSize);
                    String j=Encoding.Default.GetString(bytes,0,intBytesRead);

                    //work=true;
                }
                else
                {
                    Thread.Sleep(100);
                }
            }

Der Client stürzt nun aber beim Verbinden was aber sicher daran liegt das die Schleife erst "zu Ende" läuft verwundert

Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von alf468 am 16.08.2005 20:26.

16.08.2005 20:25 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Programmierhans
myCSharp.de-Poweruser/ Experte

avatar-1651.gif


Dabei seit: 05.04.2005
Beiträge: 4.221
Entwicklungsumgebung: VS2003-VS2013 / SAP WebIDE
Herkunft: Zentralschweiz


Programmierhans ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Zitat:
Original von alf468

Der Client stürzt nun aber beim Verbinden was aber sicher daran liegt das die Schleife erst "zu Ende" läuft verwundert

Fehlermeldung ?
Stack ?
Ort wo er steht ?
16.08.2005 20:34 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
alf468
myCSharp.de-Mitglied

Dabei seit: 20.02.2005
Beiträge: 196
Entwicklungsumgebung: Visual Studio .NET 2005

Themenstarter Thema begonnen von alf468

alf468 ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Wenn ich auf Verbinden klicke kann ich im Fenster nix mehr anklicken.Die Sanduhr ist nur noch da unglücklich
16.08.2005 20:44 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Programmierhans
myCSharp.de-Poweruser/ Experte

avatar-1651.gif


Dabei seit: 05.04.2005
Beiträge: 4.221
Entwicklungsumgebung: VS2003-VS2013 / SAP WebIDE
Herkunft: Zentralschweiz


Programmierhans ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

das kommt von deinem endlosloop...

mach da mal ein Application.DoEvents() rein

Edit:

Im Uebrigen ist dies nicht ein Absturz sondern ein "Hängen"

Application.DoEvents gehört nie in ein produktives Programm rein... wurde hier von mir nur vorgeschlagen um in einem einfachen Szenario zu zeigen was abgeht.

Dieser Beitrag wurde 2 mal editiert, zum letzten Mal von Programmierhans am 04.10.2010 17:28.

16.08.2005 20:49 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
alf468
myCSharp.de-Mitglied

Dabei seit: 20.02.2005
Beiträge: 196
Entwicklungsumgebung: Visual Studio .NET 2005

Themenstarter Thema begonnen von alf468

alf468 ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Ich danke dir Daumen hoch
16.08.2005 21:19 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
alf468
myCSharp.de-Mitglied

Dabei seit: 20.02.2005
Beiträge: 196
Entwicklungsumgebung: Visual Studio .NET 2005

Themenstarter Thema begonnen von alf468

alf468 ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Je nachdem ob der User Singleplayer oder Multiplayer auswählt soll eine andere Klasse geladen werden.Die Klassen habe ich jeweils in eine dll Datei geschrieben (ein komplettes Fenster) .Nun will ich aber dass sich kein neues Fenster öffnet sondern dass das alte Fenster mit dem Menü überschrieben wird. Also das gleiche als würde eine neue InitializeComponent() geladen werden.
Ich will hat diesen Übergangseffekt vermeiden wo sich ein Fenster schließt und ein neues öffnet
17.08.2005 19:29 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
herbivore
myCSharp.de-Poweruser/ Experte

avatar-2627.gif


Dabei seit: 11.01.2005
Beiträge: 49.478
Entwicklungsumgebung: csc/nmake (nothing is faster)
Herkunft: Berlin


herbivore ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo alf468,

das ist ein komplett anderes Thema und gehört m.E. in einen anderen Thread (und in ein anderes Forum, nämlich Windows Forms).

herbivore
17.08.2005 19:31 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Zwischen diesen beiden Beiträgen liegen mehr als 8 Monate.
Kostas Kostas ist männlich
myCSharp.de-Mitglied

Dabei seit: 01.08.2005
Beiträge: 597
Entwicklungsumgebung: VS 2005 C#


Kostas ist offline

Wenn Client getrennt wurde, und der Server senden möchte

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo Zusammen,

Wenn sich ein Client auf dem Server verbindet, wird im Beispielcode
vom Programmierhans die connection in eine Hashtable gespeichert.
Somit kann der Server eine Nachricht zum Client senden.
Es kann vorkommen das der Client sich unsachgemäß beendet und der
Server nichts davon mitbekommt.
Wie behandelt man diesen Zustand richtig?

Gruß Kostas
06.05.2006 09:11 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
qwert_a
myCSharp.de-Mitglied

avatar-1911.gif


Dabei seit: 04.08.2005
Beiträge: 57
Entwicklungsumgebung: .Net UltraEdit


qwert_a ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Sehr guters Beispiel. Danke
06.05.2006 22:28 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Programmierhans
myCSharp.de-Poweruser/ Experte

avatar-1651.gif


Dabei seit: 05.04.2005
Beiträge: 4.221
Entwicklungsumgebung: VS2003-VS2013 / SAP WebIDE
Herkunft: Zentralschweiz


Programmierhans ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Beim 2ten Sendevorgang an einen toten Client gibt es eine Exception.

Dann wird der tote Client aus der Hashtable entfernt.

Bei sehr wichtigen Daten (wo absolut nichts verloren gehen darf) empfehle ich die Verwendung eines Handshakes... (der Client schickt etwas zurück um dem Sender mitzuteilen dass er die Message erhalten und gegebenenfalls verarbeitet hat.
07.05.2006 23:36 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Kostas Kostas ist männlich
myCSharp.de-Mitglied

Dabei seit: 01.08.2005
Beiträge: 597
Entwicklungsumgebung: VS 2005 C#


Kostas ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Danke Programierhans,

ich werde einfach die exception auswerten nach dem Senden.

Ich habe aktuell ein weiteres Problem. Ich kann die Methode
private void Listen() nicht debugen. Wenn ich ein Haltepunkt
auf

C#-Code:
this._TcpListener = new TcpListener(IPAddress.Parse("0.0.0.0"), 4711);

setze, springt er an dieser stelle hin, kann aber nicht per Einzelschritt
weitermachen. Es springt einfach raus und macht weiter. Zumindest habe ich
das Gefühl das er weiter macht.
Kann es sein das es etwas mit die Threads zu tun hat?


Gruß Kostas

Dieser Beitrag wurde 2 mal editiert, zum letzten Mal von Kostas am 07.05.2006 23:47.

07.05.2006 23:41 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
tom-essen tom-essen ist männlich
myCSharp.de-Poweruser/ Experte

avatar-2140.png


Dabei seit: 15.05.2005
Beiträge: 1.815
Entwicklungsumgebung: VS.NET 2013
Herkunft: NRW


tom-essen ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo!

Bin grade dabei, für das Client-/Server-Problem eine Komponente zu schreiben, welche den Programmierer von der eigentlichen Implementierung erlöst und entsprechende Mechanismen, etc. zur Verfügung stellt.

Falls Interesse daran besteht, mach ich da gern ein Tutorial draus, und werd' auch selbstverständlich den Code inkl. Beispiel hier posten.
19.05.2006 20:03 Beiträge des Benutzers | zu Buddylist hinzufügen
herbivore
myCSharp.de-Poweruser/ Experte

avatar-2627.gif


Dabei seit: 11.01.2005
Beiträge: 49.478
Entwicklungsumgebung: csc/nmake (nothing is faster)
Herkunft: Berlin


herbivore ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo tom-essen,

gute Tutorials nehmen wir immer gerne.

herbivore
19.05.2006 22:14 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
tom-essen tom-essen ist männlich
myCSharp.de-Poweruser/ Experte

avatar-2140.png


Dabei seit: 15.05.2005
Beiträge: 1.815
Entwicklungsumgebung: VS.NET 2013
Herkunft: NRW


tom-essen ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

OK, hab's mir schonmal notiert.
Wird aber noch ca. 2 Wochen dauern, bis ich anfangen kann, da ich z.Zt. noch in einem grossen Projekt an der Uni arbeite, nur damit alle Interessierten schonmal bescheid wissen Augenzwinkern
21.05.2006 00:43 Beiträge des Benutzers | zu Buddylist hinzufügen
Seiten (2): [1] 2 nächste » Baumstruktur | Brettstruktur       | Top 
myCSharp.de | Forum Der Startbeitrag ist älter als 14 Jahre.
Der letzte Beitrag ist älter als 14 Jahre.
Antwort erstellen


© Copyright 2003-2020 myCSharp.de-Team | Impressum | Datenschutz | Alle Rechte vorbehalten. | Dieses Portal verwendet zum korrekten Betrieb Cookies. 11.08.2020 03:01