Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - Xedrox

#1
Java / Monitor de mensajes entre client/sever
8 Enero 2015, 20:25 PM
Hola gente, buenos tardes

      Tengo una aplicancion cliente/servidor bastante simple. Lo que quiero hacer es un programa que este entre medio de los dos, por lo tanto los mensajes del cliente van a mi programa, y lo salientes al server y viceversa. El programa funciona bien, pero quiero que sea en contra de fallos del cliente/servidor (timeouts/desconexiones,etc). El caso que no estoy pudiendo resolver es el siguiente:

1.- Se recibe un mensaje del cliente y se lo envia al servidor, el servidor responde y le envio ese mensaje al cliente correctamente
2.- Ambas aplicaciones (cliente y servidor) se encuentran conectadas a mi programa
3.- Apago el servidor
4.- El cliente envia un mensaje, se lo paso al servidor y me da timeout
5.- El servidor revive
6.- Probamos el punto 1 de vuelta pero parece que mi programa no le puede entregar ahora el mensaje al servidor y no puede reconectarse adecuadamente

Este es el codigo, alguna idea que puede ser?


package interceptorprocess;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketException;
import java.net.SocketTimeoutException;


public class GenericInterceptorProcess implements Runnable
{
private final String prefix_log_messages = "[CONNECTOR]";

//COMMUNICATION'S ORIGIN'S VARIABLES
ServerSocket serverSocketLocal;
Socket socketForLocal;
DataInputStream streamFromOrigin;
DataOutputStream streamToOrigen;
int len_message_from_origen;
byte[] buffer_msg_origin = new byte[4096];
byte[] message_origin = null;

//COMMUNICATION'S DESTINY'S VARIABLES
Socket socketToDestiny;
DataInputStream streamFromDestiny;
DataOutputStream streamToDestiny;
int len_message_from_destiny;
byte[] buffer_msg_destiny = new byte[4096];
byte[] message_destiny;

@Override
public void run()
{
    //OCCASIONAL USE
    String aux;

    try
    {
        logger("STARTING SERVER --- PORT NUMBER: " + "1234");

        //CREATING THE LOCAL SERVER SOCKET
        serverSocketLocal = new ServerSocket(1234);

        //CREATING THE DESTINITY CONNECTION WITH 15 TIMEOUT'S SECONDS
        socketToDestiny = new Socket();
        socketToDestiny.setSoTimeout(15000);

        //THIS LOOP MAINTAINS THE CONNECTIVITY WITH ONE CLIENT AT TIME
        while ( true )
        {
            logger("WAITING FOR A CONNECTION OF A CLIENT...");
            socketForLocal = serverSocketLocal.accept();

            //CREATING THE ORIGIN'S STREAMS
            streamFromOrigin = new DataInputStream(socketForLocal.getInputStream());
            streamToOrigen = new DataOutputStream(socketForLocal.getOutputStream());

            logger("CONNECTED CLIENT: " + socketForLocal.getRemoteSocketAddress() );

            //THIS LOOP MAINTAINS THE MESSAGES'S CHANGES
            while ( true )
            {
                logger("WAITING FOR A MESSAGE..");
                len_message_from_origen = streamFromOrigin.read(buffer_msg_origin);

                if ( len_message_from_origen < 0 )
                {
                    closeOriginStream();
                    break;
                }

                message_origin = new byte[len_message_from_origen];

                //SAVE THE ORIGIN'S MESSAGE INTO AN ARRAY WHO HAS THE EXACT SIZE OF THIS MESSAGE
                System.arraycopy(buffer_msg_origin, 0, message_origin, 0, len_message_from_origen);

                aux = new String(message_origin);
                logger("RECEIVED MESSAGE FROM ORIGIN: " + aux);

                //TRY TO CONNECT TO DESTINY
                try
                {
                    if ( !socketToDestiny.isConnected() )
                        socketToDestiny.connect(new InetSocketAddress("10.10.200.200",1234),5000);
                }
                catch(IOException ex)
                {
                    logger("CONNECTION REJECTED BY DESTINY: " + ex.getMessage());
                    continue;
                }

                //CREATING THE DESTINY'S STREAMS
                streamFromDestiny = new DataInputStream(socketToDestiny.getInputStream());
                streamToDestiny = new DataOutputStream(socketToDestiny.getOutputStream());

                logger("SENDING MESSAGE TO DESTINY: " + aux);

                //I HAD TO PUT THIS BLOCK BECAUSE IF THE DESTINY APPLICATIONS FAILS
                //OR NOT ANSWER, THE PROGRAM MUST KEEP LISTENING THE FOLLOWING MESSAGES
                try
                {
                    //SENDING MESSAGE TO DESTINY
                    streamToDestiny.write(message_origin);

                    //READING THE ANSWER MESSAGE
                    logger("READING MESSAGE FROM DESTINY...");

                    len_message_from_destiny = streamFromDestiny.read(buffer_msg_destiny);
                }

                //IN ONE OF THE FOLLOWINGS TWO CATCHS I GET THE ERROR
                catch (SocketTimeoutException ex)
                {
                    logger("IT DIDN'T COULD RETRIEVE A MESSAGE FROM DESTINY: " + ex.getMessage());
                    continue;
                }
                catch (SocketException ex)
                {
                    //THE "socketToDestiny.isConnected()" ALWAYS RETURNS TRUE SINCE THE FIRST SUCCESSFULLY
                    //CONNECTION, AFTER THAT, IF THE SOCKET IS DISCONNECTED, IT REMAINS RETURNING "true".
                    //THUS, I HAD TO MAKE THE NEXT CODE BLOCK
                    socketToDestiny.close();
                    socketToDestiny = new Socket();
                    logger("TRYING TO RECONNECT WITH DESTINY AND SEND THE MESSAGE... ");
                    socketToDestiny.connect(new InetSocketAddress(confs.destiny_ip,confs.destiny_port),confs.timeout_connections);
                    logger("READING MESSAGE FROM DESTINY AFTER ERROR...");
                    len_message_from_destiny = streamFromDestiny.read(buffer_msg_destiny);
                }

                message_destiny = new byte[len_message_from_destiny];

                //SAVE THE DESTINY'S MESSAGE INTO AN ARRAY WHO HAS THE EXACT SIZE OF THIS MESSAGE
                System.arraycopy(buffer_msg_destiny, 0, message_destiny, 0, len_message_from_destiny);
                aux = new String(message_destiny);

                logger("RECEIVED MESSAGE FROM DESTINY " + aux);

                //SENDING THE ANSWER BACK TO THE ORIGIN
                logger("SENDING BACK THE MESSAGE TO ORIGIN...");
                streamToOrigen.write(message_destiny);

                logger("MESSAGE DELIVERED SUCCESSFULLY!");
            } //INTERNAL LOOP OF MESSAGES

        } //INTERNAL LOOP OF CLIENTS
    } //TRY
    catch(IOException ex )
    {
        logger("THE SERVICE DIED: " +  ex.getMessage() );
        ex.printStackTrace();
    } //CATCH

} //RUN

private void closeDestinyStream() throws IOException
{
    streamFromDestiny.close();
    streamToDestiny.close();
}

private void closeOriginStream() throws IOException
{
    streamFromOrigin.close();
    streamToOrigen.close();
}

private void closeAll() throws IOException
{
    closeDestinyStream();
    closeOriginStream();
}

private void logger(String message)
{
    System.out.println(Utilidades.date() + " " + prefix_log_messages + " " + message);
}
}
#2
Java / Re: WebService, concepto
30 Agosto 2014, 23:05 PM
Pero al fin y al cabo no es un proceso que escribe/lee de una ip/puerto? Ya sabia lo de google y no aclara nada.
#3
Java / WebService, concepto
30 Agosto 2014, 20:01 PM
En terminos de Java, un webservice es simplemente un "ServerSocket" que recibe y responde mensajes en formato XML?
#4
Java / Read timeout
28 Agosto 2014, 19:36 PM
Hola gente , como os va?

   Les hago una consultonta, resulta ser que tengo un programa "Java" que se conecta como cliente (usando la clase Socket) a otro programa. Para leer un mensaje, uso la clase "DataInputStream", el metodo (int read(bytes[])". Resulta ser que muchas veces me conecto a este programa satisfactoriamente, pero a veces no me contesta y me quedo en un "read" eterno, conoces alguna manera de ponerle un timeout a ese read?

Muchas Gracias
Saludos!
#5
Pero siempre que uso la clase Socket y SocketServer, es TCP/IP?
#6
Java / Duda conceptual acerca de los Socket's
23 Junio 2014, 16:04 PM
Hola gente, les hago una consulta. En mi poca experiencia laburando con Socket's e implementado clientes y servidores con exito, abstrayendome de las cuestiones de hardware. Ahora mi duda viene por este lado. Cuando comunico los socket's, simplemente apunto a un puerto y numero de IP, supongo que el socket que estoy creando se basa en el protocolo TCP/IP. Se pueden implementar socket's con otros protocolos, como X25? Gracias! Salutes!
#7
Java / char[] to struct
15 Junio 2014, 02:16 AM
Hola gente, como andan?

   Si se guían por el titulo, parece que me equivoque de sección, no? Pero no es así  ;D . Les comento, vengo trabajando con C++ y unos archivos de datos de una aplicación externa un tanto engorrosos de trabajar, pero al fin uno se arregla. Cada linea de estos archivos de datos puede tratarse como un registro de una base de datos. El método que me trae el registro en C++ me lo deja cargado en un "char[XXX]" donde XXX es la cantidad de bytes. Por un lado yo tengo, a modo ejemplo, el siguiente "struct":


struct MiClase
{
     short campo1;
     short campo2;
     char campo3[5];
     short campo4;
}


A su vez, el metodo de lectura me dejo un lindo char[11], vease que MiClase tiene un size de 11. Por supuesto que esos 11 bytes estan compuestos de caracteres no imprimibles que corresponden al campo 1,2 y 4. Si instancio un objeto de MiClase, como traspaso la informacion del char? Simplemente haciendo un "memcpy".

Ahora, descubri recientemente que tengo Java en este equipo, y hasta tengo un metodo en Java que lee estos archivos!. Solo que en vez de "char[]" me los deja en "byte[]". La consulta es, si tuviera en java una clase equivalente a mi estructura:


public class MiClase
{
     short campo1;
     short campo2;
     Char campo3 = new Char[5];
     short campo4;
}


Como puedo volcar la informacion del "byte[]" a un objeto de "MiClase". Algunos podria decirme que use arracopy y que lo haga campo por campo, pero quiero evitar absolutamente esto porque tengo varias clases que superan los 200 campos y seria muy costoso salirme de C++ a Java si no puedo implementar algo similar a "memcpy".

Desde ya muchas gracias
Saludos.

#8
Java / Re: Cliente/Servidor basico
10 Junio 2014, 00:59 AM
Eso me pasa por copiarme ejemplo de blogueros de internet :facepalm to me:

Gracias!
#9
Java / Cliente/Servidor basico
2 Junio 2014, 23:54 PM
Hola gente como va? A ver si me pueden dar una mano con esto porque no doy pie con bola, google no me sirvio de mucho tampoco :S .

Estoy armando un cliente/servidor para posterior uso de manejo remoto, pero ni siquiera lo puedo hacer simplemente en mi pc local. Me baje y compile estos ejemplos:

Codigo del server:

package serverclienttest;

import java.net.*;
import java.io.*;

public class Server
{
    final int PUERTO=5000;
    ServerSocket sc;
    Socket so;
    DataOutputStream salida;
    String mensajeRecibido;

    //SERVIDOR
    public void initServer()
    {
        BufferedReader entrada;

        try
        {
            sc = new ServerSocket(PUERTO );/* crea socket servidor que escuchara en puerto 5000*/
            so=new Socket();
       
            System.out.println("Esperando una conexión:");
            so = sc.accept();

            //Inicia el socket, ahora esta esperando una conexión por parte del cliente
            System.out.println("Un cliente se ha conectado.");

            //Canales de entrada y salida de datos
            entrada = new BufferedReader(new InputStreamReader(so.getInputStream()));
            salida = new DataOutputStream(so.getOutputStream());

            System.out.println("Confirmando conexion al cliente....");
            salida.writeUTF("Conexión exitosa...n envia un mensaje :D");

            //Recepcion de mensaje
            mensajeRecibido = entrada.readLine();
            System.out.println(mensajeRecibido);

            salida.writeUTF("Se recibio tu mensaje.n Terminando conexion...");
            salida.writeUTF("Gracias por conectarte, adios!");

            System.out.println("Cerrando conexión...");
            sc.close();//Aqui se cierra la conexión con el cliente

        } //try
        catch(Exception e )
        {       
            e.printStackTrace();
            System.out.println("Error: "+e.getMessage());
        } //catch
    } //initServer
} //class


Codigo del cliente:


package serverclienttest;

import java.net.*;
import java.io.*;

public class Client
{

    final String HOST = "localhost";
    final int PUERTO=5000;
    Socket sc;
    DataOutputStream mensaje;
    DataInputStream entrada;

    //Cliente
    public void initClient() /*ejecuta este metodo para correr el cliente */
    {

        try
        {
            sc = new Socket( HOST , PUERTO ); /*conectar a un servidor en localhost con puerto 5000*/
            //creamos el flujo de datos por el que se enviara un mensaje
            mensaje = new DataOutputStream(sc.getOutputStream());

            //enviamos el mensaje
            mensaje.writeUTF("hola que tal!!");

            //cerramos la conexión
            sc.close();
        }
        catch(Exception e )
        {
            System.out.println("Error: "+e.getMessage());
            e.printStackTrace();
        }
    }//initClient
}//class


Al ejecutar el servidor (por medio de initServer) se queda en "Esperando una conexion.." , OK. Al ejecutar el cliente en otra instancia (por medio de initClient) da el siguiente error:


run:
Esperando una conexión:
Un cliente se ha conectado.
Confirmando conexion al cliente....
java.net.SocketException: Software caused connection abort: recv failed
Error: Software caused connection abort: recv failed
at java.net.SocketInputStream.socketRead0(Native Method)
at java.net.SocketInputStream.read(SocketInputStream.java:152)
at java.net.SocketInputStream.read(SocketInputStream.java:122)
at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:283)
at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:325)
at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:177)
at java.io.InputStreamReader.read(InputStreamReader.java:184)
at java.io.BufferedReader.fill(BufferedReader.java:154)
at java.io.BufferedReader.readLine(BufferedReader.java:317)
at java.io.BufferedReader.readLine(BufferedReader.java:382)
at serverclienttest.Server.initServer(Server.java:39)
at serverclienttest.ServerClientTest.main(ServerClientTest.java:21)
BUILD SUCCESSFUL (total time: 7 seconds)


Y no se que varia que en otras oportunidades da esto:

run:
run:
Esperando una conexión:
Un cliente se ha conectado.
Confirmando conexion al cliente....
      hola que tal!!
java.net.SocketException: Software caused connection abort: socket write error
Error: Software caused connection abort: socket write error
at java.net.SocketOutputStream.socketWrite0(Native Method)
at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:113)
at java.net.SocketOutputStream.write(SocketOutputStream.java:159)
at java.io.DataOutputStream.write(DataOutputStream.java:107)
at java.io.DataOutputStream.writeUTF(DataOutputStream.java:401)
at java.io.DataOutputStream.writeUTF(DataOutputStream.java:323)
at serverclienttest.Server.initServer(Server.java:42)
at serverclienttest.ServerClientTest.main(ServerClientTest.java:21)
BUILD SUCCESSFUL (total time: 6 seconds)


Por si las dudas uso Netbeans y desactive el firewall de windows para la prueba.

Gracias de antemano.

Saludos!
#10
Lastima que no tengo ssh habiltado en el equipo :( . Probare creando un socket remoto y local.