Jump to content
Fórum Script Brasil
  • 0

Progressbar com Socket


hipnos na area

Question

É 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

Edited by hipnos na area
Link to comment
Share on other sites

4 answers to this question

Recommended Posts

  • 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?

Edited by hipnos na area
Link to comment
Share on other 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 to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.



  • Forum Statistics

    • Total Topics
      152.2k
    • Total Posts
      652k
×
×
  • Create New...