Outras alternativas para envio de mensagens via Sockets... tem?

5 respostas
D

Olá!

Fiz uma aplicação onde envio várias mensagens via Sockets, mas percebo que, se eu enviar muitas mensagens, umas 500 mensagens para um servidor, percebo que nem todas as mensagens são enviadas.

Exemplo:

Socket s = null;
PrintStream ps = null;
String tmpLine;

//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());

//loop para mandar as mensagens lidas de uma List
for (int x = 0; x < messages.getItemCount(); x++)
{
	//pega a mensagem x da List (a List tem XXXXXX mensagens, ou linhas com vários caracteres)
    tmpLine = messages.getItem(x);

    //manda a mensagem  para o socket
    ps.println(tmpLine);
    ps.flush();
}

//fechando o socket....
s.close();

Quando eu executo isso (numa Thread separada, ou etc...), metade (ou mais) das mensagens não são enviadas, havendo perda de dados.
Existe alguma outra alternativa de fazer sockets e enviar essas mensagens sem perder nada???
(OBS.: O servidor é feito em C#. Uma aplicação IGUAL a essa feita em C#, também, manda as mensagens tranquilamente sem nenhum erro)

5 Respostas

F

De Java pra Java usaria RMI.

V

Sockets dão 3 garantias:

  1. Entrega;
  2. Ordenação;
  3. Integridade.

Se o seu programa não está recebendo mensagens, é porque está errado. Não é um problema dos sockets.

D

Tenho certeza que o problema é com o java, pois em outras linguagens (C#, C C++) eu chego a enviar mais de 4000 mensagens em 1 segundo e não perde nenhuma mensagem…

Só se o jeito que eu fiz está errado… ou o java não aguenta… pq o server foi feito em C# e não tem problemas (falo isso pq uso a parte servidor pra fazer teste de performance em servidores)

essa mesma aplicação aí de enviar mensagens feitas em C# não perde nenhuma mensagen… nao pode ser a parte server

V

Você fez a aplicação do jeito errado. Sem dúvida. Para começar, faltou fechar o seu PrintStream também. Faça isso antes de fechar o socket.

Eu trabalhava com intensa comunicação socket via Java. Fazia um sistema que simulava mais de 1000 telefones simultâneos, num fluxo mais de 10 vezes maior que o seu.

É bom lembrar que o Java é uma das principais linguagens no desenvolvimento de servidores web. Se houvesse um problema tão crítico quanto o que você está descrevendo, ele certamente já teria sido notado e corrigido.

D

Fiz o teste fechando a PrintStream, mas ao fechar a PrintStream, o socket aberto é fechado também, e isso não pode ocorrer…

Criado 5 de outubro de 2009
Ultima resposta 28 de out. de 2009
Respostas 5
Participantes 3