Ошибка в передаче данный, клиент-сервер, пин-понг, теннис - 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(); } } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д