将列表与多线程javafx应用程序中的其他组件绑定的最佳方法

时间:2019-07-15 10:44:45

标签: java multithreading javafx fxml

我正在创建应用程序以通过LAN制作屏幕截图。服务器是 倾听客户的声音。客户端连接后,将创建新线程并将其添加到列表中。服务器上的管理员可以从列表中选择客户端,在其计算机上制作屏幕截图,并将屏幕截图发送到服务器。问题是清单。如何使此列表在应用程序的许多地方可用,并且始终与使用它的所有组件保持同步?

我正在使用JavaFX。我读了有关SimpleListProperty的文章,但问题是“如何在服务器线程中使用此实例?”。我已经尝试过单调变化,像Guice,Ignite,Spring这样的依赖注入,但是它产生了很多麻烦,最后还是行不通:(

服务器实现

    public class SocketServer extends Thread {
private ServerSocket serverSocket;

@Override
public void run() {
    startServer();
}

private void startServer() {
    try {
        serverSocket = new ServerSocket(2345);

    } catch (IOException e) {
        e.printStackTrace();
    }

    while (true) {
        try {
            new EchoClientHandler(serverSocket.accept()).run();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

public void stopServer() {
    try {
        serverSocket.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

public class EchoClientHandler extends Thread {
    private Socket clientSocket;
    private PrintWriter out;
    private BufferedReader in;

    public EchoClientHandler(Socket socket) {
        this.clientSocket = socket;
    }

    @Override
    public void run() {
        try {
            out = new PrintWriter(clientSocket.getOutputStream(), true);
            in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
        } catch (IOException e) {
            e.printStackTrace();
        }
   //there shoud be somethink like:
   // list.add(this);
    }

    public void close() {
        try {
            in.close();
            out.close();
            clientSocket.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

   //Getters and setters

MainController

public class MainController {

@FXML
private LogPaneController logPaneController;

@FXML
private ConnectionPaneController connectionPaneController;

@FXML
private ButtonsPaneController buttonsPaneController;

private Connector connectorImpl;

public void initialize() {
    createConnector();
}

private void createConnector() {
    ObservableList<Client> observableList = connectionPaneController.getConnectedClientsTable().getItems();
    connectorImpl.setClientSimpleListProperty(observableList);
}

连接器

public class ConnectorImpl implements Connector {
private List<SocketServer.EchoClientHandler> clientsThreads;
private SimpleListProperty<Client> clientSimpleListProperty;

public ConnectorImpl() {
}

public static Client parseThreadToClient(SocketServer.EchoClientHandler clientThread) {
    Socket socket = clientThread.getClientSocket();
    PrintWriter out = clientThread.getOut();
    BufferedReader in = clientThread.getIn();
    return new Client(socket, out, in);
}


@Override
public void connectNewClient(SocketServer.EchoClientHandler clientThread) {
    clientsThreads.add(clientThread);
    clientSimpleListProperty.add(parseThreadToClient(clientThread));
}
//Getters and setters

}

应用视图 app view

0 个答案:

没有答案