Buscar
Social
Ofertas laborales ES

Foro sobre Java SE > Mantener socket abierto en TCP

Hola a todos!

A ver si me podeis echar una mano, porque no encuentro la solución por ningún sitio.

Tengo una aplicación cuyo objetivo es desplegar en dos nodos y que estos nodos se comuniquen vía TCP. Me piden como requisito que el socket TCP que envía NO se cierre, pero me estoy encontrando con que si no cierro el socket en el emisor, el receptor no lo recibe.

Con un sniffer he comprobado que el mensaje llega al destino, pero por alguna razón el socket no devuelve el mensaje a mi aplicación.

Trabajo con ServerSocket y Socket. Lamentablemente, no puedo pegaros el código, pero no creo que haga falta, mi duda es conceptual ¿es obligatorio cerrar el socket en el emisor para que el receptor reciba el mensaje?

Saludos y gracias!!!

octubre 11, 2011 | Unregistered Commenterjath

Venga, algo de código, a ver si alguien me puede guiar un poco

Escritura:

if (socket == null || socket.isClosed()) {
socket = new Socket(ip, port);
socket.setKeepAlive(mantenerSocket);
output = new DataOutputStream(socket.getOutputStream());
}
XXXDatagram datagram = new XXXDatagram(sourceCountry, sourceSystem, sourceSubsystem);
datagram.setCompression(encoding);
datagram.setPriority(priority);
byte[] bytes = datagram.encodeDatagram(message, destinationCountry, destinationSystem, destinationSubsystem);
output.write(bytes);


Lectura:

Socket clientSocket = null;
DataInputStream in = null;
clientSocket = serverSocket.accept();
clientSocket.setKeepAlive(mantenerSocket);
in = new DataInputStream(clientSocket.getInputStream());
byte[] buffer = new byte[bufferSize];
byte[] datagram = new byte[bufferSize];
int numBytes = 0;
int length = 0;
while ((numBytes=in.read(buffer)) != -1) {
System.arraycopy(buffer, 0, datagram, length, numBytes);
length += numBytes;
}
newDatagram(datagram);

Gracias!!

octubre 11, 2011 | Unregistered Commenterjath

Prueba a realizar un output.flush() después de la escritura .

octubre 11, 2011 | Unregistered CommenterGarca

Lo probé sin éxito ;-)
Gracias Garca!

octubre 12, 2011 | Unregistered Commenterjath

Pues si que es raro, ¿nos podrías contar con más detalle lo que pasa?

Por lo que he entendido, cuando no cierras el socket (emisor supongo), ves con el sniffer que los datos llegan al socket receptor, pero la aplicación no tiene conocimiento de esos datos, no?

octubre 12, 2011 | Registered Commenterrobertiano

Prueba, aunque te parezca una tontería, de usar BufferedReader en lugar de DataInputStream y dinos que tal te fue!

octubre 12, 2011 | Registered Commenterjordibr7

Asi es, robertiano.

Lo probare, jordibr7.

Gracias, saludos!

octubre 13, 2011 | Unregistered CommenterJath