2012-06-20 2 views
0

왜이 오류가 발생하는지 확실하지 않음 구문 분석 전에 스트림 끝이 발생했습니다. 나는이 link을 보았지만 그곳에는 문제가 해결되지 않았다. 나는 그것이 오류 마녀 편집 여기에 내가 실수 *이 내 나쁜 아무것도 실제 코드로 잘못되지 않았다왜 파싱이 완료되기 전에이 문제가 발생 했습니까?

if (stream.DataAvailable) 
    { 
     byte[] buffer = new byte[10024]; 
     int byteCount = stream.Read(buffer, 0, buffer.Length); 
     byte[] inBytes = new byte[byteCount]; 
     for (int counter = 0; counter < byteCount; counter++) 
      inBytes[counter] = buffer[counter]; 
     BinaryFormatter formatter = new BinaryFormatter(); 
     MemoryStream memory = new MemoryStream(); 
     memory.Write(inBytes,0,inBytes.Length); 
     object message = (object)formatter.Deserialize(memory); 
     Console.WriteLine("Message from client "); 
     memory.Close(); 
    } 

사전에

 Console.WriteLine("Message from client "); 

감사하다 던졌습니다 정확한 지점을 찾기 위해 브레이크 포인트를 사용 클라이언트 측에서 binaryformatter 대신 Encoding.ASCII를 사용했습니다.

답변

0

이 코드는 실제 코드가 잘못되어서 클라이언트 측에서 실수를 저 지르지 않았습니다. binaryformatter 대신 Encoding.ASCII를 사용했습니다.

+0

나는 동의하지 않는다. ... 코드가 정말로 틀리다 ... 당신은 ** 당신이 전체 프레임을 가지고 있는지 확인해야만한다. –

+0

코드 자체는 끝나지 않았다. 그 오류의 원인은 마녀가 그 코드에서 아무 것도 아니 었습니다. 지금은 데이터를 가져올 수 있는지 테스트하고있었습니다. 거기에있는 코드 중 일부는 잘못되어있는 부분을 보려고 시도했습니다. 버퍼와 바이트 대신 포매터를 사용하기 만하면됩니다. 그리고 지금 수 표를 추가하고 있습니다. – Shredder2500

+0

@MarcGravell 전체 프레임이 있다면 어떻게 확인합니까, 같은 문제가 있습니까 ?? – Smith

5

음, stream.Read에 대한 단일 호출이 모두의 데이터를 읽는 것으로 가정합니다. 이는 거의 항상 실수입니다. 특히 네트워크 스트림 인 경우 특히 그렇습니다.

처음에 formatter.Deserialize(stream)으로 전화하지 않는 이유가 있습니까?

+0

thats 내가 처음에 어떻게했는지, 코드를 디버깅하려고 바꿨으며, 루프에서 오류가 반복되어 계속 발생했음을 알았고, 이제는 그 오류가 한번만 발생했습니다. . – Shredder2500

+0

@ Shredder2500 : 루프가 무엇입니까? 당신은 여기에 충분한 문맥을 부여하지 않았습니다. 이러한 메시지가 클라이언트의 "메시지"인 경우 메시지의 구분 기호가 있습니까? 아니면 길이를 알고 있습니까? 하나의'Read' 호출에서 정확히 하나의 메시지 (그리고 오직 하나의 메시지) 만 얻길 희망하는 것은 매우 나쁜 아이디입니다. –

+0

지금 당장은 필요하지 않지만 영원히 반복되는 루프입니다. 지금은 그냥 한 문자열을 보내고 있습니다. – Shredder2500

관련 문제