当前位置: 首页 > news >正文

JavaFX、聊天程序

服务器:

package net;

import javafx.application.Application;
import javafx.application.Platform;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.control.ScrollPane;
import javafx.scene.control.TextArea;
import javafx.scene.input.KeyCode;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;

import java.awt.*;
import java.awt.event.KeyEvent;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Date;

public class Exercise31_09Server extends Application {
    private TextArea messageFromClient = new TextArea();    //接受来自客户端的信息
    private TextArea messageToClient = new TextArea();      //发送给客户端信息
    private DataInputStream inputFromClient;                //输入流
    private DataOutputStream outputToClient;                //输出流

    public static void main(String[] args) {
        launch(args);
    }

    @Override
    public void start(Stage primaryStage) {
        //文本区域设置属性
        messageFromClient.setPrefColumnCount(31);
        messageFromClient.setPrefRowCount(6);
        messageFromClient.setEditable(false);
        messageToClient.setPrefColumnCount(31);
        messageToClient.setPrefRowCount(6);

        //文本区域设置键盘按下事件
        messageToClient.setOnKeyPressed(event -> {
            if (event.getCode() == KeyCode.ENTER) {
                try {
                    String text = messageToClient.getSelectedText().trim(); //获取被选文本
                    messageToClient.appendText("");     //
                    outputToClient.writeUTF(text);      //发送信息到客户端
                } catch (IOException ex) {
                    ex.printStackTrace();
                }
            }
        });

        Scene scene = new Scene(new VBox(10,
                getPane("Server", messageToClient), getPane("Client", messageFromClient)));
        primaryStage.setScene(scene);
        primaryStage.setTitle("Exercise31_09Server");
        primaryStage.show();

        //启动线程
        new Thread(this::startServer).start();
    }

    /** 获取面板模板 */
    private BorderPane getPane(String text, TextArea textArea) {
        BorderPane pane = new BorderPane(new ScrollPane(textArea));
        pane.setTop(new Label(text));

        return pane;
    }

    /** 启动服务器 */
    private void startServer() {
        try {
            //创建服务器套接字
            ServerSocket serverSocket = new ServerSocket(8000);
            System.out.println("Server started at " + new Date());

            //创建套接字(连接客户端)
            Socket socket = serverSocket.accept();
            inputFromClient = new DataInputStream(socket.getInputStream());     //输入流
            outputToClient = new DataOutputStream(socket.getOutputStream());

            while (true) {
                String text = inputFromClient.readUTF();    //接收客户端信息
                Platform.runLater(() -> messageFromClient.appendText(text + "\n"));
            }
        } catch (IOException ex) {
            ex.printStackTrace();
        } finally {
            try {       //关闭流
                inputFromClient.close();
                outputToClient.close();
            } catch (IOException ex) {
                ex.printStackTrace();
            }
        }
    }
}

客户端:

package net;

import javafx.application.Application;
import javafx.application.Platform;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.control.ScrollPane;
import javafx.scene.control.TextArea;
import javafx.scene.input.KeyCode;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;

public class Exercise31_09Client extends Application {
    private TextArea messageFromServer = new TextArea();        //接受服务器信息
    private TextArea messageToServer = new TextArea();          //发送信息到服务器
    private DataInputStream inputFromServer;                    //输入流
    private DataOutputStream outputToServer;                    //输出流

    public static void main(String[] args) {
        launch(args);
    }

    @Override
    public void start(Stage primaryStage) {
        //文本区域设置属性
        messageFromServer.setPrefColumnCount(31);
        messageFromServer.setPrefRowCount(6);
        messageFromServer.setEditable(false);
        messageToServer.setPrefColumnCount(31);
        messageToServer.setPrefRowCount(6);

        Scene scene = new Scene(new VBox(10,
                getPane("Server", messageToServer), getPane("Client", messageFromServer)));
        primaryStage.setScene(scene);
        primaryStage.setTitle("Exercise31_09Client");
        primaryStage.show();

        文本区域设置键盘按下事件
        messageToServer.setOnKeyPressed(event -> {
            if (event.getCode() == KeyCode.ENTER) {
                try {
                    String text = messageToServer.getSelectedText().trim(); //获取被选文本
                    messageToServer.appendText("");
                    outputToServer.writeUTF(text);      //发送信息到客户端
                } catch (IOException ex) {
                    ex.printStackTrace();
                }
            }
        });

        new Thread(() -> {
            try {
                //创建客户端套接字、输入输出流
                Socket socket = new Socket("localhost", 8000);
                inputFromServer = new DataInputStream(socket.getInputStream());
                outputToServer = new DataOutputStream(socket.getOutputStream());

                while (true) {
                    String text = inputFromServer.readUTF();    //接收服务器信息
                    Platform.runLater(() -> messageFromServer.appendText(text + "\n"));
                }
            } catch (IOException ex) {
                ex.printStackTrace();
            } finally {
                try {       //关闭流
                    inputFromServer.close();
                    outputToServer.close();
                } catch (IOException ex) {
                    ex.printStackTrace();
                }
            }
        }).start();
    }

    /** 获取面板模板 */
    private BorderPane getPane(String text, TextArea textArea) {
        BorderPane pane = new BorderPane(new ScrollPane(textArea));
        pane.setTop(new Label(text));

        return pane;
    }
}

 

 

相关文章:

  • SVO2.0
  • WebWall-09.Unsafe file uploads(不安全的文件上传)
  • Docker——使用docker工具管理软件/组件的运行,镜像、容器、数据卷的基本概念,常用指令,使用docker搭建Java微服务运行环境
  • HTML5 day_01(8.5)
  • 跑路了,去东北国企干软件测试一个月的感触
  • datawhale8月组队学习《pandas数据处理与分析》(中)(变形、连接、缺失数据)
  • recording:34. 在排序数组中查找元素的第一个和最后一个位置
  • 【论文阅读】Globally Consistent and Tightly Coupled 3D LiDAR Inertial Mapping
  • Java8 特性(二):Optional 相关操作
  • y119.第七章 服务网格与治理-Istio从入门到精通 -- Istio流量治理快速入门(五)
  • 以字符串的形式返回文件名扩展名
  • 机械硬盘数据拷贝
  • 计算机毕业设计java毕设项目之ssm中医药配方小程序
  • 【C++】内存管理 + 初识模板
  • 猿创征文|我的技术成长之路,一名Python学者在CSDN的蜕变
  • [case10]使用RSQL实现端到端的动态查询
  • Android 初级面试者拾遗(前台界面篇)之 Activity 和 Fragment
  • es的写入过程
  • ES学习笔记(12)--Symbol
  • HTTP--网络协议分层,http历史(二)
  • JavaScript 奇技淫巧
  • JavaScript创建对象的四种方式
  • JS+CSS实现数字滚动
  • python学习笔记-类对象的信息
  • Python学习之路13-记分
  • 从 Android Sample ApiDemos 中学习 android.animation API 的用法
  • 搞机器学习要哪些技能
  • 官方新出的 Kotlin 扩展库 KTX,到底帮你干了什么?
  • 检测对象或数组
  • 容器服务kubernetes弹性伸缩高级用法
  • 使用SAX解析XML
  • 吴恩达Deep Learning课程练习题参考答案——R语言版
  • 大数据全解:定义、价值及挑战
  • ​软考-高级-系统架构设计师教程(清华第2版)【第12章 信息系统架构设计理论与实践(P420~465)-思维导图】​
  • !$boo在php中什么意思,php前戏
  • (11)工业界推荐系统-小红书推荐场景及内部实践【粗排三塔模型】
  • (Redis使用系列) Springboot 使用redis实现接口幂等性拦截 十一
  • (二)Linux——Linux常用指令
  • (三)Pytorch快速搭建卷积神经网络模型实现手写数字识别(代码+详细注解)
  • (十八)SpringBoot之发送QQ邮件
  • (学习日记)2024.03.25:UCOSIII第二十二节:系统启动流程详解
  • (转)Android学习系列(31)--App自动化之使用Ant编译项目多渠道打包
  • (转)IOS中获取各种文件的目录路径的方法
  • (转)visual stdio 书签功能介绍
  • (转)清华学霸演讲稿:永远不要说你已经尽力了
  • (转载)虚函数剖析
  • *上位机的定义
  • .NET Core使用NPOI导出复杂,美观的Excel详解
  • .Net IOC框架入门之一 Unity
  • .NET 服务 ServiceController
  • .net 提取注释生成API文档 帮助文档
  • .Net程序帮助文档制作
  • .NET中GET与SET的用法
  • .sys文件乱码_python vscode输出乱码
  • ??在JSP中,java和JavaScript如何交互?