Java - Programación multihilo con sockets

 
Vista:
sin imagen de perfil
Val: 8
Ha aumentado su posición en 5 puestos en Java (en relación al último mes)
Gráfica de Java

Programación multihilo con sockets

Publicado por Josh (5 intervenciones) el 24/01/2019 11:45:39
Por favor alguien me puede echar una mano para implementar el hilo de esta tarea?, la aplicación cliente y servidor ya está creada, he adjuntado los archivos de los dos programas, servidor y cliente.



En esta tarea hay que crear dos aplicaciones, un cliente de un almacén y un servidor de un almacén de chirimoyas:

• 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.
• Al arrancar las aplicaciones, tanto la aplicación cliente como la aplicación servidor, deben mostrar por consola la siguiente información:
********************************************************
* PSP - Tarea Individual 4 - Cliente / Servidor *
********************************************************
* Nombre y apellidos del Alumno *
********************************************************
* DNI del alumno *
********************************************************
• 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.



Servidor...


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
package psp_t04_servidor_sockets;
 
import java.io.BufferedReader;
import java.io.*;
import java.net.*;
import java.util.logging.Level;
import java.util.logging.Logger;
 
/**
 *
 * @author  <your.name at your.org>
 */
public class PSP_T04_servidor_sockets {
 
    public static void main(String[] args) {
 
        try {
            //Mantener conexión mientras salir sea false
            boolean salir = false;
            int puerto = 9090;
 
            //Creamos un ServerSocket a la escucha que acepta como parámetro el puerto a conectar
            ServerSocket servidor = new ServerSocket(puerto);
 
            System.out.println("Esperando conexión del cliente...");
 
            //Creamos un objeto de la clase socket que aceptará una conexión cliente entrante
            Socket cliente = servidor.accept();
 
            //Creamos flujo de entrada para recibir información del cliente
            BufferedReader recibir = new BufferedReader(new InputStreamReader(cliente.getInputStream()));
 
            //Creamos un flujo de salida
            PrintWriter enviar = new PrintWriter(cliente.getOutputStream(),true);
 
 
            while(!salir){
                //Esperar a recibir informacion por el flujo de entrada
                String comando = recibir.readLine();
                System.out.println("Comando recibido: " + comando);
 
                //Switch para los comandos que teclee el cliente
                switch(comando){
                    case "salir":
                        salir = true;
                        break;
                    default:
                        enviar.println("Comando no reconocido.");
                        System.out.println("Comando no reconocido.");
                        break;
 
                }
 
            }
            cliente.close();
            servidor.close();
 
 
        } catch (IOException ex) {
            Logger.getLogger(PSP_T04_servidor_sockets.class.getName()).log(Level.SEVERE, null, ex);
        }
 
    }
 
}


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
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
package psp_t04_cliente_sockets;
 
import java.io.*;
import java.net.*;
import java.util.logging.Level;
import java.util.logging.Logger;
 
/**
 *
 * @author  <your.name at your.org>
 */
public class PSP_T04_cliente_sockets {
 
 
    public static void main(String[] args) {
        try {
            //Creamos una variable para los comandos a introducir
            String comando = "";
            String direccionIp ="127.0.0.1";
            int puerto =9090;
 
            //Creamos un flujo de entrada de datos para teclado
            BufferedReader lectorDeComandos = new BufferedReader(new InputStreamReader(System.in));
 
            //El cliente debe conocer la dirección ip y el puerto de conexión
            //Hay que solicitarla para establecer la conexión
 
            System.out.println("Introduzca la dirección ip del servidor: [127.0.0.1]");
            comando = lectorDeComandos.readLine();
            if (!comando.equalsIgnoreCase("")){
                direccionIp = comando;
 
 
            }
 
            System.out.println("Introduzca el puerto al que conectarse: [9090]");
            comando = lectorDeComandos.readLine();
 
            if(!comando.equalsIgnoreCase("")){
                puerto = Integer.parseInt(comando);
 
            }
 
            //Pasamos la ip y el puerto al socket
            Socket cliente = new Socket(direccionIp, 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()));
 
 
            while(!comando.equalsIgnoreCase("salir")){
                System.out.println("");
                System.out.println("Por favor, introduzca un comando: ");
 
                comando = lectorDeComandos.readLine();
                enviar.println(comando);
                System.out.println(recibir.readLine());
            }
 
 
        } catch (IOException ex) {
            Logger.getLogger(PSP_T04_cliente_sockets.class.getName()).log(Level.SEVERE, null, ex);
        }
 
    }
 
}
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

Programación multihilo con sockets

Publicado por Tom (1831 intervenciones) el 24/01/2019 21:24:55
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
public class ServerAlmacen {
	private int stock;
	private final ServerSocket ss;
	private volatile boolean cancel = false;
 
	/* */
	private ServerAlmacen(int stock) throws IOException {
		this.stock = stock;
		ss = new ServerSocket(9090, 2, InetAddress.getByName("loghost"));
	}
	/* */
	private void open() throws IOException {
		BufferedReader cin = new BufferedReader(new InputStreamReader(System.in));
		String local;
		Thread client = new Thread() {
			public void run() {
				boolean stop = false;
				int req;
				try {
					while(!cancel) {
						Socket cs = ss.accept();
						final ObjectOutputStream os = new ObjectOutputStream(cs.getOutputStream());
						final ObjectInputStream is = new ObjectInputStream(cs.getInputStream());
						while(!stop) {
							String cmd = is.readUTF();
							switch(cmd) {
							case "estado":
								os.writeInt(stock);
								break;
							case "salida":
								req = is.readInt();
								os.writeInt(changeStock(-req));
								break;
							case "cerrar":
								stop = true;
								os.writeInt(0);
								cs.close();
								break;
							default:
								os.writeInt(-1);
							}
						}
					}
				} catch(IOException ex) {
					if(!cancel) {
						Logger.getLogger(ServerAlmacen.class.getName()).log(Level.SEVERE, null, ex);
					}
				}
			}
		};
 
		System.out.println("Server accepting requests on port 9090");
		client.start();
		while(!cancel) {
			local = cin.readLine();
			switch(local) {
			case "estado":
				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 changeStock(int amount) {
		if((stock + amount) < 0) {
			return -1;
		}
		stock += amount;
		return stock;
	}
	/* */
	public static void main(String args[]) throws IOException {
		new ServerAlmacen(123).open();
	}
}
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