main主程序下,必须先启动serversocket线程,再启动ui线程。
也就是ui 与serversocket 同时运行,他们的数据交换是通过主程序的静态类变量s完成的。
当然,服务器代码简单修改,也可以改为socket线程。
Javafx的编程原则,我理解和实际操作后总结,ui图型的编写和非图型的逻辑编写部份必须分开,ui编写部份不能含有逻辑编写,ui对数据的操作是通过事件的响应来完成的。逻辑编写应在事件的响应处理方法里面完成。
有ui界面的服务端:
import javafx.animation.KeyFrame;
import javafx.animation.Timeline;
import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.layout.HBox;
import javafx.scene.text.Font;
import javafx.scene.text.Text;
import javafx.stage.Stage;
import javafx.util.Duration;
import java.awt.*;
import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class App extends Application {
static String s="no link"; //通过静态s ui与Test3线程交换数据
public void start(Stage primaryStage) throws Exception {
Text text=new Text();
text.setX(50);
text.setY(60);
text.setFont(new Font(40));
Group group=new Group(text);
EventHandler<ActionEvent> eventHandler = e -> {
text.setText(s); //更新text内容
};
//------------这四句非常重要,它的作用是定时更新text内容---------------------------------------
KeyFrame keyFrame=new KeyFrame(Duration.millis(1),eventHandler); //每隔1nm相应一次eventHandler事件
Timeline timeline = new Timeline(keyFrame); //ui定时显示static s的内容。
timeline.setCycleCount(Timeline.INDEFINITE);
timeline.play();
//---------------------------------------------------------------------------------------
Scene scene = new Scene(group, 400, 200);
primaryStage.setScene(scene);
primaryStage.show();
}
public static void main(String[] args) throws InterruptedException, IOException {
ServerSocket serverSocket=new ServerSocket(3000); //启动servsersocket 线程
Thread t = new Test3(serverSocket);
t.start();
System.out.println(1);
launch(args); //启动ui 同时运行的还有serversocket线程
}
}
class Test3 extends Thread{
ServerSocket serverSocket;
public Test3(ServerSocket serverSocket) {
this.serverSocket=serverSocket;
}
public void run() {
try {
Socket socket=serverSocket.accept();
while(true){
InputStream inputStream=socket.getInputStream();
ObjectInputStream objectInputStream=new ObjectInputStream(inputStream);
App.s=objectInputStream.readUTF();
}
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
无ui界面的客户端
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.net.Socket;
public class Khd2{
public static void main(String[] args) throws IOException, InterruptedException {
Socket socket=new Socket("127.0.0.1",3000);
int n=100;
while(true) {
OutputStream outputStream = socket.getOutputStream();
ObjectOutputStream objectOutputStream = new ObjectOutputStream(outputStream);
objectOutputStream.writeUTF(String.valueOf(n));
objectOutputStream.flush();
System.out.println("ok");
Thread.sleep(1000);
n++;
}
}
}