Я делаю многопоточный чат с сокетами в 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
, но отправляется ноль. Если есть другой способ получить значение, пожалуйста, дайте мне знать, спасибо заранее.