2011-05-16 6 views
-2

Windows에서 다중 스레드 JAVA 응용 프로그램에 소켓을 만들었습니다.이 응용 프로그램은 데이터를 순차적으로 읽어야합니다. 그러나 우리는 InputStream로부터 데이터를 읽는 문제에 직면하고있다다중 스레드 JAVA 응용 프로그램에서 소켓 읽기 문제가 발생했습니다.

예를 들어, 데이터 순서 우리는 다음 세트를 읽을 수 적절한 순차적으로 1-100에서 읽을 수 있지만 있습니다

1-100 (1,2,3,4,...100) 
101-200 
201-200 
and so on.. 

입니다 즉, 101-200. 그러나 추가 데이터 세트를 올바르게 읽을 수 있습니다.

데이터가 제대로 끝나고 있지만 (etheral 로그에서 볼 수 있음) 스트림에서 읽을 수 없습니다. 여기

socket.getInputStream.read(buffer); 

소켓은 소켓 클래스 유형의 인 코드입니다.

같은 이유는 무엇입니까? 의견을 공유하십시오.

+5

당신은 그보다 조금 더 많은 코드를 게시 할 필요가 있다고 생각합니다 ... – forsvarir

+1

multithreaded - 이것은 하나 이상의 스레드가 소켓에 앉아 있다는 것을 의미합니까? –

+1

왜 사람들이 Java를 자본화합니까? 어쨌든, 우리는 당신에게서 더 많은 코드가 필요합니다. –

답변

0

여기에 코드가 그렇지 않은

> socket.getInputStream.read(buffer); 

없음

스 니펫입니다. 해당 스 니펫은 컴파일되지 않습니다. 그리고 올바른 스 니펫은 분명히 명백합니다.

데이터를 놓칠 수있는 유일한 방법은 (i) 다른 스레드가 소켓을 동시에 읽는 경우 또는 (ii) 한 번에 BufferedInputStream 또는 BufferedReader를 사용하는 경우입니다.

0

이것은 다중 스레드 응용 프로그램이므로 코드를 보지 않고도 내 스레드가 Socket 또는 InputStream을 조작하는 다른 스레드에 있다는 것을 알 수 있습니다. 스레딩 문제는 발견 및 디버그하기가 매우 어려울 수 있습니다.

+2

여러 스레드가 동시에 입력 스트림의 "다른"부분을 읽으려고하는 것 같습니다. –

+0

@Harry, 네. InputStream에서 바이트를 읽음으로써 스트림의 읽기 위치를 변경함으로써 읽기 작업이 peek 조작이 수행되지 않는 InputStream을 조작한다는 것이 더 분명해야했습니다. –

+0

InputStream에는 'peek 조작'이 없습니다. 나는이 반응의 요점을 보지 못했다. 읽기 작업은 입력을 소비하므로 사라집니다. 그것만큼이나 간단합니다. – EJP

0

의견을 보내 주셔서 감사합니다. 문제는 멀티 스레딩 동기화에서 발생했습니다. 동일한 처리를했는데 정상적으로 작동했습니다.

관련 문제