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

树莓派3-改装wifi外置天线

声明:本文只是技术性探讨,改装引起的产品损坏等后果,由用户自负! 改装主要有两种方法 方法一:直接替换原来的天线 1、移除原有的小陶瓷天线,就在Made in PRC(或UK)那边的那个 清理一下阻焊剂方便天线接地(图中PRC左侧) 2、焊接天线 天线的屏蔽层焊接到清理完阻焊剂的地方,中间的信号线焊接到PRC右侧焊盘。 3、最终的样子

huayucong的博客 2万+

群晖NAS下docker安装MySql

本文将一步一步讲解如何在群晖NAS的docker中启用一个MySQL容器 , 算是初学者对问题解决的一个记录.

qq_46375248的博客 5978

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

[零基础]用docker搭建Hadoop集群

[零基础]用docker搭建Hadoop集群,每一步都有详细的解释!

weixin_56114243的博客 2万+

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

拌合楼软件开发(24)接收微信消息生成车辆计划

【摘要】针对拌合站客户群体文化程度不高、习惯微信群沟通的业务场景,提出通过企业微信机器人实现微信对话下单的解决方案。核心是利用WorkTool工具的消息回调机制:1)配置接收消息的API接口;2)解析JSON格式的对话数据,筛选@机器人的有效消息;3)采用*号分隔符提取订单信息并进行校验;4)建立微信昵称与客户系统的映射关系。方案解决了传统系统登录门槛高的问题,但需注意群名唯一性、多系统对接及客户身份识别等关键问题。全文重点阐述技术实现逻辑而非具体代码。

morsth的博客 1045

避坑指南:RK3568双网口RMII模式DTS配置常见错误与调试技巧

本文详细解析了RK3568双网口RMII模式DTS配置中的常见错误与调试技巧,涵盖时钟配置、PHY识别、复位时序等关键问题。通过实战案例和系统化调试方法,帮助开发者快速解决百兆以太网连接不稳定、PHY识别失败等典型问题,提升开发效率。

weixin_42549037的博客 345

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

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

weixin_35727440的博客 856

嵌入式Linux开发必备:设备树插件动态加载实战指南(RK356x平台为例)

本文以RK356x平台为例,详细介绍了嵌入式Linux开发中设备树插件的动态加载实战。通过configfs接口,开发者可以在系统运行时动态修改硬件配置,实现外设的即插即用与调试,无需重启设备,极大提升了开发与调试效率。

w7x8y9z的博客 443

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

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

weixin_41096553的博客 116

ESP-SPARKBOT AI 智能机器人:v1.2 全流程复刻指南

本文介绍 ESP-SPARKBOT AI 智能机器人 v1.2 版本的全流程复刻,包含 PCB 、3D 打印、固件烧录、常见问题解决、参考资料等

举世誉之而不加劝,举世非之而不加沮,定乎内外之分,辩乎荣辱之境,斯已矣。 9258

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

Java简易聊天室程序socket

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

hins 2741

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

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

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

ma2622595880的博客 1万+

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

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

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

weixin_34777998的博客 305

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

余额充值