입니다. 다음 코드는 List<byte[]>()
을 통해 반복되지만, 어떤 이유로 인해 lengthBuffer가 다른 크기의 byteData가되는 경우가 있습니다.데이터 바이트와 다른 크기를 반환하는 GetBytes가 실제로
BitConverter.ToInt32()
길이를 인쇄 한 다음 실제 byteDataList[i].Length
을 인쇄하는 DebugPrintInGame 메서드에서 볼 수 있습니다.이 두 숫자는 정확히 동일해야하며 많은 시간이 있어야하지만 알 수없는 이유 때문에 지금은 그들도 아니다.
아래 코드는 서버의 데이터 길이를 서버로 보내 서버가 들어오는 데이터의 크기와 예상되는 크기를 알 수 있도록 실제 데이터를 전송합니다. 그러나 예를 들어 가끔은 실제 데이터가 전송 된 것보다 더 큰 길이를 전송할 것이지만 무작위로 발생하기 때문에 스레드 문제 일 수 있습니다. 그럼에도 불구하고 byteDataList는이 스레드 내에서만 사용되므로 잠글 수도 있습니다. 그것. 내가 테스트 한 내용에서 보내는 데이터는 2kb ~ 17kb입니다.
누구나 내 프로젝트의이 작은 스 니핏을 기반으로 이런 일이 일어날 수있는 이유를 알 수 있습니까? 이 코드는 모두 클라이언트 측입니다. 알림 BitConverter.ToInt32(lengthBuffer, 0)
및 byteDataList[i].Length
은 동일한 길이를 제공 할 것으로 예상되지만 그렇지 않습니다. 그게 문제 야. 이 경우에도 서버로 전송되기 전에 클라이언트 측에서
List<byte[]> byteDataList = new List<byte[]>();
//.........
lock (byteDataList) //pointless lock, just used for random testing :\
{
if (byteDataList.Count > 0)
{
for (int i = 0; i < byteDataList.Count; i++)
{
try
{
byte[] lengthBuffer = BitConverter.GetBytes(byteDataList[i].Length);
//quick printout to compare lengths for testing
this.QueueOnMainThread(() =>
{
Tools.DebugPrintInGame("Length buffer " + lengthBuffer.Length +
+ BitConverter.ToInt32(lengthBuffer,0)+ " "+
+ byteDataList[i].Length); //this should be same as BitConverter lengthBuffer
});
//send length
stream.Write(lengthBuffer, 0, lengthBuffer.Length);
//send data
stream.Write(byteDataList[i], 0, byteDataList[i].Length);
stream.Flush();
}
catch (Exception ex)
{
this.QueueOnMainThread(() =>
{
Tools.DebugPrintInGame("Exception " + ex.ToString());
});
}
}
}
}
인쇄 아웃 :
공지 사항 다른 길이 지난 2가 동일해야합니다. 즉,
`lengthBuffer` = 17672
`byteDataList[i]` = 17672
하지만 때로는이 이상하고 불안정한 이동 :
`lengthBuffer` = 17672
`byteDataList[i]` = 2126
모두 lengthBuffer 및 byteDataList는 [내가] 동일해야합니다.
예, 'byte [] Array.Length'는 바이트 배열의 크기를 바이트로 나타냅니다. – Euthyphro
그렇다면 배열 요소를 보내고 있습니다. 요소의 길이가 전송 된 후 실제 요소가 전송됩니다. 코드를보고 [i]를 확인하십시오. – Euthyphro
디버깅 목적을 위해 데이터 배열의 시작 부분에 길이를 추가해야한다고 생각합니다. int의 표현은 항상 같은 길이가 될 것이므로 다른 끝에서 읽고 검사하여 대기 시간/네트워크 문제가 아닙니다. 아니면 당신의 인쇄물에 그 골반이 보이십니까? – kmcc049