2013-05-25 4 views
0

은 무작위 (그러나 작은) 간격으로 연속적인 데이터를 보내는 데 필요한 소켓을 가지고 있다고 가정 할 수 있습니다. 약 20 개 개체를 초 단위로 말할 수 있습니다.소켓을 통한 연속적인 데이터

나는 어떻게 처리해야할지 모르겠다는 가능성이있는 문제를보고 있습니다.

1) 예제 A에서와 같이 한 번에 하나의 객체를 보내면 그 객체는 낱개로 도착할 수 있습니까? 예제 B에서와 같이하는 것이 더 나은가?

2) 데이터를받는 스레드가 전체 개체가 전송되기 전에 데이터를 읽으려고 시도하여 데이터를 분할하고 내가 알아야 할 다른 문제를 만들 수 있습니까?

void run() 
{ 
    get socket outputstream 
    while (isBroadcasting) 
    { 
     while (myQueue.isEmpty() == false) 
      send all object in queue through outputstream 

     Thread.sleep(25); 
    } 
} 

그리고 마지막으로이

void run() 
{ 
    get socket inputstream 
    while (isReceiving) 
    { 
     get object(s) from inputstream and publish them to main thread 

     Thread.sleep(25); 
    } 
} 

3처럼 읽기

void run() 
{ 
    get socket outputstream 
    while (isBroadcasting) 
    { 
     if (myQueue.isEmpty() == false) 
      send first object in queue through outputstream 

     Thread.sleep(25); 
    } 
} 

예를 들어 B이

예처럼 보일 수있는 데이터를 전송하는

의사)는겠습니까 이 실행 가능한 솔루션이 될 수 있을까요? 끝날 때까지 양쪽 끝에서 스트림을 열어두고 루핑하고 데이터를 쓰거나 읽는 것이 좋습니다.

답변

2

1) 예제 A에서와 같이 한 번에 하나의 객체를 보내면 그 객체는 여전히 묶여있을 수 있습니까? 예제 B에서와 같이하는 것이 더 나은가?

당신이 보내고있는 네트워크의 유형에 따라, 그들은 수신 끝에서 확실히 움큼에 도착할 수 있습니다. 또한 TCP를 사용하는 경우 Nagle's algorithm의 응용 프로그램은 더 많은 묶음과 명백한 지연을 도입 할 수 있습니다.

2) 가능한 데이터를 수신 스레드가 전체 개체 따라서, 분할 데이터를 전송하고, 내가 피려 할 것이다 또 다른 문제를 만들기 전에 데이터를 읽으려고시겠습니까?

이것은 구현 세부 사항에 매우 의존하며 제공된 의사 코드로 대답 할 수 없습니다.

스트림이 양쪽 끝에서 계속 열려 있고 루핑되고 완료 될 때까지 데이터를 쓰거나 읽는 것이 좋습니까?

그렇습니다. 오랫동안 이와 같은 TCP 연결을 사용하는 것이 합리적입니다. 그러나 어떤 이유로 연결이 끊어지면 응용 프로그램에서 다시 연결해야합니다.

+0

질문 2에 대한 추가 정보, 만약 내가 DataOutputStream.Write (byteArray, 0, byteArray.length)를 통해 그들을 보냈을 경우 그들은 전체적으로 다른 쪽에서 읽힐까요? 고마워요, 그리고 당신의 대답을 받아 들일 것입니다. – WIllJBD

+2

아니요. TCP는 메시징 시스템이 아닌 바이트 스트림입니다. – EJP

+0

EJP, 나는이 배열을 다른 쪽에서 읽을 때 바이트 배열을 보내면 무슨 뜻인지 짐작합니다. 배열의 모든 바이트가 그것을 통해 만들었습니까? 그래서 나는 그들로부터 완전한 대상을 만들 수 있습니까? – WIllJBD