Java - Aplicacion Sockets Tienda

 
Vista:
sin imagen de perfil

Aplicacion Sockets Tienda

Publicado por Paco (4 intervenciones) el 02/12/2021 18:41:39
Buenas Tardes, alguien por favor me podria ayudar con esta tarea:

En esta tarea hay que crear dos aplicaciones, un cliente de un almacén y un servidor de un almacén de chirimoyas:
-Han de crearse dos proyectos java, uno con la clase cliente y otro con la clase servidor.
• La aplicación cliente implementará una conexión de red por medio de sockets.
• El usuario debe poder insertar una dirección IP y un puerto al que conectarse
• La aplicación cliente creará un hilo que se encargará de todo el proceso de la comunicación con el servidor, permitiendo al hilo principal encargarse de la comunicación con el usuario
• La aplicación cliente debe permitir al usuario consultar el número de chirimoyas que hay almacenadas. Además, debe permitirle añadir chirimoyas y reducir el número de las mismas.
• La aplicación servidor debe ser capaz de recibir conexiones por medio de la red. Al arrancar la aplicación nos debe permitir seleccionar el puerto en el que queremos iniciar el servicio.
• El servidor tendrá un stock inicial de chirimoyas que el usuario insertará al iniciar la aplicación.
• La aplicación servidor permitirá únicamente una conexión simultánea, para la cual usará un hilo de ejecución, dejando al hilo padre la posibilidad de que un usuario consulte el estado del almacén.
• La aplicación cliente mostrará el listado de opciones que se permite realizar, véase consultar, insertar y retirar.
• La aplicación servidor permitirá una única opción, consultar.
• Cada vez que se realice una operación por parte del cliente, el servidor mostrará información de lo que está ocurriendo.

Esto es lo que tengo hecho pero no consigo conectar los mensajes del cliente al servidor.


Clase Servido
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
public class ServidorAlmacen {
 
        private int stock;
	private final ServerSocket servidor;
	private volatile boolean cancel = false;
 
	public ServidorAlmacen(int stock) throws IOException {
		this.stock = stock;
		servidor = new ServerSocket(5037);
	}
 
	public void iniciar() throws IOException {
		BufferedReader cin = new BufferedReader(new InputStreamReader(System.in));
		String local;
		Thread client = new Thread() {
			public void run() {
				boolean stop = false;
				int req=2;
				try {
					while(!cancel) {
						Socket socket = servidor.accept();
						 ObjectOutputStream os = new ObjectOutputStream(socket.getOutputStream());
						 ObjectInputStream is = new ObjectInputStream(socket.getInputStream());
						while(!stop) {
							String cmd = is.readUTF();
							switch(cmd) {
							case "consultar":
								os.writeInt(stock);
								break;
							case "retirar":
								req = is.readInt();
								os.writeInt(cambiarStock(-req));
								break;
							case "cerrar":
								stop = true;
								os.writeInt(0);
								socket.close();
								break;
							default:
								os.writeInt(-1);
							}
						}
					}
				} catch(IOException ex) {
					if(!cancel) {
						Logger.getLogger(ServidorAlmacen.class.getName()).log(Level.SEVERE, null, ex);
					}
				}
			}
		};
 
		System.out.println("Servidor aceptando peticiones en puerto 5037");
		client.start();
		while(!cancel) {
			local = cin.readLine();
			switch(local) {
			case "consultar":
				System.out.printf("Stock: %d\n", stock);
				break;
			case "cerrar":
				cancel = true;
				client.interrupt();
				break;
			default:
				System.out.println("Don't grok!");
			}
		}
		System.exit(0);
	}
 
	private synchronized int cambiarStock(int cantidad) {
		if((stock + cantidad) < 0) {
			return -1;
		}
		stock += cantidad;
		return stock;
	}
 
	public static void main(String args[]) throws IOException {
            Scanner sc=new Scanner(System.in);
            System.out.println("Introduzca el stock inicial de chirimoyas: ");
            int numero=sc.nextInt();
		new ServidorAlmacen(numero).iniciar();
	}

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
public class ClienteAlmacen {
 
    public static void main(String[] args) {
        ClienteAlmacen cliente = new ClienteAlmacen();
        cliente.iniciar();
    }
 
    public void iniciar() {
        try {
            //Creamos una variable para los comandos a introducir
            String comando = "";
            String direccionIp = "127.0.0.1";
            String puerto = "5037";
 
            //Creamos un flujo de entrada de datos para teclado
            // Variable para leer los comando del usuario
            BufferedReader buffer = new BufferedReader(
                    new InputStreamReader(System.in));
 
            System.out.print(
                    "Introduce la dirección ip del servidor [127.0.0.1]: ");
            direccionIp = buffer.readLine();
            if (direccionIp.equals("")) {
                direccionIp = "127.0.0.1";
            }
 
            System.out.print("Introduce el puerto al que conectarse [5037]: ");
            puerto = buffer.readLine();
            if (puerto.equals("")) {
                puerto = "5037";
            }
 
            //El cliente debe conocer la dirección ip y el puerto de conexión
            //Hay que solicitarla para establecer la conexión
            //Pasamos la ip y el puerto al socket
            Socket cliente = new Socket(direccionIp, parseInt(puerto));
            System.out.println("Conexión establecida.");
 
            //Flujo salida para poder enviar informacion al servidor
            PrintWriter enviar = new PrintWriter(cliente.getOutputStream(), true);
            //Flujo entrada para recibir la información del servidor
            BufferedReader recibir = new BufferedReader(new InputStreamReader(cliente.getInputStream()));
 
            System.out.println("Conexion establecida con el servidor.");
 
 
        } catch (IOException e) {
            System.out.println(e.getMessage());
        }
 
    }
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

Aplicacion Sockets Tienda

Publicado por Tom (1831 intervenciones) el 02/12/2021 19:42:04
Lo que tienes es una copia de esto:

https://www.lawebdelprogramador.com/foros/Java/1682007-Programacion-multihilo-con-sockets.html

No recuerdo si en su día lo probé con la misma clase cliente que tú has pegado, pero estoy casi seguro de que funcionaba.
¿ Por qué dices: "no consigo conectar los mensajes del cliente al servidor." ? ¿ Cuales son los síntomas ?

En principio parece que no has copiado completamente la clase cliente, la tuya finalizaría sin hacer nada.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Aplicacion Sockets Tienda

Publicado por Paco (4 intervenciones) el 02/12/2021 20:08:43
Da un error a la hora de intentar pasar los mensajes de la clase cliente a la clase servidor, y me indica la linea de ObjectOutputStream como si hubiera un fallo al intentar leer el mensaje del cliente el servidor
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Aplicacion Sockets Tienda

Publicado por Paco (4 intervenciones) el 02/12/2021 22:02:07
Como si la clase servidor no reconociera el tipo de dato que le esta pasando el cliente, gracias de antemano.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Aplicacion Sockets Tienda

Publicado por Tom (1831 intervenciones) el 03/12/2021 12:53:07
¿ Será como si estuvieras usando un ObjectInputStream para leer y un OutputStream para escribir ?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Aplicacion Sockets Tienda

Publicado por Paco (4 intervenciones) el 13/12/2021 19:41:33
Si en cuanto introducía algo en la consola se caía la aplicacion.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar