Я пытаюсь преобразовать исходный код C#, который я использовал в Unity, в приложение Visual Studio Windows Forms, и я не могу понять, почему моя часть onreceive не работает.
Я делаю TCP-соединение с сервером (работает), затем мой сервер отправляет приветственный пакет, который я получаю, но не могу обработать.
Иногда он запускается полностью, но не запускает триггер (объяснено позже).
Поскольку исходный код изначально взят из единого проекта, я могу дождаться обновления, и я думаю, что именно поэтому он там работает.
Код:
private void OnReceive(IAsyncResult ar)
{
try
{
int byteAmt = myStream.EndRead(ar);
byte[] myBytes = new byte[byteAmt];
Buffer.BlockCopy(asyncBuff, 0, myBytes, 0, byteAmt);
if (byteAmt == 0) return;
//UnityThread.executeInUpdate(() =>
//{
ClientHandleData.HandleData(myBytes);
//});
myStream.BeginRead(asyncBuff, 0, 8192, OnReceive, null);
}
catch
{
Console.WriteLine("we have an error in onreceive");
}
}
обработанные данные
public static void HandleData(byte[] data)
{
byte[] Buffer;
Buffer = (byte[])data.Clone();
if (playerBuffer == null) playerBuffer = new ByteBuffer();
playerBuffer.WriteBytes(Buffer);
if (playerBuffer.Count() == 0)
{
playerBuffer.Clear();
return;
}
if (playerBuffer.Length() >= 8)
{
pLength = playerBuffer.ReadLong(false);
if (pLength <= 0)
{
playerBuffer.Clear();
return;
}
}
if (playerBuffer.Length() >= 8)
{
pLength = playerBuffer.ReadLong(false);
if (pLength <= 0)
{
playerBuffer.Clear();
return;
}
}
while (pLength > 0 & pLength <= playerBuffer.Length() - 8)
{
if (pLength <= playerBuffer.Length() - 8)
{
playerBuffer.ReadLong();
data = playerBuffer.ReadBytes((int)pLength);
HandleDataPackets(data);
}
pLength = 0;
if (playerBuffer.Length() >= 8)
{
pLength = playerBuffer.ReadLong(false);
if (pLength < 0)
{
playerBuffer.Clear();
return;
}
}
}
}
и, наконец, HandleDataPackets
public static void HandleDataPackets(byte[] data)
{
long packetnum; ByteBuffer buffer; Packet_ packet;
buffer = new ByteBuffer();
buffer.WriteBytes(data);
packetnum = buffer.ReadLong();
buffer = null;
Form1.label1.Text = "reading packetnum";
if (packetnum == 0) return;
Form1.label1.Text = "packetnum read and is not 0";
if (packets.TryGetValue(packetnum, out packet))
{
Form1.label1.Text = "trigger";
packet.Invoke(data);
}
}
иногда доходит до Form1.label1.Text = "packetnum read, а не 0"; строка в HandleDataPacket, но тогда она не запускает строку триггера :(.
Кто-нибудь может сказать мне, почему это так?
Если вы не предоставили код, вы никогда ничего не добавляете в пакеты.
это будет сервер, который отправит приветственное сообщение. codepublic static void SendWelcomeMessage (длинный индекс) {ByteBuffer buffer = new ByteBuffer (); buffer.WriteLong ((длинный) ServerPackets.SWelcome); Console.WriteLine ("отправка приветственного пакета."); buffer.WriteString («Добро пожаловать! Пожалуйста, авторизуйтесь и наслаждайтесь игрой.»); SendDataTo (индекс, buffer.ToArray ()); }





Хорошо, я нашел проблему. Я пытался инициализировать пакеты единым способом, но мне пришлось запускать его из самой программы.
Я создал класс Networkmanager, который инициализирует различные пакеты, а затем устанавливает соединение. это исправило!
весь приведенный выше код работает так, как задумано.
Только что понял, что Джон мне это говорил! .. К сожалению, я не видел этого несколько часов назад. Опубликуйте это как ответ и отметьте как единое целое.
Я удалил для вас лишний тег. Из вики-страницы тега
visual-studio: используйте этот тег, если у вас есть конкретный вопрос о функциях и возможностях Visual Studio. НЕ используйте этот тег в вопросах, касающихся кода, который случайно был написан в Visual Studio. Подумайте о том, чтобы пометить точную область технологий, на которую ссылается ваш вопрос, а также пометить более конкретную версию Visual Studio. Укажите точную версию VS, выпуск и уровень обновления в своем вопросе.