Проблема с sockets клиент / сервер используя переключатель

У меня есть проблема с этой программой java. Программу основывает в sockets клиент / сервер, функция состоит в том, чтобы использовать такой arraylist как база данных, которая находится в сервере и каждом клиенте, может действовать одновременно с сервером.

Программа функционирует правильно, у нее есть меню с переключателем для того, чтобы клиент смог выбирать между несколькими выборами, проблема состоит, в том, что использовав выбор, выходить производит мне ошибку, хотя оно также функционирует и клиент разъединяется сервера.

Я оставляю здесь код классов, если кто-то может помогать.

HiloParaAntenderUnCliente

package servidor;

import java.io.*;
import java.net.Inet4Address;
import java.net.Socket;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.logging.Level;
import java.util.logging.Logger;

public class HiloParaAntenderUnCliente extends Thread{
        ArrayList<Productos> productos = new ArrayList<Productos>();
    Iterator<Productos> lista= null;
    Socket sk;
    public HiloParaAntenderUnCliente(Socket sk){
        this.sk = sk;
    }

    @Override
    public void run() {
        InputStream is = null;
        OutputStream os = null;
        try {
            is = sk.getInputStream();
            InputStreamReader isr = new InputStreamReader(is);
            BufferedReader br = new BufferedReader(isr);

            os = sk.getOutputStream();
            OutputStreamWriter osw = new OutputStreamWriter(os);
            BufferedWriter bw = new BufferedWriter(osw);

            Inet4Address ip = (Inet4Address) sk.getInetAddress();
            String laIP = ip.getHostAddress();
            System.out.println(laIP+": se ha conectado.");

            while(true){    
            bw.write("1. Consultar\n2. Crear\n3. Borrar\n4. Aumentar/Disminuir Stock\n5. Salir");
            bw.newLine();
            int option;
            String linea;   
            do{
               bw.write("---");
               bw.newLine();
               bw.flush();
               linea = br.readLine();
               option = Integer.parseInt(linea);
                   if(option<1 || option>5){
                   bw.write("Elige una opcion correcta."); 
                   bw.newLine();
                   bw.flush();
               }
            }while(option<1 || option>5);

            switch(option) {

            case 1:
                if(productos.isEmpty()) {
                    bw.write("No hay productos en la lista.");
                    bw.newLine();
                    bw.flush();
                    continue;
                }
                bw.write("Lista de productos: ");
                bw.newLine();
                lista = productos.iterator();
                while(lista.hasNext()) {
                    Productos p = lista.next();
                    bw.write("Producto: "+p.getNombre()+" --- Stock: "+p.getStock());
                    bw.newLine();
                }
                bw.flush();
                break;


            case 2:
                bw.write("Indique el nombre del producto para dar de alta: ");
                bw.newLine();
                bw.write("---");
                bw.newLine();
                bw.flush();

                String nombre = br.readLine();


                bw.write("Indique el stock del producto para dar de alta: ");
                bw.newLine();
                bw.write("---");
                bw.newLine();

                bw.flush();
                String stock = br.readLine();

                int stock2 = Integer.parseInt(stock);
                productos.add(new Productos(nombre,stock2));
                lista = productos.iterator();
                while(lista.hasNext()) {
                    Productos p = lista.next();
                    bw.write("Producto: "+p.getNombre()+" --- Stock: "+p.getStock());
                    bw.newLine();
                }
                 bw.flush();
                break;


            case 3:
                if(productos.isEmpty()) {
                    bw.write("No hay productos en la lista.");
                    bw.newLine();
                    bw.flush();
                    continue;
                }
                bw.write("Indique el nombre del producto para dar de baja: ");
                bw.newLine();
                bw.write("---");
                bw.newLine();
                bw.flush();
                String n = br.readLine();

                lista = productos.iterator();
                while(lista.hasNext()) {                
                    Productos p = lista.next();
                    if(n.equals(p.getNombre())) {
                        lista.remove();
                    }
                }
                lista = productos.iterator();
                while(lista.hasNext()) {
                    Productos p = lista.next();
                    bw.write("Producto: "+p.getNombre()+" --- Stock: "+p.getStock());
                    bw.newLine();
                }
                bw.flush();
                break;

            case 4:
            bw.write("1. Aumentar Stock\n2. Disminuir Stock\n3. Volver atras");
            bw.newLine();
            int option2;
            String linea2;
            do{
               bw.write("---");
               bw.newLine();
               bw.flush();
               linea2 = br.readLine();
               option2 = Integer.parseInt(linea2);
               if(option2<1 || option2>3){
                   bw.write("Elige una opcion correcta."); 
                   bw.newLine();
                   bw.flush();
               }
            }while(option2<1 || option2>3);
                switch(option2){

                    case 1:
                        if(productos.isEmpty()) {
                            bw.write("No hay productos en la lista.");
                            bw.newLine();
                            bw.flush();
                            continue;
                        }
                        bw.write("Escribe el nombre del producto para aumentar el stock.");
                        bw.newLine();
                        bw.write("---");
                        bw.newLine();
                        bw.flush();
                        String ni = br.readLine();
                        lista=productos.iterator();
                        while(lista.hasNext()) {
                            Productos p = lista.next();
                            if(ni.equals(p.getNombre())) {
                                p.setStock(p.getStock()+1);
                            }
                        }
                        lista = productos.iterator();
                        while(lista.hasNext()) {
                            Productos p = lista.next();
                            bw.write("Producto: "+p.getNombre()+" --- Stock: "+p.getStock());
                            bw.newLine();
                        }
                        bw.flush();
                        continue;

                    case 2:
                        if(productos.isEmpty()) {
                            bw.write("No hay productos en la lista.");
                            bw.newLine();
                            bw.flush();
                            continue;
                        }
                        bw.write("Escribe el nombre del producto para disminuir el stock.");
                        bw.newLine();
                        bw.write("---");
                        bw.newLine();
                        bw.flush();
                String no = br.readLine();
                lista=productos.iterator();
                while(lista.hasNext()) {
                            Productos p = lista.next();
                            if(no.equals(p.getNombre())) {
                            p.setStock(p.getStock()-1);
                            }
                }
                lista = productos.iterator();
                while(lista.hasNext()) {
                            Productos p = lista.next();
                            bw.write("Producto: "+p.getNombre()+" --- Stock: "+p.getStock());
                            bw.newLine();
                        }
                        bw.flush();
                        continue;

                    case 3:
                        continue;
            }

            case 5:
                System.out.println(laIP+": se ha desconectado.");
                bw.write("Desconectado.");
                bw.newLine();
                bw.flush();
            }
        }          
        } catch (IOException ex) {
            Logger.getLogger(HiloParaAntenderUnCliente.class.getName()).log(Level.SEVERE, null, ex);
        } finally {
            try {
                if(is != null) is.close();
            } catch (IOException ex) {
                Logger.getLogger(HiloParaAntenderUnCliente.class.getName()).log(Level.SEVERE, null, ex);
            }
        }        
    }
}

Клиент

package cliente;

import java.io.*;
import java.net.Socket;
import java.util.Scanner;
import java.util.logging.Level;
import java.util.logging.Logger;

public class Cliente {
    final static int PORT = 40080;
    final static String HOST = "127.0.0.1";

    public static void main(String[] args) {
        try {
            Socket sk = new Socket(HOST, PORT);

            enviarMensajesAlServidor(sk);
        } catch (IOException ex) {
            Logger.getLogger(Cliente.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    private static void enviarMensajesAlServidor(Socket sk) {
        OutputStream os = null;
        InputStream is = null;
        try {
            os = sk.getOutputStream();
            OutputStreamWriter osw = new OutputStreamWriter(os);
            BufferedWriter bw = new BufferedWriter(osw);

            is = sk.getInputStream();
            InputStreamReader isr = new InputStreamReader(is);
            BufferedReader br = new BufferedReader(isr);

            Scanner sc = new Scanner(System.in);
            String linea;
            do{
            linea = br.readLine();
            System.out.println(linea);
            if(linea.startsWith("---")){
                linea = sc.nextLine();
                bw.write(linea);
                bw.newLine();
                bw.flush();
            }
       }while(!linea.startsWith("Desconectado."));  
        } catch (IOException ex) {
            Logger.getLogger(Cliente.class.getName()).log(Level.SEVERE, null, ex);
        } finally {
            try {
                if(os != null) os.close();
            } catch (IOException ex) {
                Logger.getLogger(Cliente.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }  
}

Сервер

package servidor;

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.logging.Level;
import java.util.logging.Logger;

public class Servidor {

    public static void main(String[] args) {
        final int PORT = 40080;

        try {
            ServerSocket sk = new ServerSocket(PORT);
            while(true){
                Socket socket = sk.accept();
                HiloParaAntenderUnCliente hilo = new HiloParaAntenderUnCliente(socket);
                hilo.start();
            }
        } catch (IOException ex) {
            Logger.getLogger(Servidor.class.getName()).log(Level.SEVERE, null, ex);
        }
    }   
}

Ошибка, произведенная, выйдя

Exception in thread "Thread-0" java.lang.NumberFormatException: null
    at java.lang.Integer.parseInt(Integer.java:542)
    at java.lang.Integer.parseInt(Integer.java:615)
    at servidor.HiloParaAntenderUnCliente.run(HiloParaAntenderUnCliente.java:46)

Большое спасибо заранее.

0
задан 28.12.2019, 16:13
1 ответ

Когда сервер получает ее opciГіn, 5 посылает сообщение клиенту "Разъединенный" клиенту, но не выходит из главного while, следовательно посылает prompt и ждет одну opciГіn от клиента. Как клиент заканчивает ее conexiГіn. readline сервера ломается, не получая данных следовательно lГ-nea - недействительный и хочет извлечь целое число.

того, что ты должен делать, состоит в том, что, когда сервер получает ma выбор, 5 должен выходить из while co exit, или return помещенный она conversaciГіn с клиентом я заканчиваю и трэд ты должен заканчивать это.

1
ответ дан 29.12.2019, 09:10
  • 1
    Привет хорошие, спасибо за ответ, просвет, поместив exit в opció n 5 все закрывается без проблемы и без ошибок, но случай состоит в том, что класс HiloParaAntenderUnCliente.java позволяет мне присоединять несколько клиентов simultá neamente, следовательно, если я закрываю сервер demá s клиенты, которые были соединены verí an затронутые tambié n. – Riancast 28.12.2019, 22:32