JAVA 的聊天室程序

用eclipse和Tomcat写一个简易聊天室 本文讲述如何用JAVA语言写一个简易的聊天室 简易聊天室的代码实现,因为笔者还是个正在好好学习努力进步的学生,所以代码可能还有很多可以优化的地方,仅供参考。 效果图如下: 进入界面: 聊天界面: 需要的代码: InController.java public class InController extends HttpServlet{ private static final long ... 阅读详情
终于完成了这个实验了,写了报告以及 email 给老师了。
一直很懒,不过这个程序写得还挺顺利的,用 JAVA 进行网络编程和多线程编程很方便,只是界面编程比较麻烦点,不过为了省事我的界面做得挺简洁的。
不过代码写得还是挺难看嘀,太紧凑了,个人还是比较喜欢自己编的 C++ 程序的代码结构。
这个大概就是这个学期我唯一一件认真做的和课程相关密切的事情了。

工程文件和程序已上传,但是还在审阅中。。稍后可在http://download.youkuaiyun.com/user/Rappy/下载。

报告如下:
多线程多人聊天程序

实验目的

编写一个多人聊天的客户/服务器多线程聊天室程序。

理解TCP协议和多线程编程.。

了解聊天软件的基本原理。

 

实验内容

聊天室程序功能简述:

聊天室程序分为服务器端,和客户端。

服务器程序作为一个中转站。所有客户端都只与服务器进行通信。

客户端程序以用户名登录。

服务器和客户端都显示在线的用户列表。

用户可以向所有用户发表消息。

 

实验过程

(1)采用 Eclipse 作为开发工具,JAVA 为开发语言。

(2)使用 JAVA 的 Socket 和 ServerSocket 这两个类可以在网络连接时不必关心底层操作,而使用DataInputStream 和 DataOutputStream 这两个类可以像本地输入输出那么方便。

扩展 JAVA 的 Tread 类,可以在进行多线程编程时不必关心阻塞等操作,只需要重载其运行方法 void run ();。

(3)消息的格式是由格式前缀以及内容构成:

客户端消息:

”L user” 表示以 user 为用户名来登录(log in)服务端;

“M XXX” 表示向服务端发送内容为 “XXX” 的聊天消息;

“Q” 表示退出登录(quit)。

服务端消息:

“A user1 user 2 ” 表示接受(accept)用户的登录请求并向其发送在线用户的名单;

“R” 表示拒绝(refuse)用户的登录请求,假如用户名已被占用。

“M XXX” 表示服务端向在线用户广播内容为 “XXX” 的聊天消息。

“L user” 表示名为 user 的用户登录成功,向在线用户发送该用户登录的消息。

“Q user” 表示名为 user 的用户退出登录,向在线用户发送其退出登录的消息。

“Q” 表示接受用户的退出登录请求。

(4)服务端

界面如下:

https://p-blog.youkuaiyun.com/images/p_blog_youkuaiyun.com/rappy/339034/o_ChatRoom01.JPG

其中 Server IP 是本机的 IP 地址,不可编辑,而 Server Port 是服务端口,点击Start 按钮即可以监听该端口,而 Start 按钮会变成 Stop 按钮,再次点击将会断开所有用户的连接,而重新变成 Start 按钮。如下图为服务状态中:

  https://p-blog.youkuaiyun.com/images/p_blog_youkuaiyun.com/rappy/339034/o_ChatRoom02.JPG

(A)

服务端是由一个 Server 类构成,其定义为

public class Server extends Frame implements ActionListener{//…}

表示继承了 JAVA 的框架类 Frame 并实现了 ActionLisstenner 的界面,即其是一个窗口,并可以监听用户的行为,如点击按钮。

主要变量有:

private boolean serving = false;

private ServerSocket server;

private Hashtable ht;          // 记录 String userName -> DataOutPutStream out

private Hashtable ht_s;       // 记录 String userName -> Socket connection

 

serving 是一个全局的布尔变量,表示是否在服务中。在点击 start 按钮后设为 true,点击 stop 按钮后设为 false。

server 是一个服务套接字,用于监听端口,接受用户的连接请求。

ht 是记录用户名到连接该用户的输出流的哈希表,用于向用户广播消息。

ht_s 是记录用户名到连接该用户的套接字的哈希表,用于停止服务时,断开这些连接。

 

另外还包括了一些控件,用于程序的界面中。

(B)

在 Server 类里面有两个嵌套类,都是扩展的线程类:

private class ServerThreadSingle extends Thread{//…}

private class ServerThread extends Thread{//…}

 

其中第二个是监听用户的登录请求的线程,主要代码如下:

while(serving){

          Socket connection = server.accept();

          ServerThreadSingle handler = new ServerThreadSingle(connection);

}

即当服务的时候,接受用户的连接请求,并开始一个单独的服务线程(第一个线程类)和用户进行通信。

 

而第一个线程类的主要工作是

在线程类的构造函数中初始化一个布尔变量 login = false;

然后在线程类的 run() 方法中进行以下工作:

while (!login){

          // 读取用户发来的消息。

          // 如果该消息的格式前缀是 ‘L’ ,那么判断消息是否包含用户名

// 或者用户名是否已存在于一个用于记录用户名的哈希表 ht 中。

// 如果是,则回复消息 “R”,表示拒绝。

// 如果否,则回复一条消息 “A user1 user2 …”,表示接受。

// 其中user1, user2, …是当前所有在线用户的名单,从哈希表中读取。

// 向这些在线用户发送消息 “L current_user” ,

// current_user 是当前登录的用户所提供的用户名。

// 向哈希表中添加该用户名。

// 在服务端的消息输出区中输出用户登录成功的消息。

login = true;

}

while (login){

// 接收用户的消息

// 如果消息的格式前缀是 ‘Q’,那么回复消息 “Q”,提示退出成功,

// 从哈希表中删除该用户名,并广播消息 “Q current_user”。

// 否则将消息加上当前用户名并广播给所有用户(包括当前用户)。

// 在服务端的消息输出区中输出消息。

}

// 关闭连接

(C)

     事件处理方法,用于程序界面响应按钮点击的事件。

public void actionPerformed(ActionEvent event){//…}

在点击 start 按钮后,将 serving 设为true,并新建一个服务套接字和启动服务线程,其中需要从界面中读进服务端口的设定值。然后 start 按钮变为 stop 按钮。

点击 stop 按钮后,将 serving 设为 false,并断开所有连接,然后 stop 按钮变为 start 按钮。

(5)客户端

     界面如下:

    图像 “https://p-blog.youkuaiyun.com/images/p_blog_youkuaiyun.com/rappy/339034/o_ChatRoom03.JPG” 因其本身有错无法显示。

     其中的 User Name 需要填入自己的用户名(初始化为 User),Server IP 需要填入

服务器的 IP 地址(初始化为本机 IP),Server Port 需要填入服务器的监听端口

(默认是 8888,无需更改)。然后点击 Login 按钮即可向服务器发送登录请求。

登录后,在消息文本输入区中输入聊天消息后,点击 Send 按钮即可发送消息。

点击 Logout 按钮可以退出登录。如下图,为聊天状态(在另外一台机器上运行):

https://p-blog.youkuaiyun.com/images/p_blog_youkuaiyun.com/rappy/339034/o_ChatRoom04.JPG

(A)

客户端是由一个 Client 类构成,其定义为:

public class Client extends Frame implements ActionListener{//…}

表示继承了 JAVA 的框架类 Frame 并实现了 ActionLisstenner 的界面,即其是一个窗口,并可以监听用户的行为,如点击按钮。

主要变量有:

private boolean login = false;         // 记录是否登录的布尔变量

private Socket connection;           // 用于和服务端连接的套接字

private recThread receiver;           // 用于启动接收服务端消息的线程

 

另外还包括了一些控件,用于程序的界面中。

(B)

在 Client 类的时间处理方法中分别处理来自按钮 Login,Send,Logout的时间,其中主要是分别调用 logIn (),sendMsg (),quit () 这三个方法。

logIn () 方法主要是从界面中获取登录信息,向服务端发送登录消息

“L userName”。如果服务端返回的消息是 “R” 则提示用户 “User name error”,如果是”A user1 user2…” 则将 ’A’ 后面的用户名添加到界面控件的 list 中,然后启动一个接收服务端消息的线程receiver,稍后解释这个线程。

 

sendMsg () 方法主要是从界面的消息文本输入区获取消息,加上 ”M “ 前缀然后向服务端发送消息。

 

quit () 方法主要是向服务端发送消息 ”Q”。

(C)

用于接收服务端消息的线程receiver 是一个嵌套类,扩展了线程类 Thread,其定义如下:

private class recThread extends Thread{//…}

在其 run () 方法里面主要工作是:

读取服务端的消息。

如果前缀是 ‘L’,那么将 ‘L’ 后面的 userName 加入界面控件 list 中。并在消息文本输出区提示该用户已登录。

如果前缀是 ‘Q’,那么判断 ‘Q’ 后面是否跟着 userName,如果是则将 userName 从界面控件 list 中删除,否则即为本客户端退出成功,清除 list 里面的所有用户名。并在消息文本输出区提示该用户已退出。

如果前缀是 ’M’,那么将消息输出到消息文本输出区中。

 

(6)其他

在Server 类和 Client 类的构造函数里面的主要工作是添加按钮的事件监听器,以及调用 setup () 方法,使用布局管理器将控件按照一定的布局添加到界面中。

界面包含了一个 List 类的控件 list,用于显示在线用户名单。

 

实验总结

主要参考了《JAVA 语言程序设计》(清华出版社,朱福喜编著),了解到界面编程,多线程编程和网络编程的基本要点。

参考在线文档,了解到 Hashtable, List 类的使用方法。

从本次的实验中,掌握了JAVA 程序的开发的基本方法,开发工具 Eclipse 的使用,以及熟悉了网络编程中的 C/S 模型。


 
韩顺平Java自学笔记 项目 QQ聊天室 照着课程打的代码,外加自己的一些学习心得 阅读详情

相关推荐

基于java的网站即时通讯系统设计与实现

基于Java的网站即时通讯系统性能评估是对系统在特定工作负载下的消息传输速度和资源利用率进行评估和分析,旨在验证系统是否能够满足用户在实际使用中的性能需求。1、消息传输性能评估:消息传输性能是指系统在多个用户之间进行实时通信时的消息传输速度和可靠性。通过模拟多个用户同时进行消息发送和接收,评估系统的消息传输性能。可以观察系统是否能够快速地发送和接收消息,同时保持较好的消息传输速度和较低的丢包率。

biyesheji1000的专栏 1223

JAVA简单聊天室的实现

对于聊天室就是处理多个客户端发送的请求与信息,从而需要一个服务器端去处理这些客户端请求与信息,故采用的是服务器端/客户端模式(本章只讲解一个客户端与服务端的交流)。 2. 客户端与服务器端的连接:既然是多个客户端发送的请求与信息从而交给服务器端处理,那么客户端与服务器端之间需要进行连接。稍后会通过分析以及代码的方式进行详细操作 3. 客户端方面:客户端在与服务器端建立连接后,通过Socket对象获取输入输出流从而与服务器端之间进行通信。 4. 服务器端方面:服务器端的套接字ServerSocket对象在调

weixin_67780833的博客 1万+

Java CS聊天室应用程序项目实战

TCP/IP协议族是一组用于数据通信的协议,它们定义了数据如何在网络中传输。TCP/IP协议族中的主要协议包括:IP协议:负责将数据包发送到正确的地址。TCP协议:提供端到端的可靠传输,保证数据包的有序和无重复。UDP协议:提供简单的无连接的数据包传输服务,传输速度快但不保证可靠性。网络中的设备通过IP地址来识别,而端口号则用于区分同一设备上的不同应用。

weixin_42524864的博客 430

用java实现一个简单的网络聊天室

用java实现一个简单的网络聊天室

m0_55376623的博客 4000

MATLAB新手必看:Stewart平台运动学逆解从入门到实战(附完整代码)

本文详细介绍了如何使用MATLAB实现Stewart平台的运动学逆解,从基础原理到完整代码实现,涵盖并联机器人的数学建模、MATLAB编程和Simulink集成。通过实战案例和可视化分析,帮助新手快速掌握Stewart平台的运动学逆解技术,适用于机器人学和控制理论领域的研究与应用。

dream的博客 551

DEM边界数值爆炸?用ArcGIS空间分析工具链搞定异常值过滤全流程

本文针对DEM数据处理中常见的边界数值爆炸问题,提供了一套完整的ArcGIS空间分析解决方案。文章深入剖析了异常值产生的根源,并详细介绍了从诊断、定位到使用栅格计算器、重分类等工具进行精准过滤与修复的全流程工作流,帮助用户彻底解决由插值误差、数据拼接及坐标系转换引发的数值异常。

weixin_29269441的博客 148

java聊天室程序_Java简易聊天室程序socket

Java简易聊天室程序socketchatroomdemo.javapackage com.socket.demo;import java.io.IOException;import java.net.DatagramSocket;public class ChatRoomDemo {/*** @param args* @throws IOException*/public static void...

weixin_42407617的博客 129

机器学习(ML)在材料领域应用

机器学习作为一种兼顾开发效率以及开发成本的方法,已经逐渐应用于材料发现、结构分析、性质预测、反向设计等多个领域,并且在材料学研究中展现出惊人的潜力。传统的发现新材料的方法,如经验试错法和基于密度泛函理论(DFT)的方法,往往需要较长的研发周期,成本高、效率低,已经不能很好的适应如今需求量激增的材料学领域 ...

W5632DE的博客 3718

java聊天室程序_Java网络聊天室程序

服务器端://package chapter1;import java.net.*;import java.io.*;import java.util.*;public class ChatServer {/*** @param args* m_threads是一个Vector静态变量,维护所有Server方的ServerThread对象,* 通过该变量能向所有加入聊天室的聊天者ChatApple...

weixin_42226446的博客 282

ESP32-S3双模CMSIS-DAP调试器:USB+WiFi无线调试方案

CMSIS-DAP是ARM生态中标准化的嵌入式调试协议接口,广泛用于Keil、IAR、STM32CubeIDE等开发环境。其核心原理是通过SWD/JTAG物理层实现目标芯片寄存器访问、内存读写与断点控制,依赖确定性时序和低延迟通信。传统DAPLink调试器受限于USB线缆束缚,而WiFi-USB-DAPLink项目将完整CMSIS-DAP v2协议栈移植至ESP32-S3平台,同时支持USB CDC直连与WiFi TCP远程通道,兼顾实时性与网络化部署能力。该方案无需主机驱动、兼容主流IDE,并支持多机并发

weixin_31185473的博客 371

AIGC在游戏行业的应用:革新游戏开发与体验

AIGC(人工智能生成内容)技术正在深刻改变游戏行业,从开发到体验全面革新。在游戏开发中,AIGC可用于自动生成关卡、角色和剧情,提升开发效率;在资源制作中,通过AI生成场景、角色模型等,降低成本。

1666

java udp 聊天室_Java基于UDP协议实现简单的聊天室程序

最近比较闲,一直在抽空回顾一些Java方面的技术应用。今天没什么事做,基于UDP协议,写了一个非常简单的聊天室程序。现在的工作,很少用到socket,也算是对Java网络编程方面的一个简单回忆。先看一下效果:实现的效果可以说是非常非常简单,但还是可以简单的看到一个实现原理。“聊天室001”的用户,小红和小绿相互聊了两句,“聊天室002”的小黑无人理会,在一旁寂寞着。看一下代码实现:1、首先是消息服...

weixin_35727440的博客 856

杰理蓝牙SPP用户接口详细文档

本文档详细介绍了基于JL701n芯片的蓝牙SPP用户接口实现。主要内容包括:1) 文件结构分析,包含必要的头文件和调试配置;2) 核心数据结构,如全局变量和TWS功能ID定义;3) 五大功能模块实现:数据发送、状态管理、数据接收、TWS支持和初始化清理;4) API接口说明,包括公共接口函数和回调函数;5) 使用教程,涵盖基本流程和高级应用示例。该接口支持虚拟串口连接,实现蓝牙设备间数据传输,特别针对TWS场景进行了优化,提供连接状态管理、数据收发等功能。文档还包含错误处理、重试机制等实用建议,适合蓝牙SP

qq_42014563的博客 1180

基于Java多线程的聊天室程序

基于Java多线程的聊天室程序 聊天室软件是现代互联网应用中常见的一种形式,它允许用户进行实时的通信。在这里,我们将讨论如何使用Java编程语言和多线程技术实现一个基本的聊天室程序。 1. 什么是多线程? 多线程是一种并发执行的方式,它允许一个程序同时执行多个线程。每个线程可以独立执行任务,这样就提高了程序的效率,特别是在...

weixin_41096553的博客 116

模型预测控制(MPC)解析(二):单输入单输出系统

在上一篇中,为了便于说明,预测控制系统采用单输入单输出系统为例进行设计。由于系统模型使用的是状态空间方程,于是可以很容易的将这种设计方法可以扩展到多输入、多输出系统。

行者无疆的博客 8223

虚拟电厂功率预测最佳实践白皮书

虚拟电厂(VPP)通过聚合分散的可再生能源资源,为电网提供可观测、可调度和可交易的解决方案。本文提出了一套功率预测方法论,并给出LSTM实现脚本,涵盖资源接入、数据治理、预测模型设计及市场交易闭环。针对风-光-储-负荷混合场景,该方法论强调轻量化部署和滚动优化,可有效提升预测精度和调度收益。未来研究将融合深度气象预报和强化学习,进一步优化VPP的协同调度能力。

专注AI大模型,软件混淆,授权 377

Java简易聊天室程序socket

Java简易聊天室程序socket chatroomdemo.java SendDemo.java

hins 2741

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Java实现一个简单的聊天室程序

以下程序是先运行服务器端程序,再运行客户端程序,否则会抛出异常。(1)服务器端程序public class Server { static ArrayList<Socket> clients=new ArrayList<Socket>();   //Socket集合 public static void main(String[] args) { try{ Serve...

ma2622595880的博客 1万+

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

java聊天室程序免费下载,用JAVA实现基于C/S模式的聊天室程序

大小: 0.33M文件类型: .zip金币: 1下载: 0 次发布日期: 2021-01-15资源简介用 java 实现基于 C/S 模式的聊天室程序。聊天室分为服务器端 和客户端两部分,服务器端程序主要负责侦听客户端发来的消息,客户端需要登 陆到服务器端才可以实现正常的聊天功能。 服务器端主要功能如下:在特定端口上进行侦听,等待客户端连接。统计在 线人数。当停止服务时,断开所有的用户连接。 客户...

weixin_34777998的博客 305

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

java udp简单聊天程序_Java基于UDP协议实现简单的聊天室程序

最近比较闲,一直在抽空回顾一些java方面的技术应用。今天没什么事做,基于udp协议,写了一个非常简单的聊天室程序。现在的工作,很少用到socket,也算是对java网络编程方面的一个简单回忆。先看一下效果:实现的效果可以说是非常非常简单,但还是可以简单的看到一个实现原理。“聊天室001”的用户,小红和小绿相互聊了两句,“聊天室002”的小黑无人理会,在一旁寂寞着。看一下代码实现:1、首先是消息服...

weixin_29541743的博客 782

Java课程设计报告-聊天室程序模板1:打造你的专属聊天室

Java课程设计报告-聊天室程序模板1:打造你的专属聊天室 去发现同类优质开源项目:https://gitcode.com/ 项目核心功能/场景 实现多客户端模式下客户端单独聊天,设计友好用户交互界面。 项目介绍 在现代通信技术飞速发展的背景下,网络聊天已成为人们日常交流不可或缺的一部分。Java课程设计报告-聊天室程序模板1,正是为Java学习者量身打造的一个实践项目。该模板基于Java网络通信...

gitblog_06741的博客 925

JAVA中TCP,UDP传输 简单的聊天室程序

JAVA中聊天室程序 要求: 编写一个聊天程序 有收数据的部分,也同时有发数据的部分。 这两部分需要同时执行,那就需要用到多线程技术。 一个线程控制发,一个线程控制收。 注意 这里我们需要注意的是,因为收发动作是不一致的,所以要定义两个run方法,而且这两个方法要封装到不同的类中。并且,我们在写出我们的地址时,如果是一对一我们可以写出目的的IP地址即可,也可以写成255形式,如目标地址是10.34...

quyuquan2014的博客 2113

java聊天室小程序论文_在Java项目中利用continue与break制作一个聊天室小程序

在Java项目中利用continue与break制作一个聊天室小程序发布时间:2020-12-08 16:03:27来源:亿速云阅读:98作者:Leah在Java项目中利用continue与break制作一个聊天室小程序?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。实现方法如下:package com.swift;im...

weixin_39601794的博客 122

基于Java的实例源码-多用户聊天室程序(毕业设计)

上述代码只是一个简单的示例,真实的多用户聊天室程序可能包含更多的功能和模块,比如用户注册、登录验证、文字消息、文件传输、图像表情等。但通过上述代码,我们可以基于Java实现一个简单的多用户聊天室程序,并模拟用户的登录和消息发送操作。在这个系统中,用户可以注册账号、登录、发送消息、接收消息等操作。该类中包含消息ID、发送者、接收者、发送时间、消息内容等属性,同样还有相应的get和set方法。该类中包含一组在线用户、一组消息记录等属性,用户可以将消息发送到聊天室中。// 用户登录聊天室。// 用户退出聊天室。

m0_62396648的博客 842

java程序_Java聊天室程序

不知道大家有没有用过社交软件中的聊天室,小编今天要给大家介绍的就是聊天室程序,还是很有趣的,感兴趣的小伙伴可以看下。一、业务需求1. 与聊天室成员一起聊天。2. 可以与聊天室成员私聊。3. 可以改变聊天内容风格。4. 用户注册(含头像)、登录。5. 服务器监控聊天内容。 6. 服务器过滤非法内容。7. 服务器发送通知。8. 服务器踢人。9. 保存服务器日志。 10.保存用户聊天信息。二、系统功能模...

weixin_39973492的博客 289

java udp socket 聊天室_Java基于UDP协议实现简单的聊天室程序

最近比较闲,一直在抽空回顾一些java方面的技术应用。今天没什么事做,基于udp协议,写了一个非常简单的聊天室程序。现在的工作,很少用到socket,也算是对java网络编程方面的一个简单回忆。先看一下效果:实现的效果可以说是非常非常简单,但还是可以简单的看到一个实现原理。“聊天室001”的用户,小红和小绿相互聊了两句,“聊天室002”的小黑无人理会,在一旁寂寞着。看一下代码实现:1、首先是消息服...

weixin_33816175的博客 370
上一篇: 无向图的欧拉回路线性时间算法
下一篇: 自然数最优分解问题(纯分析)
Rappy
博客等级 码龄20年 48粉丝 42原创
评论 9
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值