Уважаемые программисты, прошу помощи, ибо не нашел логического объяснения своей проблеме.
В моей программе создан класс - "клиент", который должен работать следующим образом:
в нем запускается отдельный поток, который читает данные из TCP подключения,
затем данные исходя из заголовков сортируются по пакетам (пакеты являются экземплярами внутреннего подкласса)
чтение в потоке выполнено в бесконечном цикле
в главном теле программы создается экземпляр клиента, запускается принятие данных
и далее программа ждет получения "нужного" пакета (тоже бесконечный цикл)
но, по не понятной мне причине поток чтения данных останавливается не отработав до конца,
причем именно останавливается, а не зацикливается например
смотрел отладчиком по шагам, код выполняется, до отмеченного ниже места (98 строка), затем выполнение передается в главное тело программы и больше не возвращается
подскажите пожалуйста, в чем может быть проблема, пол дня пытался найти ошибку...
Класс - "клиент":
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
| using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;
using System.Net.Sockets;
using System.IO;
using System.Threading;
namespace ClientClassNames
{
class ClientClass
{
public class PacketClass
{
public string Head; //Заголовок пакета
public int ID; //Идентификатор отправителя
//Буфферы данных различных типов
public List<int> bufInt = new List<int>();
public List<float> bufFloat = new List<float>();
public List<double> bufDouble = new List<double>();
public List<string> bufString = new List<string>();
}
private TcpClient client;
private NetworkStream NWS;
private int last = 0;
public BinaryReader R; //поток для принятия данных
public BinaryWriter W; //поток для отправки данных
public int port;
public string adres;
public int kol; //Количество принятых пакетов
public bool Connected; //Статус подключения
public List<PacketClass> packet = new List<PacketClass>(); //Список пакетов
public ClientClass() //конструктор класса
{
port = 49200;
adres = "127.0.0.1";
kol = 0;
Connected = false;
}
public ClientClass(string destAdresss, int destPort) //конструктор класса
{
port = destPort;
adres = destAdresss;
kol = 0;
Connected = false;
}
public void Connect()
{
//создадим сокетное подключение для общения с сервером
client = new TcpClient(adres, port); //IP адрес сервера и порт на котором он висит
NWS = client.GetStream();
R = new BinaryReader(NWS); //поток для принятия данных
W = new BinaryWriter(NWS); //поток для отправки данных
Thread reading = new Thread(new ThreadStart(readStream)); //Запуск потока чтения данных
reading.Start();
}
private void readStream() //Поток чтения данных
{
Connected = true;
bool conOpened = true;
while (conOpened) //Бесконечный цикл чтения, пока откыто подключение
{
string strBuf = R.ReadString(); //Заголовок пакета
switch (strBuf)
{
case "Pos":
packet.Add(new PacketClass());
last = packet.Count - 1;
packet[last].Head = strBuf;
packet[last].ID = R.ReadInt32();
packet[last].bufDouble.Add(R.ReadDouble());
packet[last].bufDouble.Add(R.ReadDouble());
kol++;
break;
case "You":
packet.Add(new PacketClass());
last = packet.Count - 1;
packet[last].Head = strBuf; //Имя заголовка пакета
packet[last].ID = R.ReadInt32(); //Чтение идентификатора отправителя
packet[last].bufInt.Add(R.ReadInt32()); //Чтение количества игроков
for (int i = 0; i < packet[last].bufInt[0]; i++)
{
packet[last].bufInt.Add(R.ReadInt32()); //Добавление ID игрока в буффер пакета
}
// <======================= дальше код не отрабатывается
kol++; //Увеличение количества принятых пакетов
break;
}
}
}
}
} |
|
Отрывок кода из основного тела программы:
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
| //........................
client = new ClientClass("127.0.0.1", 49200);
client.Connect();
Con.Write("Connecting..."); //Вывод в игровую консоль
while (!client.Connected) { }
Con.Write("Client connected.");
client.W.Write("Who"); //Запрос на получение: своего ID, кол. игроков и их ID к серверу
client.W.Write("Player"); //Отправка своего имени серверу
bool IDpoluchen = false;
while (!IDpoluchen) // <--------Этот цикл виснет, так как количество пакетов не прибавляется
{
for (int i = 0; i < client.kol; i++)
{
if (client.packet[i].Head == "You")
{
igrok[0].ID = client.packet[i].ID; //получение своего ID
kolIgrokov = client.packet[i].bufInt[0]; //получение количества игроков
for (int n = 0; n < kolIgrokov; n++)
{
igrok.Add(new Player()); //создание игрока
igrok[igrok.Count - 1].ID = client.packet[i].bufInt[n + 1]; //получение ID игрока
}
IDpoluchen = true;
Con.Write("ID: " + igrok[0].ID);
}
}
}
//.......................... |
|