2012-01-20 2 views
6

내가 이해할 수없는 문제가 있습니다.Strange Flash AS3 xml 소켓 동작

나는 AS3에서 소켓 클라이언트를 작성했고 파이썬에서 서버를 작성했는데/꼬인 경우 아래 두 응용 프로그램의 코드를 볼 수 있습니다.

clients 두 개를 동시에 시작하고 두 창을 모두 볼 수 있고 두 창에서 연결 버튼을 누를 수 있도록 정렬하십시오. 그런 다음 아무 버튼이나 누르고 있습니다. 내가 기대하고있어 무엇

: 눌러 진 버튼

클라이언트는 메시지 서버에 "일부 데이터를"전송은, 서버는 (원래 보낸 사람을 포함하여) 모든 클라이언트에이 메시지를 보냅니다.

그러면 각 클라이언트는 'connectButton'버튼을 오른쪽으로 이동하고 "min : secs : milliseconds"형식의 시간과 함께 메시지를 로그에 인쇄합니다.

모션 메시지를 보내는 클라이언트 부드러운이지만, 다른 모든 클라이언트의 움직임 육포입니다 :

잘못 무슨 일이야.

이러한 클라이언트에 대한 메시지가 원래 보내는 클라이언트보다 늦게 도착하기 때문에 이러한 현상이 발생합니다. 그리고 우리가 세 개의 클라이언트 (A, B, C로 지칭)를 가지고 A에서 메시지를 보내면 B와 C의 전송 시간 로그는 동일하게됩니다.

왜 다른 클라이언트가 원래 보낸 사람보다 나중에이 메시지를 수신합니까?

우분투 10.04/크롬에서는 모든 동작이 부드럽습니다. 두 명의 고객이 분리 된 크롬으로 출시됩니다. 동시에

windows screenshot

로그의

linux screenshot

목록, 넷 클라이언트 :

[16:29:33.280858] 62.140.224.1 >> some data 
[16:29:33.280912] 87.249.9.98 << some data 
[16:29:33.280970] 87.249.9.98 << some data 
[16:29:33.281025] 87.249.9.98 << some data 
[16:29:33.281079] 62.140.224.1 << some data 
[16:29:33.323267] 62.140.224.1 >> some data 
[16:29:33.323326] 87.249.9.98 << some data 
[16:29:33.323386] 87.249.9.98 << some data 
[16:29:33.323440] 87.249.9.98 << some data 
[16:29:33.323493] 62.140.224.1 << some data 
[16:29:34.123435] 62.140.224.1 >> some data 
[16:29:34.123525] 87.249.9.98 << some data 
[16:29:34.123593] 87.249.9.98 << some data 
[16:29:34.123648] 87.249.9.98 << some data 
[16:29:34.123702] 62.140.224.1 << some data 

AS3 클라이언트 코드, 나는, full code here는 관련 부분을 떠났다.

 private var socket   :XMLSocket; 

     socket = new XMLSocket(); 
     socket.addEventListener(DataEvent.DATA, dataHandler); 

     private function dataHandler(event:DataEvent):void 
     { 
      var now:Date = new Date(); 
      textField.appendText(event.data + "   time = " + now.getMinutes() + ":" + now.getSeconds() + ":" + now.getMilliseconds() + "\n"); 
      connectButton.x += 2; 
     } 

     private function keyDownHandler(event:KeyboardEvent):void 
     { 
      socket.send("some data"); 
     } 

     private function connectMouseDownHandler(event:MouseEvent):void 
     { 
      var connectAddress:String = "ep1c.org"; 
      var connectPort:Number = 13250; 

      Security.loadPolicyFile("xmlsocket://" + connectAddress + ":" + String(connectPort)); 
      socket.connect(connectAddress, connectPort); 
     } 

Python server code.

+1

SWF 개체에 HTML의 포커스가 없으면 낮은 프레임 속도로 실행됩니다. 이것은 "고르지 않음"을 설명 할 것입니다, 우분투/크롬에서는 괜찮습니다. 설치 프로그램에서 플래시 플레이어가 될 수 있습니다. 다르게 처리합니다. 당신은 같은 기계에있는 것이 아니라 다른 기계들에서 시도해 보셨습니까? 나는 막연하게 속도가 약 2 FPS로 떨어질 수 있다는 것을 기억하고있다. –

+0

고맙다. 나는 우분투와 2 대의 다른 머신을 시험해 보았다. 두 개의 다른 컴퓨터 (모든 클라이언트가 포커스가 있음)에서 두 클라이언트를 실행 중이면 클라이언트가 데이터 대기 모드 및 불량 시간 로그를 보냅니다 (아래 질문 에서처럼). –

답변

4

ACK delay 및/또는 Nagle's algorithm의 조합이있을 수 있습니다. 이 두 가지 모두 TCP 세션에서 데이터 이동을 선택적으로 지연시킬 수 있으며 구현은 플랫폼에 따라 크게 다릅니다.

소켓에서 setsockopt()TCP_NODELAY을 사용하여 Nagle을 사용하지 않도록 설정하십시오.

AFIK, Windows에서는 소켓 단위로 ACK 지연을 사용하지 않도록 설정할 수 없습니다. edit the registry이어야하며 모든 TCP에 대해 사용하지 않도록 설정해야합니다. 따라서 먼저 TCP_NODELAY을 시도하십시오. 그래도 작동하지 않으면 ACK 지연을 사용하지 않도록 설정하십시오. 레지스트리 편집이 응용 프로그램에 실용적이지 않더라도 ACK 지연이 문제인지 여부를 아는 것만으로도 다른 해결 방법을 찾을 수 있습니다.

+0

OMG, 작동하는 것 같습니다! twissted 서버의 * connectionMade * 메소드에'self.transport.setTcpNoDelay (True)'를 설정했습니다. –

1

나는 이것이 조금 늦었다 고 알고 있지만, 이것은 서버와 비 시작 클라이언트 사이의 TCP 연결을 설정하는 데 걸리는 시간 때문일 가능성이 큽니다.

시작 클라이언트와 서버 (첫 번째 클라이언트의 메시지보다 먼저 설정 됨) 사이에 TCP 연결이 이미 설정되어 있으므로이 경우 3 방향 핸드 셰이크를 수행하는 데 걸리는 시간이 제거됩니다 .

몇 가지 방법으로 테스트 할 수 있습니다. 실제 메시지 처리 (예 : 각각에 더미 메시지 보내기) 전에 연결을 설정하면 가장 쉽습니다.

각 클라이언트와의 연결을 설정하지 않으려는 경우에도 UDP로 전환 할 수 있지만 TCP의 안정성은 떨어집니다.

Linux에 대한 귀하의 의견을 잘 모르겠습니다. 리눅스에서 의도 한대로 작동하지만 Windows에서는 작동하지 않는다고 말하는가? 그렇다면 동일한 호스트에서 실행되는 모든 클라이언트와 같이 설정에 대해 더 알고 있어야합니다. 동일한 브라우저 인스턴스에서?

+0

늦지 않았다. 고마워. 데이터 전송 전에 연결이 설정되었습니다. 나는 두 명의 고객 (질문의 시작 부분에있는 링크)을 열고 그것들을 가지고 놀 수 있습니다. 예, 리눅스에서 의도 한대로 작동합니다. 동일한 호스트, 클라이언트와 동일한 플래시 플레이어, 둘 다에 크롬. –