Как я могу получить вектор из потока класса java в другой класс? - PullRequest
0 голосов
/ 17 апреля 2020

Я делаю многопоточный чат с сокетами в java. Я использовал векторы, так как они синхронизированы. Дело в том, что я хочу, чтобы данные, сохраненные вектором nameUser, находившимися в классе ManagementCommunication, в векторе user, расположенном в классе clientGUI. Я сделал getter / setter в классе clientGUI, чтобы ManagementCommunication мог отправить вектор через сеттер. Но когда я делаю ссылку, я получаю значение «внутри» метода установки только в clientGUI. Также, когда я использую геттер, он продолжает посылать 0.

Кроме того, ManagementCommunication и ServerCommunication находятся в одном пакете, но clientGUI нет.

cloneWhatsApp / Classes / ManagementCommunication Class [Он отвечает за инкапсуляцию всех сообщений клиента.]

    public class ManagementCommunication implements Runnable {


    private Socket socket;
    private ArrayList<Socket> UserList;
    private Vector<String> nameUser;
    private Map<String, Socket> map;
    private DataOutputStream sendInfo;
    private DataInputStream getInfo;
    private Gson gson = new Gson();
    private SubjectHelper subjectHelper = new SubjectHelper();
    private boolean flag = true;
    private String receiver; 

   //Empty Constructor
    public ManagementCommunication() {

    }


    /**
     *
     * @param socket
     * @throws IOException
     */

//Its constructor receives from serverCommunication the socket, vector and map.
 public ManagementCommunication(Socket socket, Vector<String> nomeUsuario, Map<String, Socket> map) throws IOException {
        this.socket = socket;
        this.nameUser=nomeUsuario;
        this.map=map;

        //Opening the data streams.
        getInfo = new DataInputStream(this.socket.getInputStream());
        sendInfo = new DataOutputStream(this.socket.getOutputStream());
    }


    /**
     *
     * @throws IOException
     */
    public void getInfo() throws IOException {
        while (socket.isConnected()) {
            //receiving data
            String message = getInfo.readUTF();
            Message m = gson.fromJson(message, Message.class);
            //we get the receiver
            receiver = m.sendTo;   

            String user = m.getUser();
            //
            if(!nameUser.contains(user)){

                 //Add to vector
                nameUser.addElement(m.getUser());
                map.put(m.getUsuario(), socket);
                clientGUI.setUser(nameUser);   //SETTER TO SEND THE VALUE TO CLIENTGUI         
             }           
                //send message to all connected clients 
                ServerCommunication.getInstance().sendMessageUsersConnected(m);

        }
    }

    /**
     *  
     *
     * @param enviadoPor
     * @param mensajes 
     * @throws IOException
     */
    public void sendInfo(String sendBy,String sendTo, String messages) throws IOException {
         Message m = new Message(sendBy, sendTo, messages, new Date());
        sendInfo.writeUTF(gson.toJson(m));
        sendInfo.flush();
    }

    @Override
    public void run() {
        try {
            getInfo();
        } catch (EOFException ex) { 
            subjectHelper.notify(ManagementCommunication.class, "Disconnecting", TipoNotificacion.DESCONEXION);
        } catch (IOException ex) {
            Logger.getLogger(ManagementCommunication.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

cloneWhatsApp / Classes / ServerCommunication class

public class ServerCommunication implements Runnable {

    private static ServerCommunication instance;
    private ServerSocket server;
    private List<ManagementCommunication> ManagementCommunicationList = new ArrayList<>();
    private boolean running;
    private SubjectHelper subjectHelper = new SubjectHelper();
    public static Map<String, Socket> map = null;
    public static Vector<String> nameUser = null;    // thread security

    private ServerCommunication() {
    }

    /**
     * @return
     */
    public static ServerCommunication getInstance() {
        if (instance == null) {
            instance = new ServerCommunication();
        }
        return instance;
    }

    /**
     * @param port
     * @throws Exception
     */
    public void startServer(int port) throws Exception {
        //initializing
        nameUser = new Vector<String>();     
        map = new HashMap<String, Socket>();
        // 
        server = new ServerSocket(port); 
        running = true;
        new Thread(this).start();
    }

    /**
     *
     */
    public void stopServer() { 
        running = false;
        try {
            server.close();
            server = null;
            ManagementCommunicationList.clear();
            subjectHelper.removeAllObserver();
        } catch (IOException ex) {
            Logger.getLogger(ServerCommunication.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public void sendMessageUsersConnected(Message message) {
        if(message.getMessage().equals("")){
            return;
        }
        for (ManagementCommunication m : ManagementCommunicationList) {
            try {
                m.sendInfo(message.getUser(), message.getsendTo(), message.getMessage());
            } catch (IOException ex) {
                Logger.getLogger(ServerCommunication.class.getName()).log(Level.SEVERE, null, ex);
            }
        }

    }


    @Override
    public void run() {
        while(running){
            try {

                //Opening socket.
                Socket s = server.accept(); 
                //
                subjectHelper.notify(ServerSocket.class, "nueva conexion", TipoNotificacion.CONEXION);

                //send to constructor 
                ManagementCommunication m = new ManagementCommunication(s,nameUser, map);
                //
                m.addObservadorListener((Class clase, Object argumento, Enum anEnum) -> {
                    subjectHelper.notify(clase, argumento, anEnum);
                });
                //Add object to list
                ManagementCommunicationList.add(m);   

                //starting thread
                new Thread(m).start();
            } catch (IOException ex) {
                Logger.getLogger(ServerCommunication.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }

cloneWhatsApp / Клиент GUI Класс

    public class clientGUI extends javax.swing.JDialog {


    private Vector<String> user = new Vector<>();
    private DataOutputStream dout;
    private DataInputStream din;
    private Gson gson;
    private clientSignInGUI referenceClientSignInGUI; 
    private SubjectHelper subjectHelper = new SubjectHelper();
    boolean flag = true;
    public static String receiver = "";
    List<String> usuarios = new ArrayList<>();
    DefaultListModel listModel;



    public clientGUI(java.awt.Frame parent, boolean modal) {
        super(parent, modal);
        initComponents();
        init();
    }    

    private clientGUI() {  
    }

     public void init(){

         //Add model
         listModel = new DefaultListModel();
         list.setModel(listModel);
         list.setCellRenderer(new listUser());  //listUser is a class with a ListRenderer.

         }

         //HERE ITS WHERE I WANT TO PRINT THE VALUES
         ActionListener a1 = new ActionListener(){
             @Override
             public void actionPerformed(ActionEvent e) {
                 if(e.getSource()== btnChat){
                      for(int i = 0; i<getUser().size();i++){
                    //IT PRINTS 0
                    System.out.println(getUser().get(i));
        }
                 }
             }

        };

         btnChat.addActionListener(a1);

        //
        name.setText(""+referenceClientSignInGUI.username);

        //starts client connection
        gson = new Gson();
        try {
            conect();
        } catch (IOException ex) {
            Logger.getLogger(clientGUI.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    private void conect() throws IOException
    {

        din = new DataInputStream(referenceClientSignInGUI.socket.getInputStream());
        dout = new DataOutputStream(referenceClientSignInGUI.socket.getOutputStream());


                new Thread(() -> {
            try {
                sendMessage();
                getInfo();
            } catch (IOException ex) {
                Logger.getLogger(clientGUI.class.getName()).log(Level.SEVERE, null, ex);
            }
        }).start();
    }

    //Get vector 
    public static Vector<String> getUser() {
        System.out.println("value: "+user.size()); // Prints 0
        return user;
    }

    //Set vector
    public static void setUser(Vector<String> us) {
        clientGUI.user = us;
        //HERE IT PRINTS THE CORRECT VALUE BECAUSE I USE "us", using "user" it prints 0.
        System.out.println("UserList size: "+us.size()); 
    }

    private void getInfo() throws IOException {
        while (true) {
            String info = din.readUTF(); //Reads what the server is sending
            Message m = gson.fromJson(info, Message.class);  
           showMessagesReceived(m); //prints to client

        }
    }

 //Method reference to class clientSignInGUI
    public void getInfo(clientSignInGUI tae) {
        this.referenceClientSignInGUI = tae;
    } 

//Send messages to clients
   private void showMessagesReceived(Mensaje m) {
        displayMessage.append(String.format("[%s]: %s", m.getUser(), m.getMessage())+"\n");
    }

private void sendMessage() throws IOException {

           if(flag){
            flag = false;  
            Message m =new Message(referenceClientSignInGUI.username, receiver, txtMessage.getText(), new Date());
            dout.writeUTF(gson.toJson(m));
            dout.flush();
                }else{ 
                Message m =new Message(referenceClientSignInGUI.username, receptor, txtMessage.getText(), new Date());
                dout.writeUTF(gson.toJson(m));
                dout.flush();
                txtMessage.setText("");
                }
    }

     public static String getReceiver() {
        return receiver;
    }
      public static void setReceiver(String receiver) {
        clientGUI.receiver = receiver;
    }
}

Обычно при нажатии btnChat отображается обновленный вектор user, но отправляется ноль. Если есть другой способ получить значение, пожалуйста, дайте мне знать, спасибо заранее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...