我正在尝试将我在Unity中使用的C#源转换为Visual Studio Windows窗体应用程序,但我无法弄清楚为什么我的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");
}
}
Handledata
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 =&#34; packetnum read并且不是0&#34 ;;在HandleDataPacket中行,但它不会触发触发行:(。
有人可以告诉我为什么会这样吗?
答案 0 :(得分:0)
好的,我发现了问题。 我试图以统一的方式初始化包,但不得不从程序本身触发它。
我创建了一个Networkmanager类,初始化不同的包,然后建立连接。这固定了!
上面的所有代码都按预期工作。
刚才意识到约翰正在告诉我这个! 糟透了我几个小时前没有看到。 将其作为答案发布,并将其标记为一个。