Cliente/Servidor mediante sockets sin búfer por TCP/IP en Java
25.10.08. Por ooscarr (ooscarr)Comunicar 2 computadores por socket es más o menos simple en java.
Ejemplo 1
En la U nos dieron este ejemplo con sockets para que los trabajáramos.
Cliente.java
import java.io.*;
import java.net.*;
class Cliente {
static final String HOST = "localhost";
static final int PUERTO=5000;
public Cliente() {
try{
Socket skCliente = new Socket( HOST , PUERTO );
InputStream aux = skCliente.getInputStream();
DataInputStream flujo = new DataInputStream( aux );
System.out.println( flujo.readUTF() );
skCliente.close();
} catch( Exception e ) {
System.out.println( e.getMessage() );
}
}
public static void main( String[] arg ) {
new Cliente();
}
}
Servidor.java
import java.io.* ;
import java.net.* ;
class Servidor {
static final int PUERTO=5000;
public Servidor() {
try {
ServerSocket skServidor = new ServerSocket( PUERTO );
System.out.println("Escucho el puerto " + PUERTO );
for ( int numCli = 0; numCli < 3; numCli++) {
Socket skCliente = skServidor.accept(); // Crea objeto
System.out.println("Sirvo al cliente " + numCli);
OutputStream aux = skCliente.getOutputStream();
DataOutputStream flujo= new DataOutputStream( aux );
flujo.writeUTF( "Hola cliente " + numCli );
skCliente.close();
}
System.out.println("Demasiados clientes por hoy");
} catch( Exception e ) {
System.out.println( e.getMessage() );
}
}
public static void main( String[] arg ) {
new Servidor();
}
}
Calculadora científica
Combinando el ejemplo anterior y el código de las funciones en la clase Operaciones de un artículo anterior, queda lo siguiente:
Cliente.java
//Librerías
import java.io.*;
import java.net.*;
public class Cliente{
//Constructor
public Cliente(){
}
/* Se definen dos variables que leen DESDE EL TECLADO
stdin1 para saber si sigue o no
stdin2 para obtener el valor que quiere resolver */
private static BufferedReader stdin1 = new BufferedReader(new InputStreamReader(System.in));
private static BufferedReader stdin2 = new BufferedReader(new InputStreamReader(System.in));
//Función principal
public static void main(String args[]) throws IOException{
//Variable que guarda el nombre del servidor de raíz cuadrada
String IP_SQRT="localhost";// con =null; también funciona
//Variable que guarda el puerto del servidor de raíz cuadrada
int PUERTO_SQRT=5001;
//Por defecto sí sigue (empieza)
String sigue="s";
System.out.println("\nBuenos días");
//Mientras el usuario siga con ganas de resolver
while(sigue.equals("s")){
try{
System.out.println("RAÍZ CUADRADA");
//Lee el valor desde teclado
System.out.print("Raíz cuadrada de: ");
String valor=stdin2.readLine();
//Envía el valor a la función de más abajo
String resultado=realizar_operacion(IP_SQRT,PUERTO_SQRT,valor);
//Imprime el resultado
System.out.println("= "+resultado);
} catch(Exception e){
System.err.println(e);
}
//Sigue el ciclo
System.out.print("\nDesea realizar otra operación? (s/n): ");
sigue = stdin1.readLine();
}
System.out.println("Adios.");
}
/* Función realizar operacion se encarga de comunicarse con el servidor*/
static String realizar_operacion(String host,int puerto,String valor){
String respuesta=null;
try {
//System.out.print("Abriendo socket y creando flujos (streams)... ");
Socket sockete = new Socket(host,puerto);
//Creo dos canales de comunicación con la conexión
DataOutputStream salida = new DataOutputStream(new BufferedOutputStream(sockete.getOutputStream()));
DataInputStream entrada = new DataInputStream(new BufferedInputStream(sockete.getInputStream()));
//System.out.println("OK\n");
//Pongo el valor en el canal de salida
salida.writeUTF(valor);
//Envío lo que hay en el canal de salida
salida.flush();
//Leo lo recibido como respuesta por el canal de entrada
respuesta = entrada.readUTF();
//System.out.println("Resultado="+respuesta);
//Se cierra la petición de conexión llamada sockete
try{
sockete.close();
} catch (Exception ex){}
}
catch(Exception e){
System.err.println(e);
}
//Retorna el valor recibido como respuesta
return respuesta;
}
}
Servidor.java
//
// Servidor.java
//
/* Esta clase
1. Abre un puerto
2. Acepta una conexión
3. Recibe un String
4. Envía la raíz cuadrada del String
5. Cierra la conexión
*/
import java.io.*;
import java.net.*;
public class Servidor{
//Constructor
public Servidor(){
}
public static void main (String[] args){
//Puerto que se abrirá en esta máquina para responder a los clientes
int PUERTO_SQRT=5001;
Socket socket=null;
ServerSocket serverSocket=null;
try{
serverSocket =new ServerSocket(PUERTO_SQRT);
}
catch (Exception e){
System.err.println("Error al crear socket");
return;
}
//Mientras el programa esté funcionando
while (true){
try{
System.out.println("Esperando para resolver raíces cuadradas ...");
//Acepto una petición de conexión
socket=serverSocket.accept();
//Creo dos canales de comunicación con la conexión
DataOutputStream salida = new DataOutputStream(new BufferedOutputStream(socket.getOutputStream()));
DataInputStream entrada = new DataInputStream(new BufferedInputStream(socket.getInputStream()));
System.out.println("Bienvenido");
//System.out.print("Esperando valor... ");
//Recibo el valor desde el cliente
String valor = entrada.readUTF();
//Creo el objeto con las operaciones definidas
Operaciones operar=new Operaciones(valor);
System.out.print("Raíz cuadrada de "+valor+" es... ");
//Realizo la operación
String resultado=String.valueOf(operar.sqrt());
System.out.println(resultado);
//La pongo en el canal de salida
salida.writeUTF(resultado);
System.out.print("Enviando respuesta... ");
//Se envía
salida.flush();
System.out.println("OK");
//Se cierra la petición de conexión llamada socket
try{
socket.close();
}
catch (IOException ex){}
}
catch (Exception e){
System.err.println("Cerrando la conexion del socket ...");
if(socket!=null){
try{
socket.close();
}
catch (IOException ex){}
}
}
}
}
}
Pronto más.


0 comentarios (RSS
) :
Referencias a este artículo:
Página principal