Ошибка в передаче данный, клиент-сервер, пин-понг, теннис - C#

Узнай цену своей работы

Формулировка задачи:

Здравствуйте. Не могу понять, почему и где происходит ошибка. Косячит сама передача данных, клиент подключается к серверу, вроде начинается игра, но сервер молчит, а клиент наигрывается вволю сам с собой и заканчивает игру и только после этого отвисает сервер и начинается прорисовка игры.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Drawing.Design;
using System.Text;
using System.Threading;
using System.Net;
using System.Net.Sockets;
using System.Windows.Forms;
 
namespace TennisDotNetSocket
{
    public partial class Form1 : Form
    {
        public static int Player1 = 0, Player2 =  0;
        public int ID = 0;
        public bool Fx = true;
        public bool Fy = true;
        public int BallX = 20, BallY = 50;
        public bool GameStartEnd = true;
        public bool WinLose = true;

        public const int RocketX = 15;
        public const int RocketY = 45;
        public const int RadiusBall = 10;
        public const int BallDx = 2;
        public const int BallDy = 2;
        static Thread Th;
        static bool IsServer;
        static long IsWaited = 0;
         static long   IsSended = 0;

        public Form1()
        {
           
            IsServer = (MessageBox.Show("Ты чЁ  сервер штоле?", "", MessageBoxButtons.YesNo) == DialogResult.Yes);
            InitializeComponent();
            if (IsServer)
            {
                ID = 1;
                toolStripTextBox1.Text = "Server";
                Th = new Thread(new ThreadStart(ServerThread));
            }
            else
            {
                ID = 2;
                toolStripTextBox1.Text = "Klient";
                Th = new Thread(new ThreadStart(ClientThread));
            }
            
        }
        public static void ServerThread()
        {
           
            Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            sock.Bind(new IPEndPoint(IPAddress.Parse("127.0.0.1"), 57000));
            sock.Listen(1);
           // this.timer1.Start();
            Socket client = sock.Accept();
            Byte[] data = new Byte[1];
            while (true)
            {
                while (Interlocked.Read(ref IsSended) == 0) {///
                }
                data[0] = Convert.ToByte(Player1);
                client.Send(data, 1, SocketFlags.None);
                              
                Interlocked.Increment(ref IsWaited);
                client.Receive(data, 1, SocketFlags.None);
                Player2 = Convert.ToInt32(data[0]);
                Interlocked.Decrement(ref IsSended);
                Interlocked.Decrement(ref IsWaited);
       
            }
        }
        public static void ClientThread()
        {
            Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            sock.Connect("127.0.0.1", 57000);
            if (!sock.Connected)
            {
                MessageBox.Show("Невозможно подключиться!", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
                Application.Exit();
            }
           
            Byte[] data = new Byte[1];
            while (true)
            {
                
                Interlocked.Increment(ref IsWaited);
                sock.Receive(data, 1, SocketFlags.None);
                Player1 = Convert.ToInt32(data[0]);
                Interlocked.Decrement(ref IsWaited);

                while (Interlocked.Read(ref IsSended) == 0) {  }
                data[0] = Convert.ToByte(Player2);
                            
                sock.Send(data, 1, SocketFlags.None);
               
                Interlocked.Decrement(ref IsSended);
            }
        }

        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            if (MessageBox.Show("Чё Засцал? Да?", "Выход", MessageBoxButtons.YesNo) == DialogResult.No)
                Close();
        }
 
        private void panel1_MouseMove(object sender, MouseEventArgs e)
        {
            switch (ID)
            {
                case 0: 
                { 
                    Player1 = e.Y;
                    Player2 = e.Y;
                    break;
                }
                case 1:
                {
                    Player1 = e.Y;
                    break;
                }
                case 2:
                {
                    Player2 = e.Y;
                    break;
                }
            }
            
        }
 
        private void panel1_Paint(object sender, PaintEventArgs e)
        {
            Graphics gr  = e.Graphics;
            SolidBrush black = new SolidBrush(Color.Black);
            SolidBrush red = new SolidBrush(Color.Red);
            // убираем ракетки
            gr.FillRectangle(black, 0, 0, RocketX, panel1.Height);
            gr.FillRectangle(black, panel1.Width - RocketX, 0, RocketX, panel1.Height);
 
            // рисуем новые ракетки
            gr.FillRectangle(red, 0, Player1, RocketX, RocketY);
            gr.FillRectangle(red, panel1.Width - RocketX, Player2, RocketX, RocketY);
 
            // убираем шарик
            gr.FillRectangle(black, RocketX, 0, panel1.Width - 2 * RocketX, panel1.Height);
 
            // рисуем новый шарик
            gr.FillEllipse(red, BallX, BallY, RadiusBall, RadiusBall);
        }
 
        public void timer1_Tick(object sender, EventArgs e)
        {
            #region // Если конец игры
 
            if (((BallX - RadiusBall) <= 0) || ((BallX + RadiusBall) >= panel1.Width))
                {
                    GameStartEnd = false;
                    timer1.Stop();
                    MessageBox.Show("Игра окончена");
                    if (ID == 0) MessageBox.Show("Как бэ конец...и проиграли, и победили...");
                    if (BallX - RadiusBall < RocketX)
                    {
                        if (ID == 1)
                            MessageBox.Show("Вы проиграли");
                        if (ID == 2)
                            MessageBox.Show("Ура! Вы победили!");
                    }
                        if (BallX + RadiusBall > panel1.Width - RocketX)
                        {
                            if (ID == 2)
                                MessageBox.Show("Вы проиграли");
                            if (ID == 1)
                                MessageBox.Show("Ура! Вы победили!");
                        }
                }
            #endregion
            #region Если продолжаем играть
            if (GameStartEnd != false)
            {
                // попадание в ракетку игрока 1
                if(((BallY - RadiusBall) <= Player1 + RocketY) && ((BallY + RadiusBall) >= Player1))
                {
                    if ((BallX - RadiusBall) <= RocketX)
                        Fx = true;
                }
                // попадание в ракетку игрока 2
                if (((BallY - RadiusBall) <= Player2 + RocketY) && ((BallY + RadiusBall) >= Player2))
                {
                    if ((BallX + RadiusBall) >= (panel1.Width - RocketX))
                        Fx = false;
                }
 
                // попадание вверхнюю границу
                if ((BallY - RadiusBall >= 0) && (BallY - RadiusBall < 2))
                    Fy = true;
                // попадание нижнюю границу
                if ((BallY + RadiusBall > panel1.Height - 2) && (BallY + RadiusBall <= panel1.Height))
                    Fy = false;
 
                // перераспределение координат для шарика
                if (Fx == true)
                    BallX += BallDx;
                else BallX -= BallDx;
                if (Fy == true)
                    BallY += BallDy;
                else BallY -= BallDy;
 
                toolStripTextBox2.Text = BallX + ":" + BallY;
                panel1.Refresh();
            }
            #endregion
        }
 
        private void игратьToolStripMenuItem_Click(object sender, EventArgs e)
        {            timer1.Start();                  }
        private void подключитьсяToolStripMenuItem_Click(object sender, EventArgs e)
        {
            Th.Start();
            игратьToolStripMenuItem.Enabled = true;
            
        }
 
        private void Form1_Load(object sender, EventArgs e)       {        }
        
    }
}

Решение задачи: «Ошибка в передаче данный, клиент-сервер, пин-понг, теннис»

textual
Листинг программы
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace TennisDotNetSocket
{
    public partial class Form2 : Form
    {
        public string IPs = null, ports = null;
        public Form2()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            IPs = textBox1.Text;
            ports = textBox2.Text;
            Form1.IP = IPs;
            Form1.port = ports;
            button1.Enabled = false;
            button1.Text = "Сохранено";
            button2.Visible = true;
        }

        private void button2_Click(object sender, EventArgs e)
        {
            Close();
        }
    }
}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

11   голосов , оценка 3.909 из 5
Похожие ответы