Ir para conteúdo
Fórum Script Brasil
  • 0

Progressbar com Socket


hipnos na area

Pergunta

É possivel fazer uma barra de progresso em um SOCKET no AS3?

Vejam como é a idéia:

port = 80;
host = "localhost";
sock = new Socket;
sock.addEventListener(Event.CONNECT,_conn);
sock.addEventListener(ProgressEvent.SOCKET_DATA,_onData);
sock.connect(host,port);

function _onData(e:ProgressEvent)
{
    trace("Reposta do servidor: "+sock.readUTFBytes(sock.bytesAvailable));
}

function _conn(e:Event){
    var bodyPart:Array ="Conteudo RAW com 8 megas";
    var headerPart:Array = [
        "POST /php-service.php HTTP/1.1",
        "Content-Type: application/soap+xml; charset=utf-8",
        "Host: "+host,
        "Content-Length:" + bodyPart.length,
        "Connection: close",
        "\r\n"
    ];

    sock.writeUTFBytes(headerPart.join("\r\n"));
    sock.writeUTFBytes(bodyPart);//CORPO - conteudo que vai ser feito download pelo webservice
    sock.flush();
}

Assim eu consigo conectar e enviar, mas se o arquivo que eu estiver para enviar for muito grande eu não quero que o cliente pense que travou ou deu erro, queria implementar uma barra de progresso. Pois que o conteudo que estou enviando para o servidor é muito pesado ocorre isso. Consegui simular uma barra de progresso, mas não é a mesma coisa.

Obrigado por lerem. Qualquer luz por favor me avisem

Editado por hipnos na area
Link para o comentário
Compartilhar em outros sites

4 respostass a esta questão

Posts Recomendados

  • 0

Fiz o seguinte:

sock = new Socket;
sock.addEventListener(Event.CONNECT,_conn);
sock.addEventListener(Event.CLOSE,function(e:Event){ trace("CLOSE: "+ e); });
sock.addEventListener(ProgressEvent.PROGRESS,function(e:ProgressEvent){ trace("PROGRESS: "+e); });//linha com PROGRESS
sock.addEventListener(IOErrorEvent.IO_ERROR,_onIOError);
sock.addEventListener(ProgressEvent.SOCKET_DATA,_onData);
sock.addEventListener(SecurityErrorEvent.SECURITY_ERROR,_onSecurityError);
sock.connect(_host,_port);
E tive o seguinte resultado:
Reposta do servidor: HTTP/1.1 200 OK

Date: Sat, 17 Dec 2011 12:14:13 GMT

Server: Apache

Vary: Accept-Encoding

Connection: close

Transfer-Encoding: chunked

Content-Type: text/html



7

Sucess.

0




CLOSE: [Event type="close" bubbles=false cancelable=false eventPhase=2]

Ou seja não deu certo. Eu fiz algo errado? Outra idéia?

Editado por hipnos na area
Link para o comentário
Compartilhar em outros sites

  • 0

O Socket writeUTFBytes não possui evento de PROGRESS não sendo possível retornar a quantidade de bytes enviados periodicamente.

O que pode ser feito é enviar os arquivo em pacotes menores dentro de um "for" ou "while"

var bytes_enviados = 0;

var bytes_total = bodyPart.length;

var tamanho_do_pacote = 64 * 1024;

var quantidade_de_pacotes = Math.ceil(bytes_total/tamanho_do_pacote);

for( var i=0; i<quantidade_de_pacotes; i++)

{

socket.writeBytes( bodyPart, i*tamanho_do_pacote, tamanho_do_pacote );

bytes_enviados += tamanho_do_pacote;

}

Possívelmente será nessário uma normalização referente ao ultimo pacote a ser enviado caso ele seja menor que 64kb

for( var i=0; i<quantidade_de_pacotes; i++)

{

if(i == quantidade_de_pacotes-1)

{

socket.writeBytes( bodyPart, i*tamanho_do_pacote, bytes_total-bytes_enviados );

bytes_enviados += bytes_total-bytes_enviados;

} else {

socket.writeBytes( bodyPart, i*tamanho_do_pacote, tamanho_do_pacote );

bytes_enviados += tamanho_do_pacote;

}

}

Sendo agora necessário criar um verificador do progresso a cada 1 segundo

var _porcentagem = 0;

var _interval = setInterval( view_progress, 1000 )

function view_progress()

{

_porcentagem = ( bytes_enviados * 100 ) / bytes_total;

}

É muitíssimo mais recomendavel utilizar a função upload() do fileReferences caso o arquivo possa ser escolhido manualmente, pois já possui um gerenciamento de memória e uma thread de processamento exclusivo para isso, assim como o Evento Progress

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,1k
    • Posts
      651,8k
×
×
  • Criar Novo...