Java

Crear un listener o escuchador en Android

En Android podemos crear listener o escuchadores de dos maneras diferentes, por código o a través del fichero AndroidManifiest.xml

En este ejemplo vamos a crear un listener por código para que lance un evento al pulsar o hacer click un botón.

Lo hemos dividido en tres pasos:

Primero- Creamos el botón que vamos a utilizar para lanzar el evento.

Segundo- Vamos al evento onClick (Versión +1.6) del botón y escribimos el nombre de la función que queremos ejecutar cuando presionemos el botón.
En este caso llamaremos a la función lanzarExit(), que finalizará y saldrá del programa.

Tercero- Por último, declaramos el botón y le asignamos el listener o escuchador por código. Solo es necesario añadir las lineas que están comentadas, las demás las genera Eclipse cuando creas la Activity

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
public class NombreDeLaClase extends Activity {
 
	private Button bSalir; //Evento por código 
	@Override
	protected void onCreate(Bundle savedInstanceState) {
 
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
 
	        bSalir =(Button) findViewById(R.id.button4); //Evento por código 
	        bSalir.setOnClickListener(new OnClickListener() { //button4 corresponde al id del botón
	                   public void onClick(View view) {
	                	   lanzarExit(null);  //llamamos a la función después del onclick
	                  }
	            });
	}
 
	@Override
	public boolean onCreateOptionsMenu(Menu menu) {	
		getMenuInflater().inflate(R.menu.main, menu);
		return true;
	}
 
	 public void lanzarExit(View view){ // Función a la que llamamos
	 finish();
}
}
Leer más

Buscar en el código de una página web con java

En este programa hecho en jsp, le pasamos una URL cualquiera y nos buscará en el código de la página web la cadena que hayamos puesto como predeterminada, en este caso hemos puesto que busque en el código la cadena “h1″ (Qué en HTML se emplea para el formato de las títulos).

Para esto utilizamos un formulario en el que escribiremos la url y nos devolverá si ha encontrado o no la cadena en el código.

Utilizamos la clase URLConnection a la cual le pasamos una instancia de un objeto URL,

Este es el código de la página que devolverá si ha encontrado la cadena:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
 
 <%@ page import="java.net.URLConnection" %>
 <%@ page import="java.net.URL" %>
 <%@ page import="java.io.*"%>
 
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Leer código de pagina web</title>
</head>
<body>
 
<%
String text=""; 
String h1Mostrar="";
 
try {
    String nombreurl = request.getParameter("url");
    URL url = new URL(nombreurl);    
    URLConnection uc = url.openConnection();
    uc.connect();
 
    BufferedReader in = new BufferedReader(new InputStreamReader(uc.getInputStream()));
 
    StringBuilder builder = new StringBuilder();
    String aux = "";
 
    while ((aux = in.readLine()) != null) {
        builder.append(aux);
    }
    text = builder.toString();    
    StringBuffer sText = new StringBuffer(text);
 
    int h1Cuantos=0;
    int h1Donde=1;
 
		while (sText.indexOf("h1")!=-1 || h1Cuantos<2){
		    h1Donde=sText.indexOf("h1");
		    sText = new StringBuffer (sText.substring(h1Donde+1));
		    h1Cuantos++;
	    }
 
     	switch (h1Cuantos)	{
	   case 0:
	     h1Mostrar="Incorrecto: No existen elementos h1";			
	   break;
	   case 1:
	     h1Mostrar="Correcto: Existe un elemento h1";
	   break;
	   default:
	     h1Mostrar="Incorrecto: Existen más de un elemento h1";
	   break;
	}	
}
catch (Exception ex){
    ex.printStackTrace();
    System.out.println("ERROR: "+ex.getMessage());
} 
//System.out.println(text);
%>
<%=h1Mostrar %><br>
</body>
</html>

Este es el código del formulario en el que escribiremos la url:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
 
 <FORM action="devolucion.jsp" method="get">
    <P>
    <LABEL for="nombre">URL: </LABEL>
              <INPUT type="text" id="url" name="url"><BR>
    <INPUT type="submit" value="Enviar"> <INPUT type="reset">
    </P>
 </FORM>
</body>
</html>
Leer más

Socket TCP | Ejemplo de Cliente a Servidor y Servidor a Servidor

En este artículo vemos el código necesario para crear un esquema Cliente-Servidor-Servidor utilizando el protocolo TCP, realizado en Java utilizando varios Sockets.

Cómo ya sabéis el protocolo TCP está orientado a conexión, para más información podéis ver este link.
Información general de la Wikipedia:
Socket Wikipedia

Socket TCP

En el ejemplo el cliente va a llamar a un servidor que llamará al otro, como si fuese una cadena. Después el último devolverá la respuesta al anterior y el anterior al cliente inicial.

El funcionamiento sería así:
- El cliente se conecta con el servidor A.
- El servidor A transmite la petición del cliente al servidor B.
- El servidor B envía su respuesta al servidor A.
- El servidor A transfiere la respuesta del servidor A al cliente.

Código del Servidor A:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
 
import java.net.*; //Importa la libreria java.net
import java.io.*;  //Importa la libreria java.io
 
public class servidortcp {
   //se declara una clase de nombre servidortcp
 
	public static void main(String argv[]) {
            //Se declara el método principal main que espera un parámetro
 
		System.out.println("SERVIDOR");
	    ServerSocket socket;   //Se crea un objeto de ServerSocket
      //boolean fin = false; //Se declara una variable booleana inicializada a false
 
 
      try {
    	  //Abrimos una exceptción para el tratamiento de errores
          //Creamos un servidor 
    	  socket = new ServerSocket(6004); //Abre un socket en modo escucha en el puerto 6001
          Socket socket_cli = socket.accept(); //Inicio.Se acepta la conexión.
 
         //Método de la clase socket para recibir datos
         DataInputStream in =
            new DataInputStream(socket_cli.getInputStream());
 
         //Método para mandar un valor al cliente
         DataOutputStream out =
             new DataOutputStream(socket_cli.getOutputStream());
 
 
         String mensaje =""; //Se inicializa la variable de string mensaje a vacío
         mensaje = in.readUTF(); //La variable Mensaje guarda el valor que ha mandado el cliente
 
         if (mensaje.startsWith("HELLO")) {
        	 out.writeUTF("HELLO");
         }
 
         do {
 
        	 //Estará escuchando el mensaje sin interrupción debido a la condición (1>0) del while
            mensaje =""; //Se inicializa la variable de string mensaje a vacío
            mensaje = in.readUTF(); //La variable Mensaje guarda el valor que ha mandado el cliente
 
            if (mensaje.startsWith("ALL")) {
 
            	mensaje = "ALL BUR:250;CHE:300; BIG:540; PAT:380; SAL:240; BEV:210; DIE:0; COF:0; DES:300";
            	System.out.println(mensaje);
 
            }
            else if(mensaje.startsWith("BUR"))
            {
            	mensaje = "BUR 250";
            	System.out.println(mensaje);
            }
            else if (mensaje.startsWith("CHE")) {
            	mensaje = "CHE 300";
            	System.out.println(mensaje);
            }
            else if (mensaje.startsWith("BIG")) {
            	mensaje= "BIG 540";
            	System.out.println(mensaje);
            }
            else if (mensaje.startsWith("PAT")) {
            	mensaje= "PAT 380";
            	System.out.println(mensaje);
            }
            else if (mensaje.startsWith("SAL")) {
            	mensaje= "SAL 240";
            	System.out.println(mensaje);
            }
            else if (mensaje.startsWith("BEV")) {
            	mensaje= "SAL 210";
            	System.out.println(mensaje);
            }
            else if (mensaje.startsWith("DIE")) {
            	mensaje= "DIE 0";
            	System.out.println(mensaje);
            }
            else if (mensaje.startsWith("COF")) {
            	mensaje= "COF 0";
            	System.out.println(mensaje);
            }
            else if (mensaje.startsWith("DES")) {
            	mensaje= "DES 300";
            	System.out.println(mensaje);
            }
            else if (mensaje.startsWith("fin")) {
            	mensaje= "fin";
        	    System.out.println(mensaje);
            }
            else{
                mensaje = "ERROR";	
            	System.out.println(mensaje);
            }
 
            //Mandamos al cliente la respuesta de las calorias según lo que ha mandado 
            out.writeUTF(mensaje);
            //System.out.println(mensaje); 
 
         } while (1>0);
      }
      catch (Exception e) {
    	  //Si se produce algún error saltará la excepción con el mensaje de error
         System.err.println(e.getMessage());
         System.exit(1); //Salimos con error
      }
   }
}

Código del Servidor B:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
 
import java.net.*; //Importa la libreria java.net
import java.io.*;  //Importa la libreria java.io
 
public class servidor3tcp {
 
 
	public static void main(String argv[]) {
        //Se declara el método principal main que espera un parámetro
 
 
	//Cuando se indica el servidor2 se hace refencia a servidortcp.java	
 
    //Declaración de variables necesarias
    Socket socket;   //Se crea un objeto de ServerSocket
    InetAddress address; //Se crea un objeto de tipo InetAddress
    ServerSocket socket3;   //Se crea un objeto de ServerSocket
    String mensaje ="HELLO"; //Se usará para comunicarse con el cliente
    String mensajeServidor=""; //Se usará para almacenar el resultado obtenido del servidor2 
    String mensajeServidor2=""; //Se usará para almacenar el resultado obtenido del servidor2 para el pedido2
    String mensaje3=""; //Almacenará el resultado final enviado al cliente
    String CaloriaPedido2="";  //Contendrá las calorias del pedido 2
    String CaloriaPedido1=""; //Contendrá las calorias del pedido 1
 
    //Otras variables para calcular la suma de calorias
    int longMensaje;  //En esta variable se almacenará el tamaño del mensaje
    String Pedido1="";  //Guardará el string del pedido 1
    String Pedido2="";  //Guardará el string del pedido 2
 
    //Guardará el valor de las calorias y el total. Pos y Pos1 indicarán la posición 
    //donde habrá que empezar para contar las cadena recibida
    int iCaloriaPeiddo2, iCaloriaPeiddo1, iTotalCalorias, pos, pos1=0;
 
  try {
 
	  //Dirección del servidor
	  address=InetAddress.getByName(argv[0]);
 
      //Creamos un servidor para el cliente
	  socket = new Socket(address,6004);
 
	  DataInputStream in = new DataInputStream(socket.getInputStream());
      DataOutputStream out = new DataOutputStream(socket.getOutputStream());
 
      //Mandamos el saludo al servidor2
	  out.writeUTF("HELLO");
 
      //Recojemos el resultado del servidor2
	  mensajeServidor = in.readUTF();
	  System.out.println(mensajeServidor);
 
      //Creamos el socket "servidor" para comunicarnos con el cliente
      socket3 = new ServerSocket(6001);
 
     //Aceptamos la conexión al servidor2 y nos preparamos para recibir datos suyos
 	 Socket socketClient = socket3.accept();
     DataInputStream in2 = new DataInputStream(socketClient.getInputStream());
	 DataOutputStream out2 = new DataOutputStream(socketClient.getOutputStream());
 
 
	 //Leemos del cliente esperando el saludo inicial
	 mensaje = in2.readUTF();
 
	 if (mensaje.startsWith("HELLO")) 
    	 out2.writeUTF("HELLO");
 
 
     do {
 
    	//Estará escuchando el mensaje sin interrupción debido a la condición (1>0) del while
 
		 mensaje = in2.readUTF();
		 System.out.println(mensaje);
 
		 //Limpiamos las variables utilizadas.
		 iCaloriaPeiddo2=0;
		 iCaloriaPeiddo1=0;
		 longMensaje=0;
 
		  //Para separar las dos descipciones calcularemos el tamaño de la cadena
		  //y buscaremos un espacio que las separa, después cogeremos la segunda cadena
		  //emepzando por la posición +1, para poder saltar el espacio en blanco
 
		  longMensaje = mensaje.length();
		  pos= mensaje.indexOf(' ');
 
		  if (pos > 0) {
 
			//Si es mayor que cero se han recibido dos palabras  
			//Separamos el contenido enviado para calcular la suma de calorias  
 
			//Obtenemos la descripción de los dos pedidos  
 
			//Segundo pedido  
			Pedido2 = mensaje.substring(pos+1, longMensaje); 
 
		    //Primer pedido
		    Pedido1 = mensaje.substring(0,pos);
 
		    //Calculamos las calorias del pedido2 
		    out.writeUTF(Pedido2);
 
		    //Recogemos el resultado del servidor2
		    mensajeServidor2 = in.readUTF();
 
			//Se calcula el tamaño del resultado del Pedido2
			longMensaje = mensajeServidor2.length();
			pos1= mensajeServidor2.indexOf(' ');
 
		    if ((pos1 < 0) || mensajeServidor2.startsWith("ERROR") || mensajeServidor2.startsWith("ALL")){
		    	//Si se ha recibido del servidor2 la palabra error, o la palabra ALL, las calorias serán 99999
		    	CaloriaPedido2 = "ERROR";
		    	mensajeServidor2 = Pedido2 + " " + "ERROR";
		    	iCaloriaPeiddo2 = 9999;
		    }
		    else{
		       //Separamos las calorias del pedido2
			   CaloriaPedido2 = mensajeServidor2.substring(pos1+1, longMensaje);
			   //Valor numérico de las calorias del pedido2
			   iCaloriaPeiddo2 = Integer.parseInt(CaloriaPedido2.trim());
		    }
 
			//Calculamos las calorias del pedido1 
		    //Le mandamos al servidor2 el literal del Pedido1
		    out.writeUTF(Pedido1);
 
			//Obtenemos el resultado del servidor2
		    mensajeServidor = in.readUTF();
 
			//Se calcula el tamaño del resultado del Pedido1
			longMensaje = mensajeServidor.length();
			pos1= mensajeServidor.indexOf(' ');
 
			if ((pos1 < 0) || mensajeServidor.startsWith("ERROR") || mensajeServidor.startsWith("ALL")){
		    	//Si se ha recibido del servidor2 la palabra error, o la palabra ALL las calorias serán 99999
				CaloriaPedido1 = "ERROR";
				mensajeServidor = Pedido1 + " " + "ERROR";
		    	iCaloriaPeiddo1 = 9999;
		    }
		    else{
			  //Separamos las calorias del pedido1
			  CaloriaPedido1 = mensajeServidor.substring(pos1+1, longMensaje);
			  //Valor numérico de las calorias del pedido1
			  iCaloriaPeiddo1 = Integer.parseInt(CaloriaPedido1.trim());
		    }
 
			//Calculamos el total de las calorias
			if(iCaloriaPeiddo2 == 9999 || iCaloriaPeiddo1 == 9999){
				//Si uno de los dos pedidos es erroneo el total de calorias será 9999
				iTotalCalorias = 9999;
			}
			else
			  iTotalCalorias = iCaloriaPeiddo1 + iCaloriaPeiddo2;
 
			System.out.println(mensajeServidor);
			System.out.println(mensajeServidor2);
			//Se crea el mensaje final con los dos pedidos y la suma de sus calorias.
			 mensaje3 = Pedido1 + " " + Pedido2 + " " + iCaloriaPeiddo1 + " " + iCaloriaPeiddo2 + " = " + iTotalCalorias;
 
			//Imprimimos en el servidor3 el total
			 System.out.println(mensaje3);
 
			//Le mandamos al cliente el total de calorias de los dos productos.
			 out2.writeUTF(mensaje3);
		  }
		  else{
			 //Si es menor que 0 solo se habrá recibido una palabra 
			 //Le mandamos al servidor2 la descripción
		     out.writeUTF(mensaje);
 
			 //Recojemos del servidor2 el resultado
			 mensajeServidor = in.readUTF();
			 System.out.println(mensajeServidor);
 
			 //Le mandamos al cliente el resultado que nos ha dado el servidor2
			 out2.writeUTF(mensajeServidor);	
		  }
 
     } while (1>0);
  }
  catch (Exception e) {
	  //Si se produce algún error saltará la excepción con el mensaje de error
     System.err.println(e.getMessage());
     System.exit(1); //Salimos con error
  }
}
}

Código del Cliente:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
 
 
import java.net.*; //Se importa la libreria java.net
import java.io.*; //Se importa la libreria java.io
 
//Se declara la clase clientetcp
public class clientetcp {
 
	//Se declara el método principal main que recibe un parámetro
   public static void main(String argv[]) {
 
	   //Si no recibe ningún parámetro dará error
	   if (argv.length == 0) {
         System.err.println("java clientetcp servidor");
         System.exit(1);
      }
 
	   System.out.println("CLIENTE");
 
	  // Se guarda en el buffer un valor introducido por pantalla  
      BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
 
      Socket socket=null; //Se crea un objeto de tipo socket
      InetAddress address; //Se crea un objeto de tipo InetAddress
      String mensaje=""; //Se declara una variable de tipo string
 
      try {
             //Se abre una excepción
    	  //Obtiene el nombre de la dirección remota del socket
         address=InetAddress.getByName(argv[0]);
 
       	 socket = new Socket(address,6001); //Se crea un objeto de tipo socket 
                                            //para establecer una conexión por el puerto 6001
 
 
         //Se declara un objeto de tipo DataOutputStream para mandar valores al servidor 
         DataOutputStream out =
            new DataOutputStream(socket.getOutputStream());
 
         //Se declara un objeto de tipo DataOutputStream para mandar obtener al servidor
         DataInputStream in2 =
             new DataInputStream(socket.getInputStream());
 
         //Mandamos la palabra HELLO al servidor
         out.writeUTF("HELLO");
         //Recogemos lo que nos devuelve el servidor y lo guardamos en la variable mensaje
         mensaje = in2.readUTF();
         System.out.println(mensaje); //Imprime el contenido de mensaje
 
         do {
        	 //Mientras el mensaje no sea fin seguira leyendo
            mensaje = in.readLine();
            out.writeUTF(mensaje);
            //System.out.println(mensaje); //Imprime el contenido de mensaje
 
          //NUEVO
            mensaje =""; //Se inicializa la variable de string mensaje a vacío
            mensaje = in2.readUTF();
            System.out.println(mensaje); //Imprime el contenido de mensaje
          //NUEVO
 
         } while (!mensaje.startsWith("fin"));
 
      }
      catch (Exception e) {
         System.err.println(e.getMessage());
         System.exit(1);
      }
   }
}
Leer más

Socket UDP | Ejemplo de Cliente a Servidor y Servidor a Servidor

En este artículo vemos el código necesario para crear un esquema Cliente-Servidor-Servidor utilizando el protocolo UDP, realizado en Java utilizando varios Sockets.

Cómo ya sabéis UDP no está orientado a conexión, para más información podéis ver este link.
Información general de la Wikipedia:
Socket Wikipedia

Socket UDP

En el ejemplo el cliente va a llamar a un servidor que llamará al otro, como si fuese una cadena. Después el último devolverá la respuesta al anterior y el anterior al cliente inicial.

El funcionamiento sería así:
- El cliente se conecta con el servidor A.
- El servidor A transmite la petición del cliente al servidor B.
- El servidor B envía su respuesta al servidor A.
- El servidor A transfiere la respuesta del servidor A al cliente.

Código del Servidor A:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
 
 
import java.net.*;
import java.io.*;
public class servidorudp {
   public static void main(String argv[]) {
 
      DatagramSocket socket;
      boolean fin = false;
      //Creamos un objeto de tipo DatagrmaPacket para recibir un paquete del cliente
      DatagramPacket paquete;
      //Creamos paquete de vuelta para el cliente
      DatagramPacket paquete2;
      //Declaramos una variable de tipo string donde guardaremos el mensaje recibido
      //por el lciente
      String mensaje ="";
      //Declaramos una variable string para la cadena que le mandaremos al cliente
      String MensajeSalida ="";
 
      try {
 
    	 //Abrimos un socket en el puerto 6000
    	  //A través de este socket enviaremos paquetes de tipo Datagrama
         socket = new DatagramSocket(6000);
 
         //Nos preparamos para recibir una mensaje de 256 bytes
    	 byte[] mensaje_bytes = new byte[256];
    	 mensaje_bytes = new byte[256];
         //Creamos un contenedor de datagrama, el buffer será el array mensaje_bytes
    	 paquete = new DatagramPacket(mensaje_bytes,256);
 
 
         do {
 
            mensaje_bytes = new byte[256];
 
            //Creamos un contenedor de datagrama, el buffer será el array mensaje_bytes
            paquete = new DatagramPacket(mensaje_bytes,256);
 
            //Esperamos a recibir un paquete
            socket.receive(paquete);
 
           //Convertimos el mensaje recibido en un string
        	mensaje = new String(mensaje_bytes).trim();
 
           //Imprimimos el paquete recibido
           System.out.println(mensaje);  
 
 
           //Condiciones encadenadas para mandar la información
           //dependiendo del dato recibido
           if (mensaje.startsWith("HELLO")) {
 
          	   MensajeSalida = "HELLO";
           }
           else if (mensaje.startsWith("ALL")) {
 
        	   MensajeSalida = "ALL BUR:250;CHE:300; BIG:540; PAT:380; SAL:240; BEV:210; DIE:0; COF:0; DES:300";
           	System.out.println(MensajeSalida);
 
           }
           else if(mensaje.startsWith("BUR"))
           {
        	   MensajeSalida = "BUR 250";
           	System.out.println(MensajeSalida);
           }
           else if (mensaje.startsWith("CHE")) {
        	   MensajeSalida = "CHE 300";
           	System.out.println(MensajeSalida);
           }
           else if (mensaje.startsWith("BIG")) {
        	   MensajeSalida= "BIG 540";
           	System.out.println(MensajeSalida);
           }
           else if (mensaje.startsWith("PAT")) {
        	   MensajeSalida= "PAT 380";
           	System.out.println(MensajeSalida);
           }
           else if (mensaje.startsWith("SAL")) {
        	   MensajeSalida= "SAL 240";
           	System.out.println(MensajeSalida);
           }
           else if (mensaje.startsWith("BEV")) {
        	   MensajeSalida= "SAL 210";
           	System.out.println(MensajeSalida);
           }
           else if (mensaje.startsWith("DIE")) {
        	   MensajeSalida= "DIE 0";
           	System.out.println(MensajeSalida);
           }
           else if (mensaje.startsWith("COF")) {
        	   MensajeSalida= "COF 0";
           	System.out.println(MensajeSalida);
           }
           else if (mensaje.startsWith("DES")) {
        	   MensajeSalida= "DES 300";
           	System.out.println(MensajeSalida);
           }
           else if (mensaje.startsWith("fin")) {
        	   MensajeSalida= "fin";
       	    System.out.println(MensajeSalida);
       	    fin=true;
           }
           else{
        	   MensajeSalida = "ERROR";	
           	   System.out.println(MensajeSalida);
           }
 
 
           //Nº de puerto desde donde se envió  
           int puerto = paquete.getPort();  
           //Dirección de Internet desde donde se envió
           InetAddress address = paquete.getAddress();
           //Preparamos el formato que le vamos a mandar
           byte[] mensaje2_bytes = new byte[256];
           //Guardamos en mensaje2_bytes el mensaje de salida formateado
           mensaje2_bytes = MensajeSalida.getBytes();
           //Generamos el paquete de vuelta, usando los datos  
           // del remitente del paquete original
           paquete2 = new DatagramPacket(mensaje2_bytes,MensajeSalida.length(),address,puerto);
           // Enviamos  
           socket.send(paquete2);
 
         } while (!fin);
      }
      catch (Exception e) {
         System.err.println(e.getMessage());
         System.exit(1);
      }
   }
}

Código del Servidor B:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
//Practica3 Yolanda_Jimenez_Anaya
 
import java.net.*;
import java.io.*;
public class servidor3udp {
 
	public static void main(String argv[]) {
 
 
		if (argv.length != 1) {
	         System.err.println("java servidor3udp ");
	         System.exit(1);}
 
        //CUANDO SE HACE REFERENCIA AL SERVIDOR2, ES A LA CLASE servidorudp.java
		//Declaración de variables
		DatagramSocket socket;
	    DatagramSocket socketCli;
	    DatagramPacket paquet;
	    DatagramPacket paquetServidor;
	    DatagramPacket paquetServidor2;
	    InetAddress address;
	    byte[] mensaje_bytes = new byte[256];
	    byte[] mensajeServidor_bytes = new byte[256];
	    byte[] mensajeServidor2_bytes = new byte[256];
	    byte[] Pedido1_bytes = new byte[256];
	    byte[] Pedido2_bytes = new byte[256];
	    byte[] mensaje3_bytes = new byte[256];
	    String mensaje="HELLO";
	    String mensajeServidor,mensajeServidor2, mensaje3  = "";
	    int iCaloriaPeiddo2,  iCaloriaPeiddo1, longMensaje, pos, port,iTotalCalorias=0;
	    String Pedido2, Pedido1, CaloriaPedido2, CaloriaPedido1 ="";
 
 
	    try {
 
	    	//Creamos un socket para comunicarnos con el servidor 
	 	    socket = new DatagramSocket();
	 	    //Obtenemos la dirección de destino
	        address=InetAddress.getByName(argv[0]);
	        mensaje = "HELLO";
		    mensaje_bytes = mensaje.getBytes();
		    //Creamos el paquete que vamos a enviar
	        paquet = new DatagramPacket(mensaje_bytes,mensaje.length(),address,6000);
	        socket.send(paquet);
 
 
	        //Recibimos el paquete que nos devuelve el servidor2
		    mensajeServidor_bytes = new byte[256];
		    paquetServidor = new DatagramPacket(mensajeServidor_bytes,256);
	        socket.receive(paquetServidor);
 
		    mensajeServidor = new String(mensajeServidor_bytes).trim();
	        System.out.println(mensajeServidor);
	        //Bucle para que el servidor siempre este esperando una entrada
	        socketCli =  new  DatagramSocket(6001);
 
	        do{
 
	        	 mensaje_bytes = new byte[256];
				 paquet = new DatagramPacket(mensaje_bytes,256);
 
				 //Recibimos un paquete del cliente
				 socketCli.receive(paquet);
				 mensaje = new String(mensaje_bytes).trim();
 
				 //Obtenemos la dirección y el puerto del cliente
	       		 address = paquet.getAddress();
			     port = paquet.getPort();
 
 
 
			     if (mensaje.startsWith("HELLO")) {
			    	 //Si se ha recibido la palabra HELLO del cliente, le contestaremos
 
			    	 paquetServidor = new DatagramPacket(mensaje_bytes,mensaje.length(),address,port);
			         socketCli.send(paquetServidor); 
			     }
			     else{
			    	 System.out.println(mensaje);
 
					 //Limpiamos las variables utilizadas.
					 iCaloriaPeiddo2=0;
					 iCaloriaPeiddo1=0;
					 longMensaje=0;
 
					  //Para separar las dos descipciones calcularemos el tamaño de la cadena
					  //y buscaremos un espacio que las separa, después cogeremos la segunda cadena
					  //emepzando por la posición +1, para poder saltar el espacio en blanco
 
					  longMensaje = mensaje.length();
					  pos= mensaje.indexOf(' ');
 
					  if (pos > 0) {
 
						//Si es mayor que cero se han recibido dos palabras  
						//Separamos el contenido enviado para calcular la suma de calorias  
 
						//Obtenemos la descripción de los dos pedidos  
 
						//Segundo pedido  
						Pedido2 = mensaje.substring(pos+1, longMensaje); 
 
					    //Primer pedido
					    Pedido1 = mensaje.substring(0,pos);
 
 
					    //Calculamos las calorias del pedido2
					    Pedido2_bytes = Pedido2.getBytes();
					    paquet = new DatagramPacket(Pedido2_bytes,Pedido2.length(),address,6000);
					    socket.send(paquet);
 
					    mensajeServidor2_bytes = new byte[256];
						paquetServidor2 = new DatagramPacket(mensajeServidor2_bytes,256);
					    socket.receive(paquetServidor2);
						mensajeServidor2 = new String(mensajeServidor2_bytes).trim();
 
 
						//Se calcula el tamaño del resultado del Pedido2
						longMensaje = mensajeServidor2.length();
						pos= mensajeServidor2.indexOf(' ');
 
					    if ((pos < 0) || mensajeServidor2.startsWith("ERROR") || mensajeServidor2.startsWith("ALL")){
					    	//Si se ha recibido del servidor2 la palabra error, o la palabra ALL, las calorias serán 99999
					    	CaloriaPedido2 = "ERROR";
					    	mensajeServidor2 = Pedido2 + " " + "ERROR";
					    	iCaloriaPeiddo2 = 9999;
					    }
					    else{
					       //Separamos las calorias del pedido2
						   CaloriaPedido2 = mensajeServidor2.substring(pos+1, longMensaje);
						   //Valor numérico de las calorias del pedido2
						   iCaloriaPeiddo2 = Integer.parseInt(CaloriaPedido2.trim());
					    }
 
						//Calculamos las calorias del pedido1
					    Pedido1_bytes = Pedido1.getBytes();
					    //Le mandamos al servidor2 el literal del Pedido1
					    paquet = new DatagramPacket(Pedido1_bytes,Pedido1.length(),address,6000);
					    socket.send(paquet);
 
					    mensajeServidor_bytes = new byte[256];
						paquetServidor = new DatagramPacket(mensajeServidor_bytes,256);
					    socket.receive(paquetServidor);
						mensajeServidor = new String(mensajeServidor_bytes).trim();
 
 
						//Se calcula el tamaño del resultado del Pedido2
						longMensaje = mensajeServidor.length();
						pos= mensajeServidor.indexOf(' ');
 
					    if ((pos < 0) || mensajeServidor.startsWith("ERROR") || mensajeServidor.startsWith("ALL")){
					    	//Si se ha recibido del servidor2 la palabra error, o la palabra ALL, las calorias serán 99999
					    	CaloriaPedido1 = "ERROR";
					    	mensajeServidor = Pedido1 + " " + "ERROR";
					    	iCaloriaPeiddo1 = 9999;
					    }
					    else{
					       //Separamos las calorias del pedido1
						   CaloriaPedido1 = mensajeServidor.substring(pos+1, longMensaje);
						   //Valor numérico de las calorias del pedido2
						   iCaloriaPeiddo1 = Integer.parseInt(CaloriaPedido1.trim());
					    }
 
 
						//Calculamos el total de las calorias
						if(iCaloriaPeiddo2 == 9999 || iCaloriaPeiddo1 == 9999){
							//Si uno de los dos pedidos es erroneo el total de calorias será 9999
							iTotalCalorias = 9999;
						}
						else
						  iTotalCalorias = iCaloriaPeiddo1 + iCaloriaPeiddo2;
 
						System.out.println(mensajeServidor);
						System.out.println(mensajeServidor2);
						//Se crea el mensaje final con los dos pedidos y la suma de sus calorias.
						 mensaje3 = Pedido1 + " " + Pedido2 + " " + iCaloriaPeiddo1 + " " + iCaloriaPeiddo2 + " = " + iTotalCalorias;
 
						//Imprimimos en el servidor3 el total
						 System.out.println(mensaje3);
						 mensaje3_bytes = mensaje3.getBytes();
						//Le mandamos al cliente el total de calorias de los dos productos.
						 paquetServidor = new DatagramPacket(mensaje3_bytes,mensaje3.length(),address,port);
				         socketCli.send(paquetServidor);
 
 
					  }
					  else{
						 //Si es menor que 0 solo se habrá recibido una palabra 
						 //Le mandamos al servidor2 la descripción
 
					     //Enviamos al servidor la palabra recibida
						 paquet = new DatagramPacket(mensaje_bytes,mensaje.length(),address,6000);
					     socket.send(paquet);
 
					     mensajeServidor_bytes = new byte[256];
						 paquetServidor = new DatagramPacket(mensajeServidor_bytes,256);
					     socket.receive(paquetServidor);
 
 
						 mensajeServidor = new String(mensajeServidor_bytes).trim();
					     System.out.println(mensajeServidor);
 
 
					     //El resultado se lo mandamos al cliente
					     paquetServidor = new DatagramPacket(mensajeServidor_bytes,mensajeServidor.length(),address,port);
				         socketCli.send(paquetServidor);
 
					  }
			     }
 
	        }while (1>0);
 
	    }
	   catch (Exception e) {
	   System.err.println(e.getMessage());
	   System.exit(1);}
}
}

Código del Cliente:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
 
import java.net.*;
import java.io.*;
 
public class clienteudp {
   public static void main(String argv[]) {
 
	   if (argv.length == 0) {
         System.err.println("java clienteudp servidor");
         System.exit(1);
      }
 
      BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
 
      DatagramSocket socket;
      InetAddress address;
      byte[] mensaje_bytes = new byte[256];
      byte[] MensajeServidor_bytes = new byte[256];
      String mensaje="";
      String mensajeServidor="";
      //Paquete para enviar al servidor
      DatagramPacket paquete;
      //Creamos el objeto paquete2 de tipo DaragramPacket para recibir del servidor
      DatagramPacket paquete2;
      mensaje_bytes=mensaje.getBytes();
 
      try {
 
    	  //Creamos el socket
    	  socket = new DatagramSocket();
 
         // Leemos el primer parámetro, donde debe ir la dirección  
         // IP del servidor 
         address=InetAddress.getByName(argv[0]);
 
         mensaje = "HELLO";
         mensaje_bytes = mensaje.getBytes();
         //Creamos paquete
         paquete = new DatagramPacket(mensaje_bytes,mensaje.length(),address,6001);
         //Mandamos el paquete
 
         socket.send(paquete);
 
         //El mensaje recibido vendrá en bytes
         MensajeServidor_bytes = new byte[256];
         //Esperamos a recibir un paquete
         paquete2 = new DatagramPacket(MensajeServidor_bytes,256);
         socket.receive(paquete2);
         //Convertimos el mensaje recibido en un string
 		 mensajeServidor = new String(MensajeServidor_bytes).trim();
 		 //Imprimimos el paquete recibido
 		 System.out.println(mensajeServidor);  
 
         do {
 
        	//Lee los caracteres introducidos por pantalla 
            mensaje = in.readLine();
            mensaje_bytes = mensaje.getBytes();
 
            //Creamos paquete
            paquete = new DatagramPacket(mensaje_bytes,mensaje.length(),address,6001);
 
            //Mandamos el paquete
            socket.send(paquete);
 
 
            //El mensaje recibido vendrá en bytes
            MensajeServidor_bytes = new byte[256];
 
            //Esperamos a recibir un paquete
            paquete2 = new DatagramPacket(MensajeServidor_bytes,256);
            socket.receive(paquete2);
 
            //Convertimos el mensaje recibido en un string
    		mensajeServidor = new String(MensajeServidor_bytes).trim();
 
    		//Imprimimos el paquete recibido
    		System.out.println(mensajeServidor);  
 
 
         } while (!mensaje.startsWith("fin"));
      }
      catch (Exception e) {
         System.err.println(e.getMessage());
         System.exit(1);
      }
   }
}
Leer más

Cómo crear un Socket UDP en Java

En este artículo vemos el código necesario para crear un Socket UDP realizado en Java.

Cómo ya sabéis UDP no está orientado a conexión, para más información podéis ver este link.

Socket UDP

En este ejemplo vemos que cada paquete de datos podrá tansportar un máximo de 256 bytes por paquete, que es el tamaño máximo que se intercambia el servidor y el cliente.

Además, cuando queremos enviar datos, especificamos el buffer de los datos que queremos enviar, en nuestro caso 256, la longitud máxima de datos, la dirección y el puerto de destino del datagrama. La dirección destino se especifica con el objeto InetAddress, mientras que el puerto es un número entero (6000). El código esta bastante comentado y tiene bastantes explicaciones que pueden ayudaros.

Comentando un poco el código, podemos ver que el cliente para enviar datos usará el método send() de la clase DatagremSocket.

Por otro lado el servidor para recibir datos lo que hace es crar un DatagramSocket para recibir paquetes especificando el número de puerto en el constructor. De estad forma, el servidor estará esperando por el puerto especificado cualquier paquete entrante.

Código del Servidor:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
 
import java.net.*;
import java.io.*;
public class servidorudp {
   public static void main(String argv[]) {
 
      DatagramSocket socket;
      boolean fin = false;
      //Creamos un objeto de tipo DatagrmaPacket para recibir un paquete del cliente
      DatagramPacket paquete;
      //Creamos paquete de vuelta para el cliente
      DatagramPacket paquete2;
      //Declaramos una variable de tipo string donde guardaremos el mensaje recibido
      //por el lciente
      String mensaje ="";
      //Declaramos una variable string para la cadena que le mandaremos al cliente
      String MensajeSalida ="";
 
      try {
 
    	 //Abrimos un socket en el puerto 6000
    	  //A través de este socket enviaremos paquetes de tipo Datagrama
         socket = new DatagramSocket(6000);
 
         //Nos preparamos para recibir una mensaje de 256 bytes
    	 byte[] mensaje_bytes = new byte[256];
    	 mensaje_bytes = new byte[256];
         //Creamos un contenedor de datagrama, el buffer será el array mensaje_bytes
    	 paquete = new DatagramPacket(mensaje_bytes,256);
 
         do {
 
            mensaje_bytes = new byte[256];
 
            //Creamos un contenedor de datagrama, el buffer será el array mensaje_bytes
            paquete = new DatagramPacket(mensaje_bytes,256);
 
            //Esperamos a recibir un paquete
            socket.receive(paquete);
 
           //Convertimos el mensaje recibido en un string
        	mensaje = new String(mensaje_bytes).trim();
 
           //Imprimimos el paquete recibido
           System.out.println(mensaje);  
 
 
           //Condiciones encadenadas para mandar la información
           //dependiendo del dato recibido
           if (mensaje.startsWith("HELLO")) {
 
          	   MensajeSalida = "HELLO";
           }
           else if (mensaje.startsWith("ALL")) {
 
        	   MensajeSalida = "ALL BUR:250;CHE:300; BIG:540; PAT:380; SAL:240; BEV:210; DIE:0; COF:0; DES:300";
           	System.out.println(MensajeSalida);
 
           }
           else if(mensaje.startsWith("BUR"))
           {
        	   MensajeSalida = "BUR 250";
           	System.out.println(MensajeSalida);
           }
           else if (mensaje.startsWith("CHE")) {
        	   MensajeSalida = "CHE 300";
           	System.out.println(MensajeSalida);
           }
           else if (mensaje.startsWith("BIG")) {
        	   MensajeSalida= "BIG 540";
           	System.out.println(MensajeSalida);
           }
           else if (mensaje.startsWith("PAT")) {
        	   MensajeSalida= "PAT 380";
           	System.out.println(MensajeSalida);
           }
           else if (mensaje.startsWith("SAL")) {
        	   MensajeSalida= "SAL 240";
           	System.out.println(MensajeSalida);
           }
           else if (mensaje.startsWith("BEV")) {
        	   MensajeSalida= "SAL 210";
           	System.out.println(MensajeSalida);
           }
           else if (mensaje.startsWith("DIE")) {
        	   MensajeSalida= "DIE 0";
           	System.out.println(MensajeSalida);
           }
           else if (mensaje.startsWith("COF")) {
        	   MensajeSalida= "COF 0";
           	System.out.println(MensajeSalida);
           }
           else if (mensaje.startsWith("DES")) {
        	   MensajeSalida= "DES 300";
           	System.out.println(MensajeSalida);
           }
           else if (mensaje.startsWith("fin")) {
        	   MensajeSalida= "fin";
       	    System.out.println(MensajeSalida);
       	    fin=true;
           }
           else{
        	   MensajeSalida = "ERROR";	
           	   System.out.println(MensajeSalida);
           }           
 
           //Nº de puerto desde donde se envió  
           int puerto = paquete.getPort();  
           //Dirección de Internet desde donde se envió
           InetAddress address = paquete.getAddress();
           //Preparamos el formato que le vamos a mandar
           byte[] mensaje2_bytes = new byte[256];
           //Guardamos en mensaje2_bytes el mensaje de salida formateado
           mensaje2_bytes = MensajeSalida.getBytes();
           //Generamos el paquete de vuelta, usando los datos  
           // del remitente del paquete original
           paquete2 = new DatagramPacket(mensaje2_bytes,MensajeSalida.length(),address,puerto);
           // Enviamos  
           socket.send(paquete2);
 
         } while (!fin);
      }
      catch (Exception e) {
         System.err.println(e.getMessage());
         System.exit(1);
      }
   }
}

Código del Cliente:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
 
import java.net.*;
import java.io.*;
 
public class clienteudp {
   public static void main(String argv[]) {
      if (argv.length == 0) {
         System.err.println("java clienteudp servidor");
         System.exit(1);
      }
 
      BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
 
      DatagramSocket socket;
      InetAddress address;
      byte[] mensaje_bytes = new byte[256];
      byte[] MensajeServidor_bytes = new byte[256];
      String mensaje="";
      String mensajeServidor="";
      //Paquete para enviar al servidor
      DatagramPacket paquete;
      //Creamos el objeto paquete2 de tipo DaragramPacket para recibir del servidor
      DatagramPacket paquete2;
      mensaje_bytes=mensaje.getBytes();
 
      try {
 
    	  //Creamos el socket
    	  socket = new DatagramSocket();
 
         // Leemos el primer parámetro, donde debe ir la dirección  
         // IP del servidor 
         address=InetAddress.getByName(argv[0]);
 
         mensaje = "HELLO";
         mensaje_bytes = mensaje.getBytes();
         //Creamos paquete
         paquete = new DatagramPacket(mensaje_bytes,mensaje.length(),address,6000);
         //Mandamos el paquete
         socket.send(paquete);
 
         //El mensaje recibido vendrá en bytes
         MensajeServidor_bytes = new byte[256];
         //Esperamos a recibir un paquete
         paquete2 = new DatagramPacket(MensajeServidor_bytes,256);
         socket.receive(paquete2);
         //Convertimos el mensaje recibido en un string
 		 mensajeServidor = new String(MensajeServidor_bytes).trim();
 		 //Imprimimos el paquete recibido
 		 System.out.println(mensajeServidor);  
 
         do {
 
        	//Lee los caracteres introducidos por pantalla 
            mensaje = in.readLine();
            mensaje_bytes = mensaje.getBytes();
 
            //Creamos paquete
            paquete = new DatagramPacket(mensaje_bytes,mensaje.length(),address,6000);
 
            //Mandamos el paquete
            socket.send(paquete);
 
            //El mensaje recibido vendrá en bytes
            MensajeServidor_bytes = new byte[256];
 
            //Esperamos a recibir un paquete
            paquete2 = new DatagramPacket(MensajeServidor_bytes,256);
            socket.receive(paquete2);
 
            //Convertimos el mensaje recibido en un string
    		mensajeServidor = new String(MensajeServidor_bytes).trim();
 
    		//Imprimimos el paquete recibido
    		System.out.println(mensajeServidor);  
 
         } while (!mensaje.startsWith("fin"));
      }
      catch (Exception e) {
         System.err.println(e.getMessage());
         System.exit(1);
      }
   }
}
Leer más

Cómo crear un Socket TCP en Java

En este artículo mostramos el código necesario para crear un Socket TCP (Orientado a Conexión) realizado en Java.

Cómo ya sabéis el protocolo TCP está orientado a conexión, para más información podéis ver este link.

Socket TCP

Basicamente, este es el funcionamiento de los Socket que necesitamos para una conexión TCP. En el que podemos distinguir dos tipos de Socket el del Servidor y el del Cliente.

La creación del socket en el servidor se remite a crear el socket, indicar por que puerto se harán las escuchas y esperar a la llamada de un cliente para aceptar la conexión, en cambio un cliente creará el socket e indicará donde se encuentra y por que puerto quiere conectarse, de está forma Cliente y Servidor crearán una conexión.

Servidor:

Para crear los socket se crea un objeto del tipo ServerSocket, este método pertenece a la clase java.net.Serversocket

Una vez que hemos creado el objeto socket mandamos un parámetro que indicará el puerto por el que se realzará las comunicaciones.

Para realizar una conexión entre Cliente-Servidor, el servidor usará el método socket.accept para confirmar que se ha iniciado la conexión.

Cliente:

Primero crea un objeto del tipo Socket que pertenece a la clase java.net.Serversocket,

Después se obtiene un objeto InetAddress, y usando el método getByName le indicamos donde se va a ejecutar el cliente, en nuestro caso indicamos que será en localhost.

Finalmente creamos un objeto de tipo socket al que pasaremos la dirección donde se está ejecutando el cliente, y el puerto por donde se conectará al servidor.

Código del Servidor:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
 
import java.net.*; //Importa la libreria java.net
import java.io.*;  //Importa la libreria java.io
 
public class servidortcp {
   //se declara una clase de nombre servidortcp
 
	public static void main(String argv[]) {
            //Se declara el método principal main que espera un parámetro
 
		System.out.println("SERVIDOR");
	    ServerSocket socket;   //Se crea un objeto de ServerSocket
      //boolean fin = false; //Se declara una variable booleana inicializada a false
 
 
      try {
    	  //Abrimos una exceptción para el tratamiento de errores
          //Creamos un servidor 
    	  socket = new ServerSocket(6004); //Abre un socket en modo escucha en el puerto 6001
          Socket socket_cli = socket.accept(); //Inicio.Se acepta la conexión.
 
         //Método de la clase socket para recibir datos
         DataInputStream in =
            new DataInputStream(socket_cli.getInputStream());
 
         //Método para mandar un valor al cliente
         DataOutputStream out =
             new DataOutputStream(socket_cli.getOutputStream());
 
 
         String mensaje =""; //Se inicializa la variable de string mensaje a vacío
         mensaje = in.readUTF(); //La variable Mensaje guarda el valor que ha mandado el cliente
 
         if (mensaje.startsWith("HELLO")) {
        	 out.writeUTF("HELLO");
         }
 
         do {
 
        	 //Estará escuchando el mensaje sin interrupción debido a la condición (1>0) del while
            mensaje =""; //Se inicializa la variable de string mensaje a vacío
            mensaje = in.readUTF(); //La variable Mensaje guarda el valor que ha mandado el cliente
 
            if (mensaje.startsWith("ALL")) {
 
            	mensaje = "ALL BUR:250;CHE:300; BIG:540; PAT:380; SAL:240; BEV:210; DIE:0; COF:0; DES:300";
            	System.out.println(mensaje);
 
            }
            else if(mensaje.startsWith("BUR"))
            {
            	mensaje = "BUR 250";
            	System.out.println(mensaje);
            }
            else if (mensaje.startsWith("CHE")) {
            	mensaje = "CHE 300";
            	System.out.println(mensaje);
            }
            else if (mensaje.startsWith("BIG")) {
            	mensaje= "BIG 540";
            	System.out.println(mensaje);
            }
            else if (mensaje.startsWith("PAT")) {
            	mensaje= "PAT 380";
            	System.out.println(mensaje);
            }
            else if (mensaje.startsWith("SAL")) {
            	mensaje= "SAL 240";
            	System.out.println(mensaje);
            }
            else if (mensaje.startsWith("BEV")) {
            	mensaje= "SAL 210";
            	System.out.println(mensaje);
            }
            else if (mensaje.startsWith("DIE")) {
            	mensaje= "DIE 0";
            	System.out.println(mensaje);
            }
            else if (mensaje.startsWith("COF")) {
            	mensaje= "COF 0";
            	System.out.println(mensaje);
            }
            else if (mensaje.startsWith("DES")) {
            	mensaje= "DES 300";
            	System.out.println(mensaje);
            }
            else if (mensaje.startsWith("fin")) {
            	mensaje= "fin";
        	    System.out.println(mensaje);
            }
            else{
                mensaje = "ERROR";	
            	System.out.println(mensaje);
            }
 
            //Mandamos al cliente la respuesta de las calorias según lo que ha mandado
                out.writeUTF(mensaje);
            //System.out.println(mensaje); 
 
         } while (1>0);
      }
      catch (Exception e) {
    	  //Si se produce algún error saltará la excepción con el mensaje de error
         System.err.println(e.getMessage());
         System.exit(1); //Salimos con error
      }
   }
}

Código del Cliente:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
 
import java.net.*; //Se importa la libreria java.net
import java.io.*; //Se importa la libreria java.io
 
//Se declara la clase clientetcp
public class clientetcp {
 
	//Se declara el método principal main que recibe un parámetro
   public static void main(String argv[]) {
 
	   //Si no recibe ningún parámetro dará error
	   if (argv.length == 0) {
         System.err.println("java clientetcp servidor");
         System.exit(1);
      }      
	   System.out.println("CLIENTE");
 
	  // Se guarda en el buffer un valor introducido por pantalla  
      BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
 
      Socket socket=null; //Se crea un objeto de tipo socket
      InetAddress address; //Se crea un objeto de tipo InetAddress
      String mensaje=""; //Se declara una variable de tipo string
 
      try {
             //Se abre una excepción
    	  //Obtiene el nombre de la dirección remota del socket
         address=InetAddress.getByName(argv[0]);
 
         try{
        	 socket = new Socket(address,Integer.parseInt(argv[1])); //Se crea un objeto de tipo socket 
                                            //para establecer una conexión por el puerto 6001
         }catch(NumberFormatException nfe){
        	 System.err.println("El argumento argv[1] no es un numero");
        	 System.exit(1);
         }
 
         //Se declara un objeto de tipo DataOutputStream para mandar valores al servidor 
         DataOutputStream out =
            new DataOutputStream(socket.getOutputStream());
 
         //Se declara un objeto de tipo DataOutputStream para mandar obtener al servidor
         DataInputStream in2 =
             new DataInputStream(socket.getInputStream());
 
         //Mandamos la palabra HELLO al servidor
         out.writeUTF("HELLO");
         //Recogemos lo que nos devuelve el servidor y lo guardamos en la variable mensaje
         mensaje = in2.readUTF();
         System.out.println(mensaje); //Imprime el contenido de mensaje
 
         do {
        	 //Mientras el mensaje no sea fin seguira leyendo
            mensaje = in.readLine();
            out.writeUTF(mensaje);
            //System.out.println(mensaje); //Imprime el contenido de mensaje            
          //NUEVO
            mensaje =""; //Se inicializa la variable de string mensaje a vacío
            mensaje = in2.readUTF();
            System.out.println(mensaje); //Imprime el contenido de mensaje
          //NUEVO            
         } while (!mensaje.startsWith("fin"));
      }
      catch (Exception e) {
         System.err.println(e.getMessage());
         System.exit(1);
      }
   }
}
Leer más

Ejemplo de Socket en Java

Socket

Un socket es un mecanismo que permite la conexión entre distintos procesos que habitualmente utilizamos para establecer comunicaciones entre distintas máquinas que estén conectadas a través de la red.
(+ info)

Código del Socket

El código (hecho en Java) está dividido en dos clases, la clase Cliente que enviará la petición y recibirá la respuesta del servidor, y la clase Servidor que será el encargado de recibir la petición y enviar la respuesta al cliente.

Clase Cliente

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
 
import java.io.*;
import java.net.*;
 
public class Cliente_uoc {
 
public static void main(String args[]) {
	Socket cliente = null;
	DataInputStream entrada = null;
	DataOutputStream salida = null;
 
	String ipServidor ="127.0.0.1";	  
	//nos conectamos al localhost a traves de esta dirección IP
 
	//if (cliente != null && salida != null && entrada!= null) {	
try {	
 
	cliente = new Socket(ipServidor, 2017);  
	//asignamos este numero de puerto
	entrada = new DataInputStream(cliente.getInputStream());
	// será lo que enviaremos al servidor	
	salida = new DataOutputStream(cliente.getOutputStream());
	// será lo que nos devuelva el servidor	
 
}
catch (UnknownHostException excepcion) {
	System.err.println("El servidor no está levantado");
}
catch (Exception e) {
	System.err.println("Error: " + e );
}
 
try {
	String linea_recibida;
	salida.writeBytes("Frase que envio al servidor\n");
	linea_recibida = entrada.readLine();
	System.out.println("SERVIDOR DICE: " + linea_recibida);
	salida.close();
	entrada.close();
	cliente.close();
}
catch (UnknownHostException excepcion) {
	System.err.println("No encuentro el servidor en la dirección" + ipServidor);
}
catch (IOException excepcion) {
	System.err.println("Error de entrada/salida");
}
catch (Exception e) {
	System.err.println("Error: " + e );
 
}
}
}

Clase Servidor

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
 
import java.io.*;
import java.net.*;
public class Servidor_uoc {
public static void main(String args[]) {
ServerSocket mi_servicio = null;
String linea_recibida;
DataInputStream entrada;
PrintStream salida;
Socket socket_conectado = null;
try {
mi_servicio = new ServerSocket(2017);
}
catch (IOException excepcion) {
System.out.println(excepcion);
}
try {
socket_conectado = mi_servicio.accept();
entrada = new DataInputStream(socket_conectado.getInputStream());
salida = new PrintStream(socket_conectado.getOutputStream());
linea_recibida = entrada.readLine();
salida.println("Te reenvio lo que he recibido:" + linea_recibida );
salida.close();
entrada.close();
socket_conectado.close();
}
catch (IOException excepcion) {
System.out.println(excepcion);
}}
}

*** El servidor debe estar corriendo antes de hacer la llamada desde el cliente

Leer más

Mostrar una imagen desde un Java Bean en Forms

Cuando utilizamos Oracle Forms para crear aplicaciones nos encontramos con algunas limitaciones. No obstante, Oracle Forms nos permite incluir aplicaciones desarrolladas en Java (Bean) dentro del propio Forms.

Incluir una imagen en Oracle Forms

En este caso queríamos incluir una imagen en Oracle Forms, y al ejecutarla desde Forms, Forms reduce tanto la resolución de la imagen como el número de colores.

Como no quedaba muy bien después de que Forms degradadase la imagen, hemos utilizado un Bean para llamar a la imagen original y así no Forms no tratará la imagen, dejando la imagen la calidad de la imagen original intacta.

La imagen de arriba muestra la imagen incluida en el Forms, mientras que la imagen de abajo sería el resultado de incluirla en un java Bean, así no perderá propiedades y se mostrará con la calidad original.

java bean imagen

Este el código que he utilizado para incluir la imagen, solo tenéis que incluir vuestra imagen y cambiar los tamaños en el código.

Código

Clase Marco

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
package mypackage;
 
 
import java.beans.PropertyChangeEvent;
import javax.swing.JFrame;
import oracle.forms.ui.VBean;
import oracle.forms.handler.IHandler;
 
 
public class Marco extends VBean 
{   
 
  //private JFrame         framep = new JFrame();   
  private IHandler       m_handler; 
  Banner been;
 
  public Marco()  {
   	// framep.setVisible(true);          	
  }  
  public void init(IHandler handler)
  {
      m_handler = handler;
      super.init(handler);     
      been = new Banner(); 
 
     this.add(been);
     this.setVisible(true);
  }
public void propertyChange(PropertyChangeEvent evt) {
	// TODO Auto-generated method stub
 
}     
}

Clase Banner

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
package mypackage;
 
import javax.swing.ImageIcon;
import javax.swing.JPanel;
import java.awt.*;
 
 
 
public class Banner extends JPanel 
{	
 
private Image imgFondo;
 
  public Banner(){	
	  ImagenFondoPanel(); 
  } 
 
  public void ImagenFondoPanel() {
	  preInit();
  }
 
	 private void preInit(){			
		   imgFondo = new ImageIcon(getClass().getResource("imagen2.png")).getImage();
		 }
 
	 protected void paintComponent(Graphics g) {
	  g.drawImage(imgFondo,00,00,null);
	 }
 
}

Integrar un java Bean en Oracle Forms

Si necesitas saber cómo incluir un Java Bean en tu aplicación sigue los siguientes pasos:

1- Copia el bean.jar dentro del directorio /forms/java

2- Edita el archivo formsweb.cfg y añadimos el bean.jar.

# Forms applet archive setting for JInitiator
archive_jini=f90all_jinit.jar, archivo.jar
# Forms applet archive setting for Microsoft Internet Explorer native
JVM archive_ie=f90all.cab, archivo.jar

3- Añadimos el Bean dentro de la pantalla (.fmb) y ponemos la ruta y el nombre del bean.jar

4- Dentro de la pantalla en tu editor de forms builder , navegamos hasta las propiedades del Bean, y en “Clases de implementación” añadimos: oracle/forms/archivo (sin la extensión).

Si quieres el código completo puedes descargártelo aquí

El password del zip es codigojavaoracle.com

Leer más

Gestión Documental y Captura de Documentos en JAVA y sobre Oracle

Dentro de la gestión documental y desarrollados en JAVA y totalmente aptos para correr sobre bases de datos Oracle existen distintos productos, entre ellos destaca Athento.

La digitalización y captura de documentos con su correspondiente automatización de tareas (clasificación de documentos, extracción de datos y enrutamiento de documentos) se está convirtiendo en la clave para mejorar procesos de negocio. En particular, existen 5 procesos organizacionales cuya mejora puede reportar enormes beneficios cuantificables y no cuantificables:

Gestión de Facturas: Según la IAPP (International Accounts Payable Professionals), la gestión manual de una factura cuesta alrededor de los $8 dólares a las empresas. No sólo porque este proceso es muy susceptible a la pérdida de información contable importante sino también porque es un proceso lento que requiere empleados administrativos dedicados a ello.

Gestión de Ordenes de Compra y de Ventas: Se ha demostrado que la gestión automática de estos procesos representa mejoras en la gestión de la liquidez de la empresa, permite detectar errores de manera más temprana en el proceso y reducir el tiempo del ciclo de gestión de este tipo de documentos.

Gestión de Contratos: Uno de los beneficios más importantes es evitar la pérdida de este tipo de documentos, dado sus implicaciones legales. Otro aspecto que hace atractiva la automatización de gestión de contratos es que según estudios en diversas empresas privadas y públicas, el volumen de contratos en las empresas es igual o ligeramente superior al volumen de facturas.

Gestión de Correspondencia de clientes y atención al cliente: Cartas, solicitudes, emails y otros mecanismos de comunicación del cliente con las empresas resulta crítico para la retención, gestión de reclamaciones y quejas u otros aspectos claves de las relaciones con clientes. La gestión de la correspondencia representa además beneficios producto de ahorros en costes y reducción del riesgo.

Gestión de documentos de Recursos Humanos: Los departamentos de personal son ricos en todo tipo de documentos. La gestión de estos documentos puede representar mejoras en los procesos de reclutamiento y contratación, gestión de salarios y vacaciones.

Athento, que como decimos, está desarrollado en JAVA y corre sobre distintas versiones de bases de datos ORACLE (así como otras tecnologías Oracle a nivel de servidor de aplicaciones, servidor web etc.) es una herramienta que elimina quebraderos de cabeza al personal técnico a la hora de instalar un ECM o gestor de contenido empresarial.

Leer más

Integrar Eclipse y Android

Desarrollar aplicaciones para Android utilizando Eclipse

En este artículo vamos a incorporar a nuestro entorno de desarrollo Eclipse la necesario para poder desarrollar aplicaciones para Android.

Descargar Eclipse

Primero, tenemos que bajarnos nuestro IDE Eclipse, lo podemos realizar a través de la propia web de Eclipse. Seleccionando la opción que más nos interese Web Eclipse o bien podeis utilizar esta versión:
Eclipse IDE for Java EE Developers
Solo hace falta descargar la versión de 32 o 64 bits que necesites y descomprimirla, con esto ya tendrás tu Eclipse a punto parar poder ejecutarlo.

Descargar el SDK de Android

Como segundo paso, necesitaremos el SDK de Android que podemos descargarlo desde aquí http://developer.android.com/sdk/installing/index.html

Una vez descargado lo instalamos y corremos la aplicación Android SDK Manager, aquí chekeamos lo que vamos a necesitar y nos lo instalará en la dirección que queramos.
En este caso hemos instalado las opciones que veis marcadas en la siguiente imagen

android configuración eclipse sdk

Integrar Android con Eclipse

Para integrar el SDK de Android con Eclipse vamos a ejecutar nuestro Eclipse y desde la última opción ‘Help’ vamos a ‘Instalar nuevo Software’.Esto abrirá un menu contextual en el que debemos de hacer click en el boton ‘Add’ para escribir la url desde la que vamos a bajarnos un plugin que permita integrar Eclipse y Android.

La url que tenéis que escribir es esta:

https://dl-ssl.google.com/android/eclipse/

o bien esta:

http://dl-ssl.google.com/android/eclipse/

Después de escribir la url buscará el plugin y nos mostrará los plugin que debemos de instalar, los seleccionamos haciendo ‘check’ y los instalará en nuestro equipo. Lo podéis ver en la imagen que hay a continuación.

integrar android eclipse sdk

Indicar las rutas

Por último, debemos de indicar a Eclipse la ruta en la que hemos instalado nuestro Software Developer Kit de Android en el segundo paso.
Para esto nos dirigimos a ‘Windows‘ después a ‘Preferencias‘, seleccionamos Android y nos mostrará la ruta donde está nuestro SDK, si no es así tendremos que escribirla nosotros.
En mi caso está en la partición F:/Android, le decimos ‘Ok’ y finalmente ya tendremos nuestro entorno de desarrollo preparado para poder utilizarlo.

android sdk configuración integrar eclipse

Leer más

Suma de números de una lista en Java

Queremos codificar un algoritmo en Java que utilizando una instancia de un tipo abstrato de datos en forma de lista , nos devuelva el primer elemento de la lista que sea la suma de los elementos anteriores.

En este ejemplo vamos a utilizar el Vector [2,8,2,5,17,5,3]. Como podéis observar el primer elemento que cumple estas condiciones, es decir, que sea la suma de los anteriores es el elemento 17. Si sumas 2+8+2+5 el resultado es 17, y no existe otro elemento anterior a 17 que sea la suma de los anteriores.

En el caso de que no encuentre ningún elemento que sea la suma de los anteriores la función devolverá un mensaje indicando que no existen estos elementos.

En pseudocódigo sería algo así:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public Integer sumaAnteriores(Lista<Integer> l) {
    Recorrido<Integer> r=l.posiciones();
    Posicion<Integer> pos;
    Integer elem=new Integer(0);
    Integer sumaAnt=0;
    boolean encontrado=false;
    while (r.haySiguiente() && !encontrado) {
    pos=r.siguiente();
    elem=pos.getElem();
    if (elem.intValue() == sumaAnt.intValue()) encontrado=true;
    else sumaAnt+=elem;
    }
    if (encontrado) return elem;
    else System.out.print ("No se han encontrado elementos");
}
Leer más

Instalar Java en Ubuntu

¿Cómo instalar Java en Ubuntu?

En este post describimos como instalar Java en Ubuntu en sencillos pasos, estas son las instrucciones que tiene Java en su web.

1. Vamos a la web de Java http://java.com

2. Descargamos la última versión (la versión que esté en binario NO la versión RPM).

3. Abrimos un terminal y navegamos hasta el dónde se encuentra el archivo binario.

4. Le damos permisos al archivo, por ejemplo: chmod +x archivo.bin

5. Y ejecutamos el archivo: ./archivo.bin (pondremos ./ si se encuentra en el mismo directorio).

instalación java ubuntu

 

Ahora el archivo binario se ejecutará e instalará Java en tu máquina.

Si el proceso no tiene errores mostrará un “Done” o terminado como muestra la imagen.

 

Terminado este proceso tendremos ya instalado Java en Ubuntu.

Leer más