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

Java知识体系及聊天室程序

Java知识体系结构梳理如下:

  1. 基础语法:Java的基本语法,包括数据类型、运算符、控制语句、数组等。

  2. 面向对象编程:Java是一种面向对象的编程语言,需要掌握类、对象、继承、多态等概念。

  3. 异常处理:Java提供了异常处理机制,需要掌握异常的分类、处理方式等。

  4. 集合框架:Java提供了丰富的集合框架,包括List、Set、Map等,需要了解其特点和使用方法。

  5. IO流:Java提供了文件读写和网络通信等IO流,需要掌握其使用方法。

  6. 多线程:Java提供了多线程编程机制,需要掌握线程的创建、同步、互斥等概念。

  7. 数据库编程:Java可以通过JDBC连接数据库,需要掌握SQL语句的编写和Java操作数据库的方法。

  8. GUI编程:Java提供了Swing和AWT两种GUI库,需要掌握GUI组件的使用方法和事件处理机制。

  9. 网络编程:Java提供了Socket和RMI两种网络编程方式,需要了解其使用方法和原理。

  10. Web开发:Java可以用于Web开发,需要掌握Servlet、JSP、Spring、Struts等Web开发框架。

  11. 安全编程:Java提供了安全编程的机制,包括加密、数字签名等,需要了解其使用方法和原理。

  12. 性能调优:Java程序的性能调优是一个重要的话题,需要掌握优化技巧和工具的使用方法。

  13. 设计模式:Java程序设计中常用的设计模式,包括单例模式、工厂模式、观察者模式等,需要了解其使用方法和原理。

  14. 其他:Java还包括XML解析、Web服务、分布式计算等方面的知识,需要根据实际需求进行学习和掌握。

Java网络编程聊天室可以通过以下步骤实现发送文件功能:

  1. 在聊天室客户端界面添加一个文件选择按钮,允许用户选择要发送的文件。

  2. 当用户选择要发送的文件后,客户端将文件转换为字节数组,并向服务器发送一个包含文件名和字节数组的消息。

  3. 服务器接收到消息后,将文件保存到指定的目录下,并向所有在线客户端广播一个包含文件名和文件路径的消息。

  4. 在客户端界面上,接收到服务器广播的文件消息后,显示文件名和下载链接,用户可以点击链接下载文件。

下面是一个简单的Java代码示例:

聊天室客户端:

import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Base64;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;public class ChatClient extends JFrame {private static final long serialVersionUID = 1L;private JTextArea chatArea;private JButton fileButton;private JFileChooser fileChooser;private ExecutorService executor;private Socket socket;private OutputStream outputStream;private InputStream inputStream;private String userName;public ChatClient(String userName) {this.userName = userName;initComponents();}private void initComponents() {setTitle("Chat Client");setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);setSize(400, 400);chatArea = new JTextArea();JScrollPane scrollPane = new JScrollPane(chatArea);add(scrollPane, BorderLayout.CENTER);JPanel panel = new JPanel();fileButton = new JButton("Send File");fileChooser = new JFileChooser();fileButton.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent e) {int returnVal = fileChooser.showOpenDialog(ChatClient.this);if (returnVal == JFileChooser.APPROVE_OPTION) {File file = fileChooser.getSelectedFile();try {sendFile(file);} catch (IOException ex) {ex.printStackTrace();}}}});panel.add(fileButton);add(panel, BorderLayout.SOUTH);setVisible(true);executor = Executors.newFixedThreadPool(2);executor.execute(new ReceiveMessageTask());executor.execute(new SendMessageTask());}private void sendFile(File file) throws IOException {byte[] fileBytes = Files.readAllBytes(file.toPath());String fileName = file.getName();String fileData = Base64.getEncoder().encodeToString(fileBytes);String message = "FILE " + fileName + " " + fileData;outputStream.write(message.getBytes());outputStream.flush();}private void receiveFile(String fileName, String fileData) throws IOException {Path filePath = Paths.get("received", fileName);byte[] fileBytes = Base64.getDecoder().decode(fileData);Files.write(filePath, fileBytes);String message = "FILE " + fileName + " " + filePath.toAbsolutePath();broadcastMessage(message);}private void broadcastMessage(String message) throws IOException {outputStream.write(message.getBytes());outputStream.flush();}private class ReceiveMessageTask implements Runnable {public void run() {try {socket = new Socket("localhost", 8000);outputStream = socket.getOutputStream();inputStream = socket.getInputStream();String message = "JOIN " + userName;outputStream.write(message.getBytes());outputStream.flush();while (true) {byte[] buffer = new byte[1024];int len = inputStream.read(buffer);if (len > 0) {String msg = new String(buffer, 0, len);if (msg.startsWith("FILE ")) {String[] parts = msg.split(" ");String fileName = parts[1];String fileData = parts[2];receiveFile(fileName, fileData);} else {chatArea.append(msg + "\n");}}}} catch (IOException e) {e.printStackTrace();} finally {try {socket.close();} catch (IOException e) {e.printStackTrace();}}}}private class SendMessageTask implements Runnable {public void run() {try {while (true) {String message = System.console().readLine();if (message != null && !message.isEmpty()) {if (message.startsWith("/")) {if (message.startsWith("/quit")) {outputStream.write("QUIT".getBytes());outputStream.flush();executor.shutdownNow();break;}} else {message = "CHAT " + message;outputStream.write(message.getBytes());outputStream.flush();}}}} catch (IOException e) {e.printStackTrace();}}}public static void main(String[] args) {EventQueue.invokeLater(new Runnable() {public void run() {new ChatClient("User1");}});}}

聊天室服务器:

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;public class ChatServer {private List<ClientHandler> clients = new ArrayList<>();public void start() {try {ServerSocket serverSocket = new ServerSocket(8000);System.out.println("Server started on port 8000.");while (true) {Socket socket = serverSocket.accept();ClientHandler client = new ClientHandler(socket);clients.add(client);System.out.println("New client joined: " + client.getName());broadcastMessage(client.getName() + " joined the chat.");client.start();}} catch (IOException e) {e.printStackTrace();}}private void broadcastMessage(String message) {for (ClientHandler client : clients) {client.sendMessage(message);}}private class ClientHandler extends Thread {private Socket socket;private String name;private InputStream inputStream;private OutputStream outputStream;public ClientHandler(Socket socket) {this.socket = socket;}public String getName() {return name;}public void run() {try {inputStream = socket.getInputStream();outputStream = socket.getOutputStream();byte[] buffer = new byte[1024];int len = inputStream.read(buffer);if (len > 0) {String message = new String(buffer, 0, len);if (message.startsWith("JOIN ")) {name = message.substring(5).trim();sendMessage("Welcome to the chat, " + name + "!");broadcastMessage(name + " joined the chat.");}}while (true) {len = inputStream.read(buffer);if (len > 0) {String message = new String(buffer, 0, len);if (message.startsWith("CHAT ")) {message = name + ": " + message.substring(5);broadcastMessage(message);} else if (message.startsWith("FILE ")) {String[] parts = message.split(" ");String fileName = parts[1];String fileData = parts[2];broadcastMessage("FILE " + fileName + " " + socket.getInetAddress().getHostAddress());} else if (message.startsWith("QUIT")) {broadcastMessage(name + " left the chat.");break;}}}} catch (IOException e) {e.printStackTrace();} finally {try {socket.close();clients.remove(this);} catch (IOException e) {e.printStackTrace();}}}public void sendMessage(String message) throws IOException {outputStream.write(message.getBytes());outputStream.flush();}}public static void main(String[] args) {new ChatServer().start();}}

相关文章:

Java知识体系及聊天室程序

Java知识体系结构梳理如下&#xff1a; 基础语法&#xff1a;Java的基本语法&#xff0c;包括数据类型、运算符、控制语句、数组等。 面向对象编程&#xff1a;Java是一种面向对象的编程语言&#xff0c;需要掌握类、对象、继承、多态等概念。 异常处理&#xff1a;Java提供了…...

java的详细发展历程

Java是一种跨平台、面向对象的编程语言&#xff0c;具有简单性、可移植性、安全性等特点。Java的历史可以追溯到上世纪90年代初期&#xff0c;以下是Java的详细发展历程&#xff1a; 1991年&#xff0c;Sun Microsystems公司的James Gosling和他的团队开始开发一种名为Oak的编程…...

丢石子

I 一堆石子有n个,两人轮流取.先取者第1次可以取任意多个&#xff0c;但不能全部取完.以后每次取的石子数不能超过上次取子数的2倍。取完者胜.先取者负输出"Second win".先取者胜输出"First win". 思路&#xff1a; 任何正整数都可以表示为不连续斐波那契…...

skywalking手动上报一些指标信息

skywalking的相关概念我就不介绍了&#xff0c;有兴趣可以参看官网文档 以下提供以下简单示例手工上报一些对问题排查比较有用的一些信息。当然这些内容你也可以写成探针插件的形式&#xff0c;怎么开发探针插件也自行参考官方文档。此处仅在项目框架层面提供一些简单的示例&am…...

NUMA详解

目录 NUMA简介 NUMA开启与关闭 查看系统是否支持 关闭方法 numactl --hardware介绍 没有安装numactl工具下查看NUMA架构节点数&#xff1a; 查看每个NUMA节点的CPU使用情况&#xff1a; 看每个NUMA节点的内存使用情况&#xff1a; 查看NUMA下指定进程的运行情况 创建…...

H68K在Armbina系统下开AP

背景需求替代路由器,网上找了一大堆都不行 最后成功开启了AP 参考了两篇文章, 一篇是如何创建热点, 一篇是如何开启5G 树莓派4B创建5Ghz WiFi热点 – 风声 https://www.hncldz.com/2020/02/01/%e6%a0%91%e8%8e%93%e6%b4%be4b%e5%88%9b%e5%bb%ba5ghz-wifi%e7%83%ad%e7%82%b…...

还不懂Redis?看完这个故事就明白了!

还不懂Redis?看完这个故事就明白了! 我是Redis 你好,我是Redis,一个叫Antirez的男人把我带到了这个世界上。 说起我的诞生,跟关系数据库MySQL还挺有渊源的。 在我还没来到这个世界上的时候,MySQL过的很辛苦,互联网发展的越来越快,它容纳的数据也越来越多,用户请求也…...

Haproxy负载均衡集群

1.Haproxy支持四层和七层 2.haproxy常用的调度算法&#xff1f; 3.LSV/NGINX/HAPROXT的区别&#xff1f; 4. 5.Haproy负载均衡部署 实验需求 利用Haproxy的运用配置出负载均衡调度器&#xff0c;以此来调用两台Nginx服务器进行工作 实验所需组件 Haproxy服务器&#xff1a;192…...

17.计及电转气协同的含碳捕集与垃圾焚烧虚拟电厂优化调度

说明书 MATLAB代码&#xff1a;计及电转气协同的含碳捕集与垃圾焚烧虚拟电厂优化调度 关键词&#xff1a;碳捕集 虚拟电厂 需求响应 优化调度 电转气协同调度 参考文档&#xff1a;《计及电转气协同的含碳捕集与垃圾焚烧虚拟电厂优化调度》完全复现 仿真平台&#xff1a…...

企业数字化管理中,数据治理到底怎么“治”

随着信息化、数字化的理念、技术及其应用在社会的方方面面进行扩散&#xff0c;数据的规模和丰富程度已经达到了一个新的高度&#xff0c;所以当下如何更进一步利用好数据&#xff0c;充分发挥数据的价值&#xff0c;将其真正变为高质量的数据资产成为了企业要面对的重要问题&a…...

《HelloGitHub》第 85 期

兴趣是最好的老师&#xff0c;HelloGitHub 让你对编程感兴趣&#xff01; 简介 HelloGitHub 分享 GitHub 上有趣、入门级的开源项目。 https://github.com/521xueweihan/HelloGitHub 这里有实战项目、入门教程、黑科技、开源书籍、大厂开源项目等&#xff0c;涵盖多种编程语言 …...

自动驾驶人机交互HMI产品技术方案

1. 概述 1.1 目的 本文档描述集卡自动驾驶系统中HMI产品的技术方案,设计人员遵循本方案进行设计,为项目开发实施提供技术方案保障。 1.2 范围 本文档适用于HMI产品项目。本文档用于指导HMI产品项目的UI、前端开发过程。 1.3 术语与缩写 术语/缩写 描述 HMI...

开发感悟20230426

一、element-ui样式设置 1. 可以直接在css中写个样式文件&#xff0c;把对应的类名改写样式&#xff0c;然后在main.js中引用&#xff0c;可以覆盖上面的&#xff0c;如果想给element-ui设置样式&#xff0c;不用设置deep了 2.可以直接修改引入的element-ui的样式&#xff0c…...

C和C++的区别

C和C的区别 1、面向对象编程&#xff1a;C是面向对象的语言&#xff0c;而C语言则不支持面向对象编程。C提供了类、对象、封装、继承、多态等面向对象的特性&#xff0c;使得程序结构更加清晰、可读性更强。2、模板&#xff1a;C提供了模板的特性&#xff0c;使得程序员可以通…...

【力扣-141】 环形链表 + 【力扣-142】 环形链表 II

&#x1f58a;作者 : Djx_hmbb &#x1f4d8;专栏 : 数据结构 &#x1f606;今日分享 : 霍桑效应(霍索恩效应) : 是指那些意识到自己正在被别人观察的个人具有改变自己行为的倾向。 霍桑效应告诉我们&#xff1a;从旁人的角度&#xff0c;善意的谎言和夸奖真的可以造就一个人&a…...

云计算:优势与未来趋势

文章目录 前言一、云计算的优势1. 降低IT成本2. 提高工作效率3. 提高业务的可靠性和稳定性4. 提升安全性 二、未来发展趋势1. AI与云计算的融合2. 边缘计算的发展3. 多云的趋势4. 服务器和存储的创新 三、 行业应用案例1.金融行业2.医疗保健行业3.教育行业4.零售和物流行业 四、…...

Linux namespace

​ 前言 从《initrd&init进程》可知&#xff0c;我们通过ssh连接linux服务器&#xff0c;其实主是linux启动一shell进程与我们做交互。而Linux又是多租户的&#xff0c;这使用得用户与用户间产生了&#xff0c;资源的争抢。 如何隔离资源&#xff0c;且让用户都无法察觉&…...

第十三章 移动和旋转(上)

移动和旋转是游戏对象最频繁地操作。我们上个章节简单介绍了Cube的移动和旋转。移动是修改transform的position属性&#xff0c;旋转是修改transform的eulerAngles&#xff08;欧拉角&#xff09;属性&#xff0c;两者属性值均可以使用Vector3向量来实现。需要大家注意的是&…...

视频文件切片

1.为什么网络点播系统使用m3u8更有优势?为何点播要用M3U8来搞&#xff1f;存成一个文件不更好吗&#xff1f; 一个MP4文件可能几百M或几个G&#xff0c;如果读取整个MP4文件的信息并且需要下载一段内容&#xff0c;首次打开播放超慢&#xff08;加载时间长&#xff09;。如果把…...

维生素的缺乏与生理功能,是否需要补充维生素【持续学习】

health & nutrition 学习自河南大学丁勇老师&#xff1a;https://space.bilibili.com/510028707 去医院查体内维生素缺啥&#xff1a;营养科或内科开单子 直接门诊查个维生素就可以。9项不到600块 正常吃饭&#xff0c;保湿和防晒 伤口愈合慢——蛋白质&#xff0c;vc 干燥…...

《利红AI企业级应用新标准等级体系》正式发布

各相关单位及合作伙伴&#xff1a; 为助力企业推动人工智能技术在实体经济中的科学落地&#xff0c;经公司研究决定&#xff0c;现正式发布《利红AI企业级应用新标准等级体系》&#xff08;以下简称"本标准"&#xff09;。现将有关事项公告如下&#xff1a; 一、新…...

混合模拟技术革新ML系统性能评估

1. 项目概述&#xff1a;混合模拟技术如何革新ML系统性能评估 在大型语言模型训练场景中&#xff0c;工程师常常面临这样的困境&#xff1a;要评估不同并行策略&#xff08;如数据并行、流水线并行&#xff09;对训练速度的影响&#xff0c;传统方法要么需要搭建昂贵的多GPU测试…...

Head Activator ;pPPGGSKVILF

一、基础信息多肽名称&#xff1a;头部激活因子三字母序列&#xff1a;Pyr-Pro-Pro-Gly-Gly-Ser-Lys-Val-Ile-Leu-Phe单字母序列&#xff1a;pPPGGSKVILF氨基酸数量&#xff1a;11 aa分子式&#xff1a;C54H84N12O14分子量&#xff1a;1125.34结构特征&#xff1a;N 端 Pyr&…...

红外图像/红外遥感图像/可见光红外图像对 近红外和可见光成对图像 生成对抗网络的风格迁移,或者图像融合/图像生成/图像转换 可见光遥感生成红外遥感图像,37500对图像数据

红外图像/红外遥感图像/可见光红外图像对 近红外和可见光成对图像 生成对抗网络的风格迁移&#xff0c;或者图像融合/图像生成/图像转换 可见光遥感生成红外遥感图像&#xff0c;37500对图像数据 文章目录**数据集描述&#xff1a;**&#x1f9fe; 项目背景&#x1f9f0; 一、环…...

Agent+可穿戴设备:心率、睡眠、活动数据如何变成有价值的健康建议

可穿戴设备每天都会产生心率、睡眠、步数、活动强度等数据&#xff0c;但开发者真正要解决的不是“采集更多指标”&#xff0c;而是把这些指标转成可解释、可追踪、可配置的健康提示。本文从工程角度搭建一个简化版 Agent 服务&#xff0c;演示如何完成数据接入、趋势计算、规则…...

ESP32秒变双模调试器:一份代码实现有线DAP-LINK与无线WiFi调试自由切换

ESP32双模调试器实战&#xff1a;有线DAP-LINK与无线WiFi的智能切换方案 在嵌入式开发领域&#xff0c;调试工具的选择往往决定了开发效率的上限。传统调试方案通常需要在有线连接的高性能和无线调试的灵活性之间做出取舍&#xff0c;而ESP32芯片的出现为这个困境提供了全新的…...

技术文档检索总失败?Perplexity的chunking策略、embedding模型选型与rerank阈值调优(附实测Benchmark数据)

更多请点击&#xff1a; https://codechina.net 第一章&#xff1a;技术文档检索总失败&#xff1f;Perplexity的chunking策略、embedding模型选型与rerank阈值调优&#xff08;附实测Benchmark数据&#xff09; 技术文档检索失败常源于文本切分不合理、语义表征能力不足或重排…...

NoFences:彻底告别桌面混乱的免费开源分区管理工具

NoFences&#xff1a;彻底告别桌面混乱的免费开源分区管理工具 【免费下载链接】NoFences &#x1f6a7; Open Source Stardock Fences alternative 项目地址: https://gitcode.com/gh_mirrors/no/NoFences 你是否经常在杂乱无章的Windows桌面上花费大量时间寻找需要的文…...

别再傻傻分不清了!给硬件工程师的SI、PI、EMI关系速查手册(附高频PCB设计实例)

硬件工程师实战指南&#xff1a;SI、PI、EMI的三角关系与高频PCB设计避坑 当你第一次面对DDR4布线导致的EMI测试失败时&#xff0c;可能会陷入这样的困惑&#xff1a;明明是信号完整性问题&#xff0c;为什么整改方案却是调整电源层的去耦电容&#xff1f;这种看似跨领域的因果…...

MicMute:3秒掌握麦克风静音控制,告别会议尴尬时刻

MicMute&#xff1a;3秒掌握麦克风静音控制&#xff0c;告别会议尴尬时刻 【免费下载链接】MicMute Mute default mic clicking tray icon or shortcut 项目地址: https://gitcode.com/gh_mirrors/mi/MicMute 你是否曾在视频会议中因忘记静音而暴露尴尬的聊天背景声&…...