TCP IP socket.receive,在.Net应用程序中但在Unity中未接收到数据

时间:2018-08-17 11:44:33

标签: c# .net unity3d tcp

我通过TCP将数据从.NET应用程序发送到Unity,但未收到所有字节。使用相同代码的简单.NET wpf应用程序就是这种情况。为什么Unity有区别?两者都基于.NET 4.7?

// Data send from .NET application: 
byte[] ba = memoryStream.ToArray();
var buffer = BitConverter.GetBytes(ba.Length);
stm.Write(buffer, 0, buffer.Length);
stm.Write(ba, 0, ba.Length);

// Data receive works in .NET but in Unity not all bytes are received
Socket s;
byte[] buffersizeinbytes = new byte[32];
TcpListener myList = new TcpListener(ipAd, 8001);
s = myList.AcceptSocket();
(...)
int k = s.Receive(buffersizeinbytes);
int size = BitConverter.ToInt32(lengthb, 0); // size of buffer
byte[] buffer = new byte[size]; 
int receivedByteCount = s.Receive(buffer);

1 个答案:

答案 0 :(得分:1)

虽然您的代码可以在一个应用程序中运行,而不能在Unity中运行,这似乎令人困惑,但这并不是问题的核心。您似乎在假设当您发送数据块时,也会以这种方式接收它们。事实并非如此。

致电Receive会导致您获得一些数据,最多达到您要的最大数量,但您可能无法获得全部。返回值将告诉您确切的实际收入。如果期望更多,则必须再次调用Receive,直到获得所有期望的数据为止。

Receive有各种重载,可让您指定缓冲区的偏移量。因此,如果您希望获得32个字节的数据,但是只有16个字节,则可以使用相同的缓冲区再次调用Receive,但是要指定一个偏移量,以便从第一个空条目开始填充缓冲区。

所以做奇怪的事情不是Unity,而是您很幸运,所有其他应用程序都可以正常工作。