利用socket打造一个聊天室

下面是一个简单的JavaFX聊天应用程序的实现。

  1. 创建项目并添加依赖

首先创建一个新的JavaFX项目。在pom.xml文件中添加以下依赖项:

<dependencies><dependency><groupId>org.openjfx</groupId><artifactId>javafx-controls</artifactId><version>16</version></dependency><dependency><groupId>org.openjfx</groupId><artifactId>javafx-fxml</artifactId><version>16</version></dependency><dependency><groupId>org.ow2.asm</groupId><artifactId>asm</artifactId><version>9.1</version></dependency>
</dependencies>

  1. 创建UI

创建UI需要两个窗口。一个是主聊天窗口,另一个是登录窗口。在/src/main/resources目录下创建两个FXML文件,分别命名为Chat.fxml和Login.fxml。

Chat.fxml:

<?xml version="1.0" encoding="UTF-8"?><?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<?import javafx.geometry.Insets?>
<?import javafx.scene.text.Text?><VBox spacing="10.0" xmlns="http://javafx.com/javafx/16" xmlns:fx="http://javafx.com/fxml/1"><Text fx:id="title" text="Chat" style="-fx-font-size: 36; -fx-font-weight: bold" /><ListView fx:id="listView" style="-fx-font-size: 16" /><HBox spacing="10.0"><TextField fx:id="messageInput" promptText="Type Message Here" style="-fx-font-size: 16" /><Button fx:id="sendButton" text="Send" style="-fx-font-size: 16; -fx-background-color: #009688; -fx-text-fill: white" /></HBox>
</VBox>

Login.fxml:

<?xml version="1.0" encoding="UTF-8"?><?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<?import javafx.geometry.Insets?>
<?import javafx.scene.text.Text?><VBox spacing="10.0" xmlns="http://javafx.com/javafx/16" xmlns:fx="http://javafx.com/fxml/1"><Text fx:id="title" text="Login" style="-fx-font-size: 36; -fx-font-weight: bold" /><TextField fx:id="usernameInput" promptText="Username" style="-fx-font-size: 16" /><HBox spacing="10.0"><PasswordField fx:id="passwordInput" promptText="Password" style="-fx-font-size: 16" /><Button fx:id="loginButton" text="Login" style="-fx-font-size: 16; -fx-background-color: #009688; -fx-text-fill: white" /></HBox><Text fx:id="loginError" text="" style="-fx-font-size: 16; -fx-text-fill: red" />
</VBox>

  1. 创建Controller

在/src/main/java目录下创建两个Controller类,ChatController和LoginController,分别对应Chat.fxml和Login.fxml。

ChatController:

public class ChatController implements Initializable {@FXMLprivate Text title;@FXMLprivate ListView<String> listView;@FXMLprivate TextField messageInput;@FXMLprivate Button sendButton;private String username;private Socket socket;private DataOutputStream outputStream;private DataInputStream inputStream;public void setUsername(String username) {this.username = username;title.setText("Chat - " + username);}public void initialize(URL location, ResourceBundle resources) {try {socket = new Socket("localhost", 8000);outputStream = new DataOutputStream(socket.getOutputStream());inputStream = new DataInputStream(socket.getInputStream());new Thread(() -> {while (true) {try {String message = inputStream.readUTF();Platform.runLater(() -> listView.getItems().add(message));} catch (IOException e) {e.printStackTrace();}}}).start();sendButton.setOnAction(event -> {try {String message = username + ": " + messageInput.getText();outputStream.writeUTF(message);outputStream.flush();listView.getItems().add(message);messageInput.setText("");} catch (IOException e) {e.printStackTrace();}});} catch (IOException e) {e.printStackTrace();}}public void disconnect() {try {socket.close();outputStream.close();inputStream.close();} catch (IOException e) {e.printStackTrace();}}}

LoginController:

public class LoginController {@FXMLprivate Text title;@FXMLprivate TextField usernameInput;@FXMLprivate PasswordField passwordInput;@FXMLprivate Button loginButton;@FXMLprivate Text loginError;private ChatController chatController;public void setChatController(ChatController chatController) {this.chatController = chatController;}public void initialize() {loginButton.setOnAction(event -> {String username = usernameInput.getText();String password = passwordInput.getText();if (authenticate(username, password)) {chatController.setUsername(username);showChat();} else {loginError.setText("Invalid username or password.");}});}private boolean authenticate(String username, String password) {// Authenticate username and password}private void showChat() {try {FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("/Chat.fxml"));Parent root = fxmlLoader.load();ChatController controller = fxmlLoader.getController();controller.setUsername(usernameInput.getText());Scene scene = new Scene(root);Stage stage = (Stage) loginButton.getScene().getWindow();stage.setScene(scene);stage.show();stage.setOnCloseRequest(event -> {controller.disconnect();});} catch (IOException e) {e.printStackTrace();}}}

  1. 运行应用程序

在主函数中启动应用程序。首先打开登录窗口,然后在登录成功后打开聊天窗口。

public class ChatApplication extends Application {public void start(Stage primaryStage) throws Exception {FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("/Login.fxml"));Parent root = fxmlLoader.load();LoginController controller = fxmlLoader.getController();ChatController chatController = new ChatController();controller.setChatController(chatController);Scene scene = new Scene(root);primaryStage.setScene(scene);primaryStage.show();}public static void main(String[] args) {launch(args);}}

现在应用程序已经完成了!运行ChatApplication类,然后在登录窗口中输入用户名和密码,就可以进入聊天窗口了。在聊天窗口中,输入消息并按下“发送”按钮,其他人将能够看到您的消息。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/239105.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据结构 / 队列 / 循环队列 / 概念

1. 定义 为充分利用向量空间&#xff0c;克服假溢出现象的方法是&#xff1a;将向量空间想象为一个首尾相接的圆环&#xff0c;并称这种向量为循环向量。存储在其中的队列称为循环队列&#xff08;Circular Queue&#xff09;。循环队列是把顺序队列首尾相连&#xff0c;把存储…

如何使用 NFTScan NFT API 在 Starknet 网络上开发 Web3 应用

Starknet 是由以色列软件公司 StarkWare 开发的免许可的第 2 层网络。Starknet 作为以太坊上的 ZK Rollup 运行&#xff0c;帮助 dApp 使用 STARK 证明以更低的交易成本实现更大的计算规模。该网络允许智能合约与区块链上部署的其他合约进行交互&#xff0c;从而提高协议之间的…

JNPF低代码平台详解 -- 系统架构

目录 一、技术介绍 技术架构 二、设计原理 三、界面展示 1.代码生成器 2.工作流程 3.门户设计 4.大屏设计 5.报表设计 6.第三方登录 7.多租户实现 8.分布式调度 9.消息中心 四、功能框架 JNPF低代码是一款新奇、实用、高效的企业级软件开发工具&#xff0c;支持企…

【Vue3+Ts项目】硅谷甄选 — 搭建后台管理系统模板

一、 项目初始化 一个项目要有统一的规范&#xff0c;需要使用eslintstylelintprettier来对我们的代码质量做检测和修复&#xff0c;需要使用husky来做commit拦截&#xff0c;需要使用commitlint来统一提交规范&#xff08;即统一提交信息&#xff09;&#xff0c;需要使用pre…

centos7 yum安装jdk1.8

1.列出可安装版本 yum -y list java* 2.安装 yum -y install java-1.8.0-openjdk* 3.检查命令 java -version javac java

新疆大学与优艾智合机器人成立联合创新实验室

11月22日至24日&#xff0c;第五届中国工业互联网大赛新疆赛站决赛在新疆维吾尔自治区昌吉回族自治州昌吉市举行。在大赛中崭露头角的优秀解决方案&#xff0c;将为绿色工厂、绿色园区、绿色供应链等建设提供新的动能&#xff0c;促进工业绿色发展。 作为大赛的成果延伸&#…

熬夜会秃头——beta冲刺Day3

这个作业属于哪个课程2301-计算机学院-软件工程社区-CSDN社区云这个作业要求在哪里团队作业—beta冲刺事后诸葛亮-CSDN社区这个作业的目标记录beta冲刺Day3团队名称熬夜会秃头团队置顶集合随笔链接熬夜会秃头——Beta冲刺置顶随笔-CSDN社区 目录 一、团队成员会议总结 1、成员…

MySQL 教程 1.4

MySQL 连接 使用mysql二进制方式连接 您可以使用MySQL二进制方式进入到mysql命令提示符下来连接MySQL数据库。 实例 以下是从命令行中连接mysql服务器的简单实例&#xff1a; [roothost]# mysql -u root -p Enter password:****** 在登录成功后会出现 mysql> 命令提示窗…

线性回归既是一种数据挖掘与建模算法,也是统计学领域、计量经济学领域的常用学术建模方法,有何不同?

一.线性回归的基本形式 线性回归既是一种数据挖掘与建模算法&#xff0c;也是统计学领域、计量经济学领域的常用学术建模方法。在数据挖掘与建模领域&#xff0c;线性回归算法是一种较为基础的机器学习算法&#xff0c;其基本思想是将响应变量&#xff08;因变量、被解释变量&…

【Node.js】笔记梳理 8 - API和JWT

写在最前&#xff1a;跟着视频学习只是为了在新手期快速入门。想要学习全面、进阶的知识&#xff0c;需要格外注重实战和官方技术文档&#xff0c;文档建议作为手册使用 系列文章 【Node.js】笔记整理 1 - 基础知识【Node.js】笔记整理 2 - 常用模块【Node.js】笔记整理 3 - n…

浅析SD-WAN企业组网部署中简化网络运维的关键技术

网络已经成为现代企业不可或缺的基础设施&#xff0c;它为企业提供了连接全球的桥梁。随着全球化和数字化转型的加速推进&#xff0c;企业面临着越来越多的网络挑战和压力。传统的网络组网方式往往无法满足企业规模扩大、分支机构增多、上云服务等需求&#xff0c;导致网络性能…

Windows11系统下内存占用率过高如何下降

. # &#x1f4d1;前言 本文主要是win11系统下CPU占用率过高如何下降的文章&#xff0c;如果有什么需要改进的地方还请大佬指出⛺️ &#x1f3ac;作者简介&#xff1a;大家好&#xff0c;我是青衿&#x1f947; ☁️博客首页&#xff1a;CSDN主页放风讲故事 &#x1f304;每日…