저는 C#으로 작성한 프록시 서버가 있습니다. 또한이 C# 프록시를 통해 비디오 서버에서 MJPEG 데이터를받는 Java 애플릿이 있습니다. 내 문제는 비디오 서버에서 현재 MJPEG 데이터를 더 이상 사용할 수 없을 때 프록시가 차단 된 읽기 호출에 걸려 종료 할 수 없다는 것입니다. 멀티 스레드 프로듀서/고객
// write the forwarded output
// blocking on remoteServerResponseStream.Read
while (m_running && (read = remoteServerResponseStream.Read(buffer, 0, buffer.Length)) > 0)
{
bytesRead += read;
output.Write(buffer, 0, read);
output.Flush();
}
이
(위 코드에서 변수output
) 스트림 폐쇄 자바 애플릿에 의해 종료한다. 그러나 프록시가 데이터를 기다리는
remoteServerResponseStream.Read
에 멈춘 상태에서 닫기 요청을 승인하지 않으므로 Java 애플릿은이 연결을 닫을 수 없습니다.
나는이 문제에 일주일 동안 고착했다. 나는 해결책을 생각해 보았을지도 모르지만 그것이 효과가 있을지 모르겠다. 이것에 대한 의견을 듣고 싶습니다.
내 생각은 removeServerResponseStream.Read
을 다른 스레드에두고 공유 대기열을 사용하여 데이터를 전송하는 것이 었습니다. 스레드는 데이터를 읽고 대기열에 배치합니다. 내 메인 스레드가 대기열에있는 모든 데이터를 output
으로 전달합니다. 이런 식으로, 나는 항상 output.CanWrite
이 false가되었는지를 지속적으로 확인할 수 있습니다.이 경우 읽기 스레드를 중단 할 수 있습니다 (이것이 차단 스트림 읽기를 방해하는 유일한 방법입니다). 이것이 가능한 솔루션입니까? 그렇다면 사용 가능한 데이터 대기열을 지속적으로 폴링해야합니까? 아니면 이벤트를 만들어야합니까? 이 문제에 대한 의견을 듣고 싶습니다. 미리 감사드립니다.
.NET 4.0 Task Parallel Library에서 소개 된 동시 콜렉션 및 기타 컨테이너 클래스를 사용해야합니다. – dthorpe
추가 코드가 필요합니다. –