2012-03-24 5 views
4

Mojolicious :: Lite 모듈을 사용하여 프로토콜을 처리 할 웹 소켓 서버를 실행하고 있습니다. 원래 내가 실제로하고되면서웹 소켓과 Mojolicious로 플러시?

socket.onopen = function(){$.each(proxies, function(){socket.send(this);});} 
socket.onmessage = function(response){alert(response);} 

그리고

websocket '/' => sub { 
    my $self = shift; 
    $self->on(message => sub { 
     my ($self, $message) = @_; 
     my @info = split /-/,$message; 

     $mech_proxy = WWW::Mechanize->new(timeout=>$info[1], autocheck=>0); 
     $self->send(test_proxy($info[0]) => sub{sleep(int(rand(10)))}); 
    }); 
}; 
app->start; 

가 어쨌든 나는이 명확하게 출력을 플러시 할 필요가 없도록 것이라고 생각 서버 :이 테스트 나는 현재 클라이언트 사용하고 코드입니다 하나는 클라이언트 쪽을 보낸 다음 서버 측의 루프에서 반환 메시지를 보냅니다. 이것은 출력을 플러시 할 수 없기 때문에 루프가 끝날 때까지 기다려야하기 때문에 작동하지 않았습니다. 그러나 마지막 서버 측 전송이 완료 될 때까지 기다려야 만 데이터를 클라이언트에 전송할 때까지 주변을 변경하면 도움이되지 않습니다. 처리 과정에서 실시간 '업데이트'를받는 방법, 즉 서버 응답을 보낼 때 출력하는 방법에 대해 알고 계십니까?

편집 : setTimout(socket.send(this),1000)과 혼합 된 결과가 나타납니다. 필자가 생각한 것은 아마도 데이터를 플러시하기 위해서는 이전 데이터가 처리되고 서버 측에 완전히 기록 된 후에 만 ​​새로운 데이터를 보내야한다는 것입니다. 이것이 실제로 옳다는 것을 증명하면 클라이언트 측에 새로운 데이터가 전송 된 이전 데이터의 결과를받은 후에 만 ​​클라이언트 측에 쓸 수 있어야합니다. 이렇게하면 원하는 '라이브'업데이트를 가져 오는 효과를 얻을 수 있습니다.

+0

가혹한 의견을 보내 주셔서 불편을 끼쳐 드려 죄송합니다. 다시 한 번 말씀 드리지만 유감스럽게 생각합니다. POST에서 글로벌 변수를 만드는 이유는 무엇입니까? 당신은 실제로 그것들을 필요로하지 않고 이미 SQL 문자열을 필요로합니다. 따라서 SQL 쿼리를 직접 생성 할 수 있습니다. 함정도 있습니다. 필드 이름은 허용 목록에 있어야합니다 (또는 POST에 user_role = admin과 같은 것이있을 수 있습니다). 필드 이름 배열 (일치하는 HTML 양식 필드)이있는 경우이를 반복하여 쿼리, 이스케이프 및 * 인용 필드 *. 후자는 매우 중요합니다. 혼자서 도피하면 아무 도움이되지 않습니다. –

+0

걱정할 필요가 없습니다. 이유가있었습니다. 네가 게시 한 것에 옳았 기 때문에 내가 그 논쟁하고 싶지 않다고 말하기 때문에 나는 그 글을 삭제했다. 나는 매우 큰 응용 프로그램에서이 방법을 사용했다. a) 쉽게 확장 할 수 있었고, b) 올바른 변수 명명 규칙을 적용하는 데 도움이되었다. (일반적으로 루프는 다른 데이터 형식을 특정 방식으로 처리하고 접두사를 추가하고 필터링 및 정렬하는 스위치를 포함한다. 기타). 저장 프로 시저의 SQL 사용은 항상 선호되므로 이러한 고려 사항은 실제로 적합하지 않습니다. –

+0

그러나 어쨌든 허용 된 모든 변수 이름을 가진 배열이 필요한 모든 명명 규칙을 시행하려면 안 그렇습니까? 하지만 스 니펫에서 $ _POST 만 사용하고 있다고 게시 했으므로 클라이언트 측에서 오는 이름을 제어 할 수있는 방법이 없었습니다. –

답변

1

OK

건배 새로운 데이터 (이하 코드)에 다시 응답을 수신 한 후에 만 ​​전송되어야 위가 아니라, 상기 한, 그것을 정리. 또한 놀랍게도이 방법은 사실 jquery 루프를 사용하는 것보다 빠릅니다.

socket.onopen = function(){ 
    socket.send(proxies[0]+'-'+timeout); 
    proxies.splice(0,1); 
} 

socket.onmessage = function(response){ 
    if (proxies.length > 0) { 
     socket.send(proxies[0]+'-'+timeout); 
     proxies.splice(0,1); 
    } 
document.write(response.data); 
}