javafx UI图形界面下同时启动serversocket线程

 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++;
        }
    }
}

 

 

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值