Foros del Web » Programación para mayores de 30 ;) » Java »

socket en java 2 clientes y 1 centralita

Estas en el tema de socket en java 2 clientes y 1 centralita en el foro de Java en Foros del Web. Hola, estoy realizando una aplicacion de socket en java con entorno grafico, la cual hace lo siguiente: quiero enviar un fichero desde el cliente 1 ...
  #1 (permalink)  
Antiguo 01/04/2011, 09:43
 
Fecha de Ingreso: abril-2011
Mensajes: 2
Antigüedad: 13 años, 1 mes
Puntos: 0
socket en java 2 clientes y 1 centralita

Hola, estoy realizando una aplicacion de socket en java con entorno grafico, la cual hace lo siguiente:

quiero enviar un fichero desde el cliente 1 al cliente 2, pero pasando por la centralita, que es el medio de comunicacion entre los dos clientes.

yo he realizado el codigo pero no esta correcto, ya que he empezado a tocar este tema de los socket hace poco tiempo, asi que me gustaria que me ayudaseis, os pongo aqui el codigo que he realizado.

ENTORNO GRAFICO DE LOS CLIENTES
El entorno gragico tiene 2 campos de texto, 1 para insertar el puerto por el que se comunican y otro para colocar la ruta del fichero que se quiere enviar, un textarea que es donde se van a poner todas las incidencias que vayan ocurriendo en el transcuso de la comunicacion y 2 botones, 1 para enviar y otro para recibir.

ENTORNO GRAFICO DE LA CENTRALITA
la centralita consta de 1 textarea que es donde se muestran los mensajes de lo que se va haciendo en el transcurso de la comunicacion y 2 botones, enviar y recibir.

------CODIGO DE LOS CLIENTES-----------
Código java:
Ver original
  1. import java.io.*;
  2. public class Cliente_B extends javax.swing.JFrame {
  3.     /** Creates new form Cliente_B */
  4.     java.net.Socket sck;
  5.     java.io.DataInputStream dis;
  6.     java.io.DataOutputStream dos;
  7.     java.io.BufferedReader br;
  8.     java.io.File fich_B;
  9.  
  10.     String mensaje_B, enviar;
  11.  
  12.     public Cliente_B() {
  13.         initComponents();
  14.  
  15.         try
  16.         {
  17.             //sck=new java.net.Socket("localhost", this.txt_puerto_cliente_A.getText());
  18.             sck=new java.net.Socket("localhost", 9902);//"aqui va el puerto"
  19.             dis=new java.io.DataInputStream(sck.getInputStream());
  20.             dos=new java.io.DataOutputStream(sck.getOutputStream());
  21.         }
  22.         catch(IOException ex)
  23.         {
  24.             this.txa_cliente_B.append("1. Error de E/S con excepcion: "+ex);
  25.         }
  26.        
  27.     }
  28.  
  29. // BOTON ENVIAR
  30. private void btn_enviar_cliente_BActionPerformed(java.awt.event.ActionEvent evt) {                                                    
  31.         // TODO add your handling code here:
  32.         try
  33.         {
  34.             enviar=this.txa_cliente_B.getText();
  35.             dos.writeUTF("\n"+enviar);
  36.             this.txa_cliente_B.append("\nEnviando mensaje ..."+enviar);
  37.  
  38.             dis.close();
  39.             dos.close();
  40.             sck.close();
  41.         }
  42.         catch(IOException ex)
  43.         {
  44.             this.txa_cliente_B.append("2. ERROR de E/S con excepcion: "+ex);
  45.         }
  46.     }
  47.  
  48. // BOTON RECIBIR
  49.  
  50. private void btn_recibir_cliente_BActionPerformed(java.awt.event.ActionEvent evt) {                                                      
  51.         // TODO add your handling code here:
  52.         try
  53.         {
  54.             mensaje_B=dis.readUTF();
  55.             this.txa_cliente_B.append(mensaje_B);
  56.  
  57.             this.txa_cliente_B.append("Fin de transmision ...");
  58.         }
  59.         catch(IOException ex)
  60.         {
  61.             this.txa_cliente_B.append("3. Error de E/S con excepcion"+ex);
  62.         }
  63.     }

------CODIGO CENTRALITA-----------
Código java:
Ver original
  1. import java.io.*;
  2. public class Centralita extends javax.swing.JFrame {
  3.     /** Creates new form Centralita */
  4.     java.net.ServerSocket ssckserver1;
  5.     java.net.Socket sck1;
  6.     java.io.File fich;
  7.     java.io.FileReader fr;
  8.     java.io.BufferedReader br;
  9.     java.io.DataInputStream dis1;
  10.     java.io.DataOutputStream dos1;
  11.  
  12.     String enviar, mensaje;
  13.  
  14.     public Centralita() {
  15.         initComponents();  
  16.     }
  17.  
  18. // BOTON ENVIAR
  19. private void btn_enviar_centralitaActionPerformed(java.awt.event.ActionEvent evt) {                                                      
  20.         // TODO add your handling code here:
  21.         try
  22.         {
  23.             ssckserver1=new java.net.ServerSocket(9901);
  24.  
  25.             sck1=ssckserver1.accept();
  26.  
  27.             dis1=new java.io.DataInputStream(sck1.getInputStream());
  28.  
  29.             dos1=new java.io.DataOutputStream(sck1.getOutputStream());
  30.  
  31.             fich=new java.io.File("./datos.txt");
  32.  
  33.             if (fich.exists())
  34.             {
  35.                 fr=new java.io.FileReader(fich);
  36.                 br=new java.io.BufferedReader(fr);
  37.  
  38.                 mensaje=br.readLine();
  39.                 while (mensaje!=null)
  40.                 {
  41.                     if(sck1.isConnected())
  42.                     {
  43.                         dos1.writeUTF(mensaje);
  44.                         this.txa_centralita.append("\nEnviando al cliente... "+mensaje);
  45.                     }
  46.                     else
  47.                     {
  48.                         this.txa_centralita.append("\nCliente 1 desconectado.");
  49.                     }
  50.                 }
  51.                 dos1.close();
  52.                 sck1.close();
  53.                 ssckserver1.close();
  54.             }
  55.             else
  56.             {
  57.                 this.txa_centralita.append("El fichero elegido no existe.");
  58.             }
  59.         }
  60.         catch(IOException ex)
  61.         {
  62.             this.txa_centralita.append("Error de E/S con excepcion: "+ex);
  63.         }
  64.     }
  65. // BOTON RECIBIR
  66. private void btn_recibir_centralitaActionPerformed(java.awt.event.ActionEvent evt) {
  67.         // TODO add your handling code here:
  68.         try
  69.         {
  70.             ssckserver1=new java.net.ServerSocket(9901);
  71.  
  72.             sck1=ssckserver1.accept();
  73.  
  74.             dis1=new java.io.DataInputStream(sck1.getInputStream());
  75.  
  76.             dos1=new java.io.DataOutputStream(sck1.getOutputStream());
  77.  
  78.             fich=new java.io.File("./datos.txt");
  79.  
  80.             if (fich.exists())
  81.             {
  82.                 fr=new java.io.FileReader(fich);
  83.                 br=new java.io.BufferedReader(fr);
  84.  
  85.                 mensaje=br.readLine();
  86.                 while (mensaje!=null)
  87.                 {
  88.                     if(sck1.isConnected())
  89.                     {
  90.                         dos1.writeUTF(mensaje);
  91.                         this.txa_centralita.append("\nEnviando al cliente... "+mensaje);
  92.                     }
  93.                     else
  94.                     {
  95.                         this.txa_centralita.append("\nCliente 1 desconectado.");
  96.                     }
  97.                 }
  98.                 dos1.close();
  99.                 sck1.close();
  100.                 ssckserver1.close();
  101.             }
  102.             else
  103.             {
  104.                 this.txa_centralita.append("El fichero elegido no existe.");
  105.             }
  106.         }
  107.         catch(IOException ex)
  108.         {
  109.             this.txa_centralita.append("Error de E/S con excepcion: "+ex);
  110.         }
  111.     }
  #2 (permalink)  
Antiguo 01/04/2011, 23:03
 
Fecha de Ingreso: abril-2011
Mensajes: 14
Antigüedad: 13 años, 1 mes
Puntos: 0
Respuesta: socket en java 2 clientes y 1 centralita

Hola er_pablito_85,

Según mi experiencia en sockets, debes tener cuidado con varias cosas:
  1. Un socket puede enviar ó recibir datos en un instante dado de tiempo, no ambas cosas (si se quieren hacer ambas cosas, se hacen por sockets diferentes, con puertos diferentes).
  2. Haz simplemente que la centralita abra el ServerSocket, y "lea" por el InputStream lo que está recibiendo, sin escribir nada. El cliente deberá abrir el socket únicamente cuando ya vaya a escribir, no antes.

Aquí va un código que funciona:

Código:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;


public class Main {

	private static int numSesion=0;
	
	public static void main(String[] args) {
		ServerSocket serverSocket = null;
		try {
			serverSocket = new ServerSocket(12345);
		} catch (IOException e) {
			e.printStackTrace();
			return;
		}
		
		while (true){
			try {
				Socket nuevoSocket = serverSocket.accept();
				Escucha esc = new Escucha(nuevoSocket,numSesion++);
				esc.start();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}

	protected static class Escucha extends Thread{
		int numSesion;
		Socket miSocket;
		
		public Escucha(Socket miSocket,int numSesion) {
			this.miSocket = miSocket;
			this.numSesion = numSesion;
		}
		
		@Override
		public void run() {
			BufferedReader rd = null;
			try {
				rd = new BufferedReader(new InputStreamReader(miSocket.getInputStream()));
			} catch (IOException e) {
				e.printStackTrace();
			}
			while (!miSocket.isClosed()){
				String linea;
				try {
					linea = rd.readLine();
					if (linea.equals("salir")){
						miSocket.close();
					}
				} catch (IOException e) {
					e.printStackTrace();
					break;
				}
				System.out.println(String.valueOf(numSesion) + "-" + linea);
			}
		}
	}
	
	
}
Este código, si lo corres, crea un servidor en el puerto 12345, que si te conectas por Telnet (con el comando "telnet localhost 12345") todo lo que escribas en ese Telnet aparecerá en el System.out del servidor. La conexión se cierra si se escribe "salir" (como se está leyendo con un BufferedReader, solo se visualiza información al poner <enter>).

Creo que esto puede servir como guía para implementar lo que necesitas. Ten en cuenta el uso de Threads para abrir muchas conexiones (cada conexión nueva es un hilo) y el control de los mismos: qué condición hará que un hilo termine (control de tiempos máximos de espera, etc).

La otra solución (muuuuucho más simple) es transferir archivos por algún protocolo existente, como SSH, FTP, entre otros. Hay muchos clientes en internet para ello, y seguramente será mucho más simple de implementar, que todo el control que toca hacer para que el socket sea fiable (cosa que un protocolo como FTP ya implementa).

Saludos.
  #3 (permalink)  
Antiguo 03/04/2011, 03:31
 
Fecha de Ingreso: abril-2011
Mensajes: 2
Antigüedad: 13 años, 1 mes
Puntos: 0
Respuesta: socket en java 2 clientes y 1 centralita

No entiendo esto que me quieres decir. el problema es que no encuentro el fallo que tiene mi codigo, estoy arto de repasarlo, me gustaria que me digeseis cual es el fallo que tien mi codigo.

Saludos

Etiquetas: socket, cliente
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 02:15.