Laden...

[gelöst] Senden mit Sockets funktioniert nicht

Erstellt von Daniel B. vor 14 Jahren Letzter Beitrag vor 14 Jahren 3.934 Views
D
Daniel B. Themenstarter:in
81 Beiträge seit 2009
vor 14 Jahren
[gelöst] Senden mit Sockets funktioniert nicht

Hy Community,

ich probiere schon seit einer weile mit Sockets Nachrichten zu versenden. Nur leider funktioniert das nicht so ganz wie ich es mir vorstelle. Der Server und der Client schaffen es eine Verbindung aufzubauen, nur bekomme ich das mit dem Nachrichten senden nicht so ganz hin....

Hier meine Methode die eine Nachricht senden sollte:


        private void SendMessage(string pictureBoxName)
        {
            try
            {
                int inputB = client.Send(System.Text.Encoding.ASCII.GetBytes(pictureBoxName));
            }
            catch (Exception ex)
            {
                MessageBox.Show("Senden der Aktion fehlgeschlagen", "Achtung");
            }
            
        }

Hier wie ich Nachrichten auf der Seite des Clients empfange:


        private void GetMessageClient()
        {
            int inputB;
            byte[] puffer = new byte[256];
            while (!win)
            {
                richTextBox1.Text += "Warte auf Aktion des Gegners" + Environment.NewLine;
                while ((inputB = client.Receive(puffer)) == 0)
                {
                    System.Threading.Thread.Sleep(1000);
                }
                richTextBox1.Text += "Gegner: " + System.Text.Encoding.ASCII.GetString(puffer) + Environment.NewLine;
                GetPictureBox(System.Text.Encoding.ASCII.GetString(puffer));
                
                
                block = true;
                richTextBox1.Text += "Warte auf Klick";
                while (block)
                {
                    System.Threading.Thread.Sleep(1500);
                }
            }
        }

Hier wie ich Nachrichten empfange auf der Seite des Servers:


        private void GetMessageHost()
        {
            int inputB;
            byte[] puffer = new byte[256];
            while (!win)
            {
                richTextBox1.Text += "Warte auf Klick" + Environment.NewLine;
                block = true;
                while (block)
                {
                    System.Threading.Thread.Sleep(1500);
                }
                richTextBox1.Text += "Warte auf Aktion des Gegners";
                while ((inputB = client.Receive(puffer)) == 0)
                {
                    System.Threading.Thread.Sleep(1000);
                }
                richTextBox1.Text += "Gegner: " + System.Text.Encoding.ASCII.GetString(puffer) + Environment.NewLine;
                GetPictureBox(System.Text.Encoding.ASCII.GetString(puffer));
                puffer = new byte[256];
            }
        }

C
401 Beiträge seit 2007
vor 14 Jahren

while ((inputB = client.Receive(puffer)) == 0)
                {
                    System.Threading.Thread.Sleep(1000);
                }

Socket.Receive blpockiert, bis etwas ankommt, von daher bracuhst du die Schleife nicht. Nur danach auf 0 prüfen. Ansonsten solltest du evtl. noch die Erstellung des Sockets posten.

D
Daniel B. Themenstarter:in
81 Beiträge seit 2009
vor 14 Jahren

Danke ist schon mal ein guter tipp, nur ich bekomm wie immer eine verbindung zu stande , aber sobald ich irgndwo auf ein feld klicke (dann sollte es den namen des feldes senden), aber auch wenn ich nirgends hinklicke hängt sich die Form auf (sowohl bei Server als auch Client)

Hier erstelle ich den Serversocket


            int port = 45678;
            byte[] puffer = new byte[256];
            IPEndPoint ep = new IPEndPoint(IPAddress.Any, port);
            Socket serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            serverSocket.Bind(ep);
            serverSocket.Listen(1);
            try
            {
                Socket clientSocket = serverSocket.Accept();
                client = clientSocket;
                host = serverSocket;  // öffentliche variable des typs Socket
                MessageBox.Show("Verbunden mit Client", "Connected");
                
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Achtung", MessageBoxButtons.OK);
            }

Hier erstelle ich einen ClientServer


 int port = 45678;
            byte[] puffer = new byte[256];
            IPEndPoint ep = new IPEndPoint(IPAddress.Parse(ipTB.Text), port);
            Socket clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            System.Threading.Thread.Sleep(5000);
            try
            {
                clientSocket.Connect(ep);
                client = clientSocket;
                MessageBox.Show("Verbunden mit " + client.RemoteEndPoint.ToString(), "Connected");
                player = "Spieler 1";
                showPlayer.Text = player;
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Achtung");
            }

Die MessageBox wird bei beiden Seiten angezeigt, also muss alles mit dem erstellen geklappt haben.
Ich habe auch darauf geachtet das nicht auf einem pc beide server erstellt werden sondern immer nur einer (eben host , oder client)

D
Daniel B. Themenstarter:in
81 Beiträge seit 2009
vor 14 Jahren

Was vl. noch nützlich sein könnte:

Das Passiert wenn eine PictureBox angeklickt wird:


        private void pictureBox1_Click(object sender, EventArgs e)
        {
            pictureBox1 = SwitchPlayerAndSetImage(pictureBox1, 0, 0);
            if (hostToolStripMenuItem.Checked || clientToolStripMenuItem.Checked)
            {
                SendMessage(pictureBox1.Name);
            }
            block = false;
        }

I
1.739 Beiträge seit 2005
vor 14 Jahren
Was vielleicht nützlicher sein könnte

vielleicht sollte man so Funktionalitäten trennen, also Übertragung und Klickibuntgedöns.
Sprich: Funktionalität und GUI.
So ergeben sich Probleme, die eigentlich nicht existieren müssen...
Mein Tipp, einfach auftrennen.

D
Daniel B. Themenstarter:in
81 Beiträge seit 2009
vor 14 Jahren

Naja, das problem is bei SwitchPlayerAndSetImage sollte das bild bereits gesetzt werden, aber wenn ich draufdrücke "blockiert" sofort alles, also es kommt auch kein bild (ohne netzwerk dingens funktioniert alles einwandfrei)

I
1.739 Beiträge seit 2005
vor 14 Jahren

Ich tippe auf Resourcemismatch, es gibt halt Sachen die sich gegenseitig(zurecht)blockieren.

C
401 Beiträge seit 2007
vor 14 Jahren

Was mir auch nicht ganz einleuchtet sind die ellenlangen Sleeps, die sich durch deinen Code ziehen. Aber der Netzwerkkram läuft schon in einem eigenen Thread, oder?

D
Daniel B. Themenstarter:in
81 Beiträge seit 2009
vor 14 Jahren

Die sleeps hab ich zum größten teil schon weggelöscht, nö, netzwerk läuft nicht in eigenem thread

C
401 Beiträge seit 2007
vor 14 Jahren

Das erklärt, warum deine App blockiert... Wenn die ganze Zeit auf Daten gewartet wird, blockiert das GUI. Siehe dazu bitte [FAQ] Warum blockiert mein GUI?

D
Daniel B. Themenstarter:in
81 Beiträge seit 2009
vor 14 Jahren

Ich hab aber keine Ahnung wie ich es sonst machen soll, irgendwann muss ich die Daten abschicken und irgndwann auch warten

D
Daniel B. Themenstarter:in
81 Beiträge seit 2009
vor 14 Jahren

Hab es jetzt mehr oder weniger soweit das man schon normal spielen kann, hab jetzt die ganzn schleifen rausgenommen und die sockets in einen eigenen thread gepackt, muss morgen nur noch den ablauf konfigurieren

großes Danke für eure hilfe

D
Daniel B. Themenstarter:in
81 Beiträge seit 2009
vor 14 Jahren

Eine Frage habe ich noch, ich bekomme wenn ich auf eine Nachricht warte beim Server folgenden Fehler:

Ein nicht blockierender Socketvorgang konnte nicht sofort ausgeführt werden

was bedeutet das ?