Pessoal,
Tenho uma aplicação desktop cliente-servidor com o seguinte cenário:
- Servidor fica aguardando cliente se conectar. Quando cliente conecta (socket), cria-se uma
Thread no servidor e o mesmo passa a aguardar o próximo cliente.
- Vários clientes podem conectar-se ao mesmo tempo ao servidor. Cada solicitação é processada
em uma Thread em paralelo com as outras.
Está ocorrendo o seguinte erro abaixo no servidor, quando muitos clientes conectam ao mesmo tempo.
INFO | jvm 1 | 2009/03/19 09:27:44 | java.net.SocketException: Connection reset by peer: socket write error
INFO | jvm 1 | 2009/03/19 09:27:44 | at java.net.SocketOutputStream.socketWrite0(Native Method)
INFO | jvm 1 | 2009/03/19 09:27:44 | at java.net.SocketOutputStream.socketWrite(Unknown Source)
INFO | jvm 1 | 2009/03/19 09:27:44 | at java.net.SocketOutputStream.write(Unknown Source)
INFO | jvm 1 | 2009/03/19 09:27:44 | at java.io.ObjectOutputStream$BlockDataOutputStream.drain(Unknown Source)
INFO | jvm 1 | 2009/03/19 09:27:44 | at java.io.ObjectOutputStream$BlockDataOutputStream.setBlockDataMode(Unknown Source)
INFO | jvm 1 | 2009/03/19 09:27:44 | at java.io.ObjectOutputStream.
Este erro em si não é o maior problema. Acontece que, após um tempo, o módulo servidor trava com o seguinte
erro de falta de memória.
INFO | jvm 1 | 2009/03/19 09:31:23 | Exception in thread "DRDAConnThread_5"
INFO | jvm 1 | 2009/03/19 09:31:24 | java.lang.OutOfMemoryError: Java heap space
INFO | jvm 1 | 2009/03/19 09:31:27 | at java.lang.Class.getDeclaredMethods0(Native Method)
INFO | jvm 1 | 2009/03/19 09:31:28 | at java.lang.Class.privateGetDeclaredMethods(Unknown Source)
INFO | jvm 1 | 2009/03/19 09:31:29 | at java.lang.Class.getMethod0(Unknown Source)
INFO | jvm 1 | 2009/03/19 09:31:30 | at java.lang.Class.getMethod0(Unknown Source)
INFO | jvm 1 | 2009/03/19 09:31:30 | at java.lang.Class.getMethod0(Unknown Source)
INFO | jvm 1 | 2009/03/19 09:31:30 | at java.lang.Class.getMethod(Unknown Source)
INFO | jvm 1 | 2009/03/19 09:31:31 | at org.apache.derby.impl.drda.DRDAStatement.getParameterMetaData(Unknown Source)
INFO | jvm 1 | 2009/03/19 09:31:31 | at org.apache.derby.impl.drda.DRDAConnThread.writeSQLDARD(Unknown Source)
INFO | jvm 1 | 2009/03/19 09:31:31 | at org.apache.derby.impl.drda.DRDAConnThread.processCommands(Unknown Source)
INFO | jvm 1 | 2009/03/19 09:31:32 | at org.apache.derby.impl.drda.DRDAConnThread.run(Unknown Source)
Abaixo parte do código no Servidor:
public void run() {
try {
// Obtém pacote enviado pelo cliente.
input = new ObjectInputStream(socket.getInputStream());
pacote = (Pacote)input.readObject();
// Processa o pacote.
pacote = processarPacote(pacote);
// Envia resposta ao cliente.
output = new ObjectOutputStream(socket.getOutputStream());
output.writeObject(pacote);
output.flush();
output.reset();
} catch (ClassNotFoundException ex) {
desconectar();
ex.printStackTrace(System.out);
logger.error("[ComunicacaoThread]: ", ex);
} catch (IOException ex) {
desconectar();
ex.printStackTrace(System.out);
logger.error("[ComunicacaoThread]: ", ex);
}
}
private void desconectar() {
try {
if ( input != null ) {
input.close();
}
if ( output != null ) {
output.close();
}
if ( socket != null && socket.isConnected() ) {
socket.close();
}
} catch (IOException ex) {
ex.printStackTrace(System.out);
logger.error("[ComunicacaoThread]: ", ex);
}
}
E parte do código no Cliente:
// Envia pacote ao servidor.
output = new ObjectOutputStream(socket.getOutputStream());
output.writeObject(pacote);
output.flush();
output.reset();
boolean sucesso = false;
int i = 0;
do {
try {
// Recebe pacote do servidor.
count++;
input = new ObjectInputStream(socket.getInputStream());
pacote = (Pacote)input.readObject();
sucesso = true;
} catch (Exception ex) {
i++;
sleep(500);
ex.printStackTrace();
}
} while(!sucesso && i < 5);
Alguém tem alguma sugestão para resolver o problema? Se for necessário mais código fonte para entender
o problema, favor avisar.
Abs,
Fabio
