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];
}
}
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.
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)
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;
}
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.
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)
Ich tippe auf Resourcemismatch, es gibt halt Sachen die sich gegenseitig(zurecht)blockieren.
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?
Die sleeps hab ich zum größten teil schon weggelöscht, nö, netzwerk läuft nicht in eigenem thread
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?
Ich hab aber keine Ahnung wie ich es sonst machen soll, irgendwann muss ich die Daten abschicken und irgndwann auch warten
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
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 ?