Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/7: Рейтинг темы: голосов - 7, средняя оценка - 5.00
1 / 1 / 1
Регистрация: 27.11.2010
Сообщений: 8
1

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

22.03.2011, 20:27. Просмотров 1411. Ответов 2
Метки нет (Все метки)


Здравствуйте. Не могу понять, почему и где происходит ошибка. Косячит сама передача данных, клиент подключается к серверу, вроде начинается игра, но сервер молчит, а клиент наигрывается вволю сам с собой и заканчивает игру и только после этого отвисает сервер и начинается прорисовка игры.

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
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)       {        }
        
    }
}
0
Вложения
Тип файла: rar TennisDotNetSocket.rar (35.2 Кб, 33 просмотров)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
22.03.2011, 20:27
Ответы с готовыми решениями:

Пин-понг
Здравствуйте, в целях изучения Java делаю мини-игру &quot;пинг-понг&quot;, сейчас пытаюсь сделать просто что...

ИГра Пин Понг
Ребят вообщем не могу прописать, не знаю как..нужно , чтобы шарик ударяясь о стену...сразу вылезало...

Подскажите исправить ошибки в игре Пин понг на JavaScript
За одну из платформ играет пользователь используя мышь. За вторую играет компьютер. Проигрывает...

Потеря пакетов при передаче клиент->сервер - Boost C++
Написал простенькую реализацию сервера и клиента. Клиент: #include &quot;stdafx.h&quot; #include...

2
1 / 1 / 1
Регистрация: 27.11.2010
Сообщений: 8
24.03.2011, 15:00  [ТС] 2
вообщем сам написал, сам разобрался, сам себе ответил....вдруг кому понадобиться рабочая уже.

Код
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 = 20, Player2 =  20;
        public int ID = 0;
        public bool Fx = true;
        public bool Fy = true;
        public int BallX = 20, BallY = 50;
        public bool GameStartEnd = true;
        public bool ConnnetStart = 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;
        public static bool FlagStart = false;
        public static string IP = null, port = null;

        
        
        public Form1()
        {
            Form2 re = new Form2();
            re.ShowDialog();
            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 = "Client";
                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));
            Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            sock.Bind(new IPEndPoint(IPAddress.Parse(IP),Convert.ToInt32(port)));
                sock.Listen(1);
               
                Socket client = sock.Accept();
                Byte[] data = new Byte[4];
                Byte[] outPl = new Byte[4];
                FlagStart = true;
            try
            {
                while (true)
                {

                    outPl[0] = Convert.ToByte(Player1);
                    client.Send(outPl);
                    client.Receive(data);
                    Player2 = Convert.ToInt16(data[0]);
                    client.SendTimeout = 5;
                   
                }
            }
            catch (Exception ex)
            {
                client.Shutdown(SocketShutdown.Both);
                client.Close();
                FlagStart = false;
                MessageBox.Show(ex.Message + "\n\n"+ ex.InnerException+ "\n\n"+ ex.Source + "\n\n"+ ex.StackTrace + "\n\n", "Server error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                Application.Exit();
            }
        }
        public static void ClientThread()
        {

            //Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            //sock.Connect("127.0.0.1", 57000);
            Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            sock.Connect(IP, Convert.ToInt32(port));
            if (sock.Connected)
            {
                FlagStart = true;
                try
                {
                    
                    Byte[] data2 = new Byte[4];
                    Byte[] outPl2 = new Byte[4];
                    while (true)
                    {
                        sock.SendTimeout = 5;
                        sock.Receive(data2);

                        Player1 = Convert.ToInt16(data2[0]);
                        outPl2[0] = Convert.ToByte(Player2);
                        sock.Send(outPl2);

                    }
                }
                catch(Exception ex)
                {
                    sock.Shutdown(SocketShutdown.Both);
                    sock.Close();
                    FlagStart = false;
                    MessageBox.Show(ex.Message + "\n\n" + ex.InnerException + "\n\n" + ex.Source + "\n\n" + ex.StackTrace + "\n\n", "Client error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    Application.Exit();
                }
            }
            else
            {
                MessageBox.Show("Невозможно подключиться!", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
                Application.Exit();
            }

        }

        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 // Если конец игры
            try
            {
                if (FlagStart)
                {
                    if (((BallX - RadiusBall) <= 0) || ((BallX + RadiusBall) >= panel1.Width))
                    {
                        GameStartEnd = false;
                        timer1.Stop();
                        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
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message + "\n\n" + ex.InnerException + "\n\n" + ex.Source + "\n\n" + ex.StackTrace + "\n\n", "Client error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                Application.Exit();
            }

        }

        private void подключитьсяToolStripMenuItem_Click(object sender, EventArgs e)
        {
            Th.Start();
            подключитьсяToolStripMenuItem.Enabled = false;
            
        }

        
    }
}
Form2.cs

Код
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();
        }
    }
}
0
Вложения
Тип файла: rar TennisDotNetSocket.rar (39.1 Кб, 65 просмотров)
0 / 0 / 0
Регистрация: 22.11.2016
Сообщений: 1
22.11.2016, 16:26 3
А как к самому себе подключиться? Как запустить с одного компьютера? Запускаю программу, далее появляется окошко, в нём прописаны IP и порт, нажимаю ОК, затем Играть, далее появляется окошко с выбором сервер ты или клиент, далее появляется окно с самой игрой, но в нём игра не начинается, нужно ещё подключиться другому игроку, с другой стороны, но как это сделать с одной машины? Что не прописываю ничего не подходит..
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
22.11.2016, 16:26

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь или здесь.

Ошибка при передаче данных в клиент-серверном приложении
Здравствуйте, вот код клиент-серверного приложения: Клиент: private void button1_Click(object...

Клиент-сервер: При передаче одного кадра все хорошо, но при отсылке потоком возникает ряд ошибок
Добрый день, коллеги. Пишу клиент-серверное приложение для передачи потокового видео. Сервер на...

Расшифровать данные Wireshark. Ошибка при передаче файла на сервер
Доброго времени суток. Помогите расшифровать логи Wireshark. При передаче файла ~9кб, все строки в...

Взаимодействие WinCC с Labview 2013, как сервер-клиент, так и клиент-сервер
Здравствуйте. Интересует информация о взаимодействии WinCC с Labview 2013, как сервер-клиент, так и...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.