lunes, 20 de noviembre de 2006

Uso de Sockets y Threads en aplicaciones Cliente-Servidor en Java

Aquí les traigo un código de una sencilla aplicación cliente-servidor hecho en Java.

La aplicación maneja la comunicación por sockets y usa multihilos (threads) igual de forma remota. Aunque el programa en sí no tiene un uso muy práctico en la realidad, les puede dar una base de lo que es la comunicación por sockets y el uso de los threads.

La aplicación consta del programa cliente y el programa servidor. El servidor recibe las ordenes del cliente para ejecutar movimientos de 2 figuras en 4 direcciones
Se necesita depurar el servidor primero para que funcione, y el cliente tiene que compilarse y luego depurar el applet.

Éste es el código del servidor:

import java.io.*;
import java.applet.Applet;
import java.awt.*;
import java.net.*;
public class Servidor extends Frame
{
int x=180,y=300,i;
int m=180,n=360,s;
boolean flag=false;
Button b1,b2,b3,b4,b5,b6,b7,b8;
TextArea area;
ServerSocket serverSocket=null;
Socket clientSocket=null;
PrintWriter out;
BufferedReader in;
String entrada;
Receive R;
public Servidor()
{
super("Servidor para uso de Sockets y Threads");
setLayout(new FlowLayout());
add(area=new TextArea(15,35));
resize(400,450);
show();
repaint();
connect();
R=new Receive();
R.start();
}
public void connect()
{
showText("Estado: Conectando...");
try
{
serverSocket = new ServerSocket(80);
clientSocket = serverSocket.accept();
out = new PrintWriter(clientSocket.getOutputStream(),true);
in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
}
catch(Exception e)
{
if (flag=false)
{
showError(e.toString());showError(e.toString());
}
flag=true;
}
showText("Estado: Conectado");
}
public void disconnect()
{
showText("Estado: Desconectando...");
try
{
out.close();
in.close();
clientSocket.close();
serverSocket.close();
flag=false;
}
catch(Exception e)
{
if (flag=false)
{
showError(e.toString());
}
flag=true;
}
showText("Estado: Desconectado");
}
public void showError(String S)
{
area.appendText("Estado: Desconectado..."+"\n"+"Vuelva a cargar el cliente y el servidor..."+"\n");
}
public void showText(String S)
{
area.appendText(S+"\n");
}
public class Receive extends Thread
{
public void run()
{
while (true)
{
try
{
if ((entrada = in.readLine())!=null);
{
showText(entrada);
if (entrada.equals("Cuadro arriba"))
n=n-30;
if (entrada.equals("Círculo arriba"))
y=y-30;
if (entrada.equals("Cuadro abajo"))
n=n+30;
if (entrada.equals("Círculo abajo"))
y=y+30;
if (entrada.equals("Cuadro izquierda"))
m=m-30;
if (entrada.equals("Círculo izquierda"))
x=x-30;
if (entrada.equals("Cuadro derecha"))
m=m+30;
if (entrada.equals("Círculo derecha"))
x=x+30;
if (entrada.equals("Adiós!!!"))
break;
repaint();
}
}
catch(Exception e)
{
showError(e.toString());
}
}
}
}
public void send(String a)
{
out.println(a);
showText("Local: "+a);
}
public void paint( Graphics g ) {
g.setColor(Color.red);
g.fillOval(x,y,50,50);
g.setColor(Color.blue);
g.fillRect(m,n,50,50);
}
public static void main (String args [])
{
new Servidor();
}
}

Y el código del cliente:

import java.io.*;
import java.applet.Applet;
import java.awt.*;
import java.net.*;
public class Cliente extends Applet
{
int r=120,c=120,i;
Button b1,b2,b3,b4,b5,b6,b7,b8,b9;
Button Connect,Send,Exit;
TextArea area;
TextField text;
Socket kkSocket=null;
PrintStream out = null;
DataInputStream in = null;
String entrada;
Receive R;
public void connect()
{
showText("Estado: Conectando...");
try
{
kkSocket = new Socket("LocalHost",80);
out = new PrintStream(kkSocket.getOutputStream());
in = new DataInputStream(kkSocket.getInputStream());
}
catch(Exception e)
{
showError(e.toString());
}
showText("Estado: Conectado");
}
public void disconnect()
{
showText("Estado: Desconectando...");
try
{
out.close();
in.close();
kkSocket.close();
}
catch(Exception e)
{
showError(e.toString());
}
showText("Estado: Desconectado");
}
public void showError(String S)
{
area.appendText("Estado: Desconectado..."+"\n"+"Inicie el programa servidor \n"+"y vuelva a cargar el cliente..."+"\n");
}
public void showText(String S)
{
area.appendText(S+"\n");
}
public class Receive extends Thread
{
public void run()
{
while (true)
{
try
{
if ((entrada = in.readLine())!=null);
{
showText(entrada);
}
}
catch(Exception e)
{
showError(e.toString());
}
}
}
}
public void send(String a)
{
out.println(a);
showText(a);
}
public void exit()
{
out.println("Adiós!!!");
showText("Desconectado...");
text.setText("");
if (R.isAlive())
{
R.stop();
}
disconnect();
System.exit(0);
}
public void init() {
setLayout(new FlowLayout());
add(area=new TextArea(15,35));
Dimension d = size();
repaint();
b1 = new Button( "Cuadro arriba" );
b2 = new Button( "Cuadro abajo" );
b3 = new Button( "Cuadro izquierda" );
b4 = new Button( "Cuadro derecha" );
b5 = new Button( "Círculo arriba" );
b6 = new Button( "Círculo abajo" );
b7 = new Button( "Círculo izquierda" );
b8 = new Button( "Círculo derecha" );
b9 = new Button( "Adiós!!!" );
this.add( b1 );
this.add( b5 );
this.add( b2 );
this.add( b6 );
this.add( b3 );
this.add( b7 );
this.add( b4 );
this.add( b8 );
this.add( b9 );
connect();
R=new Receive();
R.start();
}
public void paint( Graphics g ) {
g.drawRect(r,c,50,50);
}
public boolean handleEvent(Event e) {
if (e.id == Event.WINDOW_DESTROY)
{
exit();
}
return super.handleEvent(e);
}
public boolean action( Event evt,Object obj ) {
if ( evt.target.equals( b1 ) )
send("Cuadro arriba");
if ( evt.target.equals( b2 ) )
send("Cuadro abajo");
if ( evt.target.equals( b3 ) )
send("Cuadro izquierda");
if ( evt.target.equals( b4 ) )
send("Cuadro derecha");
if ( evt.target.equals( b5 ) )
send("Círculo arriba");
if ( evt.target.equals( b6) )
send("Círculo abajo");
if ( evt.target.equals( b7 ) )
send("Círculo izquierda");
if ( evt.target.equals( b8 ) )
send("Círculo derecha");
if ( evt.target.equals( b9 ) )
send("Adiós!!!");
repaint();
return true;
}
}

Les dejo la descarga de la aplicación completa lista para depurarse.

Descarga la aplicación

Espero que sea de utilidad para alguien.

KobraSoft®

No hay comentarios.:

 

Visitante número:
ContactosPensionesTiendasCampingPracticas