[RESOLVIDO] Envio de dados via Socket e PrintStream... perde dados

6 respostas
das_iommi

Olá a todos!

Estou desenvolvendo um programa, onde:
:!: Leio um TXT, que contém 10 linhas de strings (armazenando em uma List);
:!: Envio cada string da List através de um Socket e de uma PrintStream;
:!: Cada linha enviada eu:
---------> abro o socket
---------> seto o PrintStream
---------> mando a mensagem para um servidor (servidor está OK e não é JAVA);

Só que tenho um problema:
No for que lê cada mensagem da List, eu: Abro socket, seto o PrintStream, envio a string pro server.
Se eu não colocar um Thread.sleep(200), perde algumas mensagens, ou seja, eu envio 10 mensagens para o servidor, e ele recebe só 4 ou 6...
(Detalhe importante: fiz o mesmo código pra C# e funciona normalmente. o servidor recebe as mensagens numa pancada só!)

Código:
Socket s = null;
PrintStream ps = null;
String tmpLine;

private class runThread implements Runnable
{
    public void run()
    {
        try
        {
            //loop para mandar as mensagens lidas de uma List
            for (int x = 0; x < messages.getItemCount(); x++)
            {
				//abre um socket para o IP:PORTA digitado nos txts
                s = new Socket(txtIP.getText(), Integer.parseInt(txtPort.getText()));
                txtStatus.setText("Enviando a mensagem " + (x+1));
                
                //cria uma stream para enviar as mensagens
                ps = new PrintStream(s.getOutputStream());
				
				//pega a mensagem x da List (a List tem XX mensagens)
				tmpLine = messages.getItem(x);				
                
                //manda a mensagem  para o socket
                ps.println(tmpLine); 
				ps.flush();
                
				//se eu nao colocar um sleep, ele se perde e não manda todas as mensagens corretamente
                Thread.sleep(500);
	
                //fechando o socket....			
                s.close();
            }
        }

        catch (Exception ioe)
        {
			//Se der erro:
            jTextArea1.append("Erro:\n" + ioe.getMessage() + "\n" + ioe.getStackTrace() + "\n");
            txtStatus.setText("Disconnected");

        }
    }
}

//CHAMADA DA THREAD NUM BOTÃO:

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
    try
    {
        Thread thr = new Thread(new runThread());
        thr.start();
    }
    catch (Exception ex) { }
}

Tem algum jeito de fazer isso sem que eu tenha que conectar toda hora (talvez o problema seja esse), e enviar as mensagens pro servidor sem sleep???

6 Respostas

das_iommi

Pessoal... consegui enviar... mas ainda perde mensagem.

Criei o socket fora do loop, mas ainda sim, se eu não colocar thread.sleep ele nao manda todas as mensagens, o problema continua....

o try ficou assim agora (bem melhor):

try   
        {
            //RETIFICANDO
            //abre um socket para o IP:PORTA digitado nos txts, FORA do loop 
            s = new Socket(txtIP.getText(), Integer.parseInt(txtPort.getText()));
 
            //loop para mandar as mensagens lidas de uma List   
            for (int x = 0; x < messages.getItemCount(); x++)   
            {   
                   
                txtStatus.setText("Enviando a mensagem " + (x+1));   
                   
                //cria uma stream para enviar as mensagens   
                ps = new PrintStream(s.getOutputStream());   
                   
                //pega a mensagem x da List (a List tem XX mensagens)   
                tmpLine = messages.getItem(x);                 
                   
                //manda a mensagem  para o socket   
                ps.println(tmpLine);   
                ps.flush();   
                   
                //se eu colocar qualquer valor no sleep, até 1, ela envia todas as mensagens
                //se eu tirar a Thread.sleep... ele nao envia tudo
                Thread.sleep(1); 
            }
            //RETIFICANDO
            //fechando o socket....    agora FORA do loop       
            s.close();   
        }
hiram

Fala Danilo,

Manda o código inteiro pra mim? Gostaria de testar aqui… Pode ser via MP ou pro e-mail (Gmail).

falou

R

Já tentou tirar o ps = new PrintStream(s.getOutputStream()) do loop?

das_iommi

Já… até deixei fora, pq com ele no loop ou não, ele se perde também

No outro programa em C#, consegui enviar, em 1 segundo, 3000 linhas (cada linha mais ou menos tem uns 300 caracteres)
Queria chegar nesse ponto em JAVA, pq eu sei que dá ^.^

Então… voltando ao código:
Enviei 2000 linhas para o servidor numa pancada só e o servidor recebeu apenas 1000… ou 1200… ou até mesmo 500 dependendo da hora…

Ahh!! Se eu colocar isso:

Thread.sleep(0, 1);

ele manda todas as linhas certinho… mas eu perco muita performance colocando esse sleep (de 1 nanossegundo)… ele só envia umas 500 linhas por segundo :frowning:

das_iommi

Up!

das_iommi

Resolvido!

Troquei o List por um ArrayList, encontrei exemplos aqui mesmo no fórum.

(ressuscitei o tópico, mas vale a pena compartilhar o caso que foi resolvido)

Criado 23 de junho de 2009
Ultima resposta 26 de jul. de 2012
Respostas 6
Participantes 3