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

【C++PTA】6-1 Point类的运算 (10 分)

定义Point类,有坐标x,y两个私有成员变量;对Point类重载“+”(相加)、“-”(相减)和“==”(相等)运算符,实现对坐标的改变,要求用友元函数和成员函数两种方法实现。对Point类重载<<运算符,以使得代码 Point p; cout<<p<<endl;可以输出该点对象的坐标。 函数接口定义: 实现Point类。 裁判测试程序样例: /* 请在这里填写答案 */ int main(int argc, char const *argv[]) { P

libertye的博客 2369

DataWorks数据安全治理最佳实践

DataWorks基于数据安全治理的常见思路,针对资产梳理、技术体系建设和运营体系建设,提供了一系列数据安全产品能力,您可通过“基础防护建设、数据安全防护措施及策略增强建设、数据安全持续运营”三个阶段在DataWorks上落地数据安全治理项目。参考本文启动数据安全治理项目前,建议您先了解DataWorks数据安全产品相关能力了解DataWorks数据安全产品能力后,您可参考如下三个阶段在DataWorks上落地数据安全治理项目。

soso1968的博客 1438

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

深入解析ChangeFormer:基于Transformer的孪生网络在遥感变化检测中的创新应用

本文深入解析了ChangeFormer这一基于Transformer的孪生网络在遥感变化检测中的创新应用。通过分层Transformer编码器、特征差异计算模块和轻量级MLP解码器的设计,ChangeFormer在LEVIR-CD数据集上取得了90.4%的F1分数,显著优于传统卷积网络。文章还详细探讨了工程化实现、训练调参和模型部署的优化策略,为遥感变化检测领域提供了新的技术范式。

weixin_29051811的博客 732

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

Dify工作流自动化:如何用Trae AI助手10倍提升你的开发效率(含避坑指南)

本文详细介绍了如何利用Trae AI助手自动化生成Dify工作流,实现开发效率的10倍提升。通过构建DSL示例库、精准需求描述和四步实战法,开发者可将重复的配置工作交给AI,快速生成可运行的工作流,并提供了关键的避坑指南。

weixin_29062865的博客 371

远程桌面项目

远程桌面项目

weixin_41560737的博客 1934

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

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

weixin_35727440的博客 856

vue2/3 - 详细实现高德地图轨迹回放,vue高德地图车辆历史行驶轨迹播放,在地图上绘制行程轨迹|起点和终端的路程绘制|用户运动轨迹绘制及播放等(支持开始/暂停、进度条拖放、控制播放轨迹的倍速等)

vue2,vue3,nuxt,高德地图,轨迹,vue高德地图轨迹回放,历史轨迹回放,轨迹回放功能支持倍速及进度条拖拽,VUE高德地图轨迹回放、倍速调整、进度条拖拽,vue3高德地图轨迹回放,Vue实现地图路径回放,vue中使用高德地图实现历史轨迹回放并能控制播放轨迹的倍速,多条轨迹陆续播放,巡航轨迹做带进度条和倍速的轨迹回放,Vue高德地图路径回放,历史轨迹回放并能控制播放轨迹的倍速,使用高德地图实现轨迹播放和进度条控制,vue高德地图如何实现轨迹回放,高德地图做轨迹绘制用什么api,高德轨迹API,驾车轨

✅ 精选推荐文章 1万+

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

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

weixin_41096553的博客 116

Python 爬虫实战:抓取百科网站上某个词条的详细信息

百科网站(如维基百科)为用户提供了丰富的知识内容,涵盖了从历史、文化到科技等几乎所有领域的知识。对于需要大量数据进行分析、研究或机器学习项目的开发者而言,抓取这些网站的数据显得尤为重要。通过编写一个 Python 爬虫,我们能够轻松地抓取百科网站上的某个词条及其详细信息,从而获取并整理这些知识内容。本篇博客将深入介绍如何通过 Python 编写爬虫来抓取百科网站(如维基百科)的某个词条的详细信息,包括标题、正文内容、参考文献等。requests:发送 HTTP 请求,获取页面内容。

2201_76125261的博客 1671

nvidia系列教程-AGX-Orin linux源码下载编译

NVIDIA AGX Orin 是一款高性能的嵌入式计算平台,广泛应用于人工智能、自动驾驶、机器人等领域。为 AGX Orin 编译定制的 Linux 内核,可以更好地适应特定应用需求,增强系统的灵活性。本文将详细介绍如何下载、配置和编译适用于 AGX Orin 的 Linux 内核源码。本文介绍了如何为 NVIDIA AGX Orin 平台下载、配置和编译定制的 Linux 内核源码。通过编译和部署定制内核,您可以更好地控制系统的行为,并根据特定应用需求进行优化。

flypig has a dream! 1283

Java简易聊天室程序socket

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

hins 2741

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

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

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

ma2622595880的博客 1万+

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

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

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

weixin_34777998的博客 305

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

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、付费专栏及课程。

余额充值