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

problema con threads y sockets

Estas en el tema de problema con threads y sockets en el foro de Java en Foros del Web. hola a todos. Tengo una aplicación que es un servidor qeu acepta conexiones de clientes. Lo que tenía en mente es un thread por cada ...
  #1 (permalink)  
Antiguo 13/02/2012, 10:59
 
Fecha de Ingreso: marzo-2009
Mensajes: 509
Antigüedad: 15 años, 9 meses
Puntos: 17
problema con threads y sockets

hola a todos.

Tengo una aplicación que es un servidor qeu acepta conexiones de clientes.

Lo que tenía en mente es un thread por cada receptor y asociarlo por su ip, pero todos los clientes me "dicen" que su ip es la del último cliente conectado, este es mi constructor de la clase receptor:

Código:
	public receptor(Socket Client){
		this.client = Client;
		ip = client.getInetAddress().getHostAddress();
		System.out.println(ip);
	}
Aquí la imprime perfecta la ip, pero más adelante en el run:

Código:
	public void run(){

		try{

        	while(true){
				InputStream inputStream = client.getInputStream();
				DataInputStream dataInputStream = new DataInputStream(inputStream);

                                System.out.println(ip);
               }
        }
 }
Aquí falla y siempre me imprime la ip del último cliente conectado.

¿Alquien podría ayudarme?

Gracias por adelantado!

Saludos
  #2 (permalink)  
Antiguo 13/02/2012, 11:09
 
Fecha de Ingreso: febrero-2011
Mensajes: 672
Antigüedad: 13 años, 10 meses
Puntos: 78
Respuesta: problema con threads y sockets

Hola cucuru,
yo lo que haría es que una vez que te llega el cliente, guardas el objeto en una lista (List, Vector, etc....) y creas un hilo y lo envias allí. De esta forma tienes la lista a mano con todos los clientes que te han llegado y a éstos trabajando de forma individual en hilos diferentes.

Un saludo.
  #3 (permalink)  
Antiguo 14/02/2012, 07:00
 
Fecha de Ingreso: marzo-2009
Mensajes: 509
Antigüedad: 15 años, 9 meses
Puntos: 17
Respuesta: problema con threads y sockets

Eso es lo que yo creía que hago, pero se ve que no es así!

mira tengo esta variable:

Código:
	public static HashMap<String,java.net.Socket> ipSocket;
Y cuando se me conecta un cliente:

Código:
ipSocket.put(client.getInetAddress().getHostAddress(), client);
            		receptor rx = new receptor(client);
Receptor es:

Código:
public class receptor extends Thread{	

	
	public receptor(Socket Client){
		this.client = Client;
		ip = client.getInetAddress().getHostAddress();
		System.out.println(client.getInetAddress().getHostAddress());
	}

luego en el run recojo los msg que me deja el usuario pero si le digo que me imprima la variable "ip" me imprime siempre la del último cliente conectado.

¿sabrías ver mi error?

Gracias!
  #4 (permalink)  
Antiguo 15/02/2012, 02:20
Avatar de Fuzzylog  
Fecha de Ingreso: agosto-2008
Ubicación: En internet
Mensajes: 2.511
Antigüedad: 16 años, 3 meses
Puntos: 188
Respuesta: problema con threads y sockets

Prueba a recorrer ipSocket y a mostrar todos los valores de ip que encuentre a ver como se han introducido.
__________________
if (fuzzy && smooth) {
fuzzylog = "c00l";
return true;
}
  #5 (permalink)  
Antiguo 15/02/2012, 02:40
 
Fecha de Ingreso: marzo-2009
Mensajes: 509
Antigüedad: 15 años, 9 meses
Puntos: 17
Respuesta: problema con threads y sockets

La ip se introduce bien, eso lo tengo testeado, lo hago antes de entrar al thread.

El problema es dentro del thread, que lee bien del socket, en el constructor lo hace bien, pero más adelante, cuando llamo a la variable ip, la ha cambiado por la del la del último socket conectado.

¿Hay alguna manera de ver que threads están corriendo en mi código?

Gracias!
  #6 (permalink)  
Antiguo 15/02/2012, 03:15
Avatar de Fuzzylog  
Fecha de Ingreso: agosto-2008
Ubicación: En internet
Mensajes: 2.511
Antigüedad: 16 años, 3 meses
Puntos: 188
Respuesta: problema con threads y sockets

http://stackoverflow.com/questions/1...unning-in-java

¿Tienes algún sitio en el que se pille el thread con un index? La otra opción es que ante una nueva ejecucion haya que limpiar los datos de la previa...
__________________
if (fuzzy && smooth) {
fuzzylog = "c00l";
return true;
}
  #7 (permalink)  
Antiguo 15/02/2012, 04:18
 
Fecha de Ingreso: marzo-2009
Mensajes: 509
Antigüedad: 15 años, 9 meses
Puntos: 17
Respuesta: problema con threads y sockets

Muchísimas gracias Fuzzylog por tu ayuda.

A ver si pudieras ayudarme un poquito más.

Estoy viendo en el blog de Chuidiang (que me ha sacado de mil apuros) en estas dos páginas:

http://chuwiki.chuidiang.org/index.p...rminar_un_hilo

http://www.chuidiang.com/java/socket...cket_hilos.php

Cita:
Lo que esté en el método run() es lo que se ejecutará en un hilo separado.

Cuando queramos que empiece a ejecutarse, creamos una instancia de la clase Thread pasándole una instancia de MiRunnable y la arrancamos
Así que he cambiado cosillas en mi código, desde el servidor ahora es:

Código:
        	         Runnable rx = new receptor(client);
        	         Thread rxThread = new Thread(rx);
        	         rxThread.start();
y en run:

Código:
	public void run(){


		try{
        	updateDatabase = new HashMap<String,String>();
        	while(true){
				InputStream inputStream = client.getInputStream();
				DataInputStream dataInputStream = new DataInputStream(inputStream);
        		ip = client.getInetAddress().getHostAddress();
								
				log.info("mi ip es " + ip);

y lo que hace ahora es darme la ip del cliente anterior. Si el cliente lo coge bien porque los datos me llegan bien, ¿cómo es posible que luego la IP me la de al revES?


Gracias!
  #8 (permalink)  
Antiguo 15/02/2012, 04:40
 
Fecha de Ingreso: marzo-2009
Mensajes: 509
Antigüedad: 15 años, 9 meses
Puntos: 17
Respuesta: problema con threads y sockets

Lo he conseguido!!!

Al implementar runnable, le paso los dos parámetros

Código:
        	         Runnable rx = new receptor(client,client.getInetAddress().getHostAddress());
        	         Thread rxThread = new Thread(rx);
        	         rxThread.start();
cambio el constructro en mi clase receptor y perfecto!!

ese mismo constructor al extender Thread no funcionaba, pero así si!

Gracias!

Etiquetas: clase, sockets, threads
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 14:22.