Java 更改客户机-服务器应用程序中圆圈的颜色

Java 更改客户机-服务器应用程序中圆圈的颜色,java,multithreading,sockets,javafx,server,Java,Multithreading,Sockets,Javafx,Server,我目前在使用套接字编程客户机服务器时遇到一些问题,我希望同时连接多个客户机。 问题是,我有一个客户端GUI,每当服务器发送信号时,我都想更改圆圈的颜色 我正在客户端窗口中使用JavaFX 我遇到的问题是,服务器通过连接运行(使用线程),并在完成后对循环进行所有更改,而我希望它是动态完成的 这是我的clientserver线程代码。它将参数发送到客户端拾取的插座,并相应地显示颜色,然后在更改另一个圆圈的颜色之前睡眠一段固定时间。我还有一个服务器类,它使用给定的端口号启动服务器,并持续侦听客户端

我目前在使用套接字编程客户机服务器时遇到一些问题,我希望同时连接多个客户机。 问题是,我有一个客户端GUI,每当服务器发送信号时,我都想更改圆圈的颜色

我正在客户端窗口中使用JavaFX

我遇到的问题是,服务器通过连接运行(使用线程),并在完成后对循环进行所有更改,而我希望它是动态完成的

这是我的clientserver线程代码。它将参数发送到客户端拾取的插座,并相应地显示颜色,然后在更改另一个圆圈的颜色之前睡眠一段固定时间。我还有一个服务器类,它使用给定的端口号启动服务器,并持续侦听客户端

 class ClientServer extends Thread
{
Socket connectSocket;
InetAddress clientAddr;
String parametersFromClient;
char[] params;


public ClientServer(Socket connectSocket)
{
    this.connectSocket = connectSocket;
    clientAddr = connectSocket.getInetAddress();
}

public void run()
{
    try (

           //writer to the connection socket
            PrintWriter output = new PrintWriter(connectSocket.getOutputStream(), true);

            // Stream reader from the connection socket
            BufferedReader input = new BufferedReader(new InputStreamReader(connectSocket.getInputStream()));
    )
    {
          int[] lights = MultipleClientsServer.lightvalues;
        while (((parametersFromClient = input.readLine()) != null) ) //FIKS!!!
        {
            if(parametersFromClient.equals("connect"))
            {
            System.out.println(parametersFromClient);
            output.println("red");
            try {TimeUnit.SECONDS.sleep(lights[0]);} catch (InterruptedException e) {}

            output.println("yellow");
            try {TimeUnit.SECONDS.sleep(lights[1]);} catch (InterruptedException e) {}

            output.println("green");
            try {TimeUnit.SECONDS.sleep(lights[2]);} catch (InterruptedException e) {}

            output.println("");
            }
        } 

        System.out.println(MultipleClientsServer.IPList.toString());
        MultipleClientsServer.removeFromList(clientAddr.toString());
        // close the connection socket
        connectSocket.close();
        //søke etter inetadress i linkedlist for å fjerne
        System.out.println(MultipleClientsServer.IPList.toString());


    } catch (IOException e)
    {
        System.out.println("Exception occurred when trying to communicate with the client " + clientAddr.getHostAddress());
        System.out.println(e.getMessage());
    }
}
在我的客户机代码中,我有一个连接方法,每当我按下一个按钮时,它就会启动:(红色、黄色和绿色是我想要更改颜色的圆圈。)

问题是,客户机打印出从服务器接收的参数,然后休眠一段固定的时间,但直到最后,它才改变圆圈的颜色,而且所有这些都是同时进行的


有人能解决这个问题吗?非常感谢。

在后台线程中运行
clientStart
方法,并在
平台中包装更改UI的调用。稍后运行(…)

然后需要调用
clientStart()
,方法如下:

Task<Socket> clientStartTask = new Task<Socket>() {
    @Override
    public Socket call() {
        return clientStart();
    }
});

clientStartTask.setOnSucceeded(e -> {
    Socket socket = clientStartTask.getValue();
    // do whatever you need with socket here...
});

Thread thread = new Thread(clientStartTask);
thread.setDaemon(true);
thread.start();
Task clientStartTask=新任务(){
@凌驾
公共套接字调用(){
返回clientStart();
}
});
clientStartTask.setOnSucceeded(e->{
Socket-Socket=clientStartTask.getValue();
//用这里的插座做任何你需要的。。。
});
线程线程=新线程(clientStartTask);
setDaemon(true);
thread.start();

我不理解这个问题,但看起来您希望在运行背景线程时更新某个圆圈上的颜色。您可以直接将
setColor()
包装在内部,也可以使用.Hi。是的,这就是我想要达到的目标。我将如何使用Platform.runLater()实现它?您应该了解一下,我认为其中的一些问题是线程在服务器端,而JavaFX应用程序在客户端。然后在哪里使用platform.runLater()?因为当fx应用程序从服务器接收到一些字符串时,它应该更新颜色。我不确定我在这里是否说得很清楚,对此表示抱歉……@ItachiUchiha不知道如果我不使用您的用户名,您是否会收到通知……非常感谢您的建议,但我不确定最后一段代码应该如何实现。。。我应该把代码放在哪里?我在按下connect按钮时启动clientStart()-方法。我会把密码放在那里吗?抱歉,我不清楚……您当前在哪里调用
clientStart()
?因为我发布的代码导致该方法被执行,所以这看起来是显而易见的地方。。。所以,是的,你应该在你的连接按钮处理程序中这样做。它成功了!天哪,你刚刚救了我的命。非常感谢你!
while((s = in.readLine()) != null && !s.isEmpty()) {
    final String line = s ;
    Platform.runLater(() -> {
         switch (line)
         {
             case "red":
                 //set circle to red.
                 red.setFill(Paint.valueOf("#ff1f1f"));
                 System.out.println("red");
                 break;
             case "yellow":
                 //set circle to yellow
                 yellow.setFill(Paint.valueOf("#36bc0d"));
                 System.out.println("yellow");
                 break;
             case "green":
                 //set circle to green
                 green.setFill(Paint.valueOf("#bdff1f"));
                 System.out.println("green");
                 break;
             default:
                 break;
         }
    });
}
Task<Socket> clientStartTask = new Task<Socket>() {
    @Override
    public Socket call() {
        return clientStart();
    }
});

clientStartTask.setOnSucceeded(e -> {
    Socket socket = clientStartTask.getValue();
    // do whatever you need with socket here...
});

Thread thread = new Thread(clientStartTask);
thread.setDaemon(true);
thread.start();