Я собрал класс клиентского приложения, которое должно подключаться к сокету, и оно должно автоматически получать DefaultTreeModel
с сервера или простой объект String в качестве теста. Проблема в том, что внутри основного RemoteNetworking
класса DefaultTreeModel
или String успешно получены, но если я пытаюсь получить их, используя getClientTreeModel()
или verifiFromOutside
, я получаю только нулевые объекты. Можете ли вы помочь мне понять это поведение? Я поставлю код ниже.
package Networking;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.net.SocketAddress;
import java.net.UnknownHostException;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeModel;
public class RemoteNetworking extends Thread{
private volatile Socket remoteSocket;
private volatile boolean isRunning = true;
private Thread currentThread;
private volatile ObjectOutputStream oos;
private volatile ObjectInputStream ois;
private volatile DefaultTreeModel treeModel = null;
private String IP;
private int port;
private static volatile String test;
public RemoteNetworking(String IP, int port) {
this.IP = IP;
this.port = port;
}
public void connect() {
try {
SocketAddress socketAddress = new InetSocketAddress(IP, port);
remoteSocket = new Socket();
remoteSocket.connect(socketAddress);
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
private synchronized void setReceivedTreeModel(DefaultTreeModel receivedTreeModel) {
this.treeModel = receivedTreeModel;
}
public synchronized void disconnect() {
try {
//oos.writeObject("Disconnect");
oos.flush();
//oos.close();
isRunning = false;
remoteSocket.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public synchronized DefaultTreeModel getClientTreeModel() {
return treeModel;
}
public synchronized void verifyFromOutside() {
System.out.println(test);
}
@Override
public void run() {
connect();
synchronized(this) {
this.currentThread = Thread.currentThread();
}
try {
ois = new ObjectInputStream(remoteSocket.getInputStream());
oos = new ObjectOutputStream(remoteSocket.getOutputStream());
oos.writeObject("DataTree");
oos.flush();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
while(isRunning) {
try {
Object object = (Object)ois.readObject();
/*if(object instanceof DefaultTreeModel) {
//this received object is not null
setReceivedTreeModel((DefaultTreeModel)object);
if(treeModel==null) {
System.out.println("Null object in RemoteNetworking");
}
verifyFromOutside();
}*/
if(object instanceof String) {
this.test = (String)object;
System.out.println(test);
}
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}