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

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:

[code]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) { }
}[/code]

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

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):

[code] 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();   
    }[/code]

Fala Danilo,

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

falou

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

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:

Up!

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)