终于完成了这个实验了,写了报告以及 email 给老师了。
一直很懒,不过这个程序写得还挺顺利的,用 JAVA 进行网络编程和多线程编程很方便,只是界面编程比较麻烦点,不过为了省事我的界面做得挺简洁的。
不过代码写得还是挺难看嘀,太紧凑了,个人还是比较喜欢自己编的 C++ 程序的代码结构。
这个大概就是这个学期我唯一一件认真做的和课程相关密切的事情了。

工程文件和程序已上传,但是还在审阅中。。稍后可在http://download.csdn.net/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)服务端

界面如下:

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

(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)客户端

界面如下:

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

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

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

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

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

(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 的聊天室程序相关推荐

  1. javaweb JAVA JSP聊天室程序源码(局域网聊天系统 即时通讯)网页聊天系统

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

    Java简易聊天室程序socket chatroomdemo.java package com.socket.demo; import java.io.IOException; import java ...

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

    最近比较闲,一直在抽空回顾一些java方面的技术应用. 今天没什么事做,基于udp协议,写了一个非常简单的聊天室程序. 现在的工作,很少用到socket,也算是对java网络编程方面的一个简单回忆. ...

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

    最近比较闲,一直在抽空回顾一些Java方面的技术应用. 今天没什么事做,基于UDP协议,写了一个非常简单的聊天室程序. 现在的工作,很少用到socket,也算是对Java网络编程方面的一个简单回忆. ...

  5. Java聊天室程序源码 Java即时通讯代码 Java局域网聊天系统 Java即时通讯 Java聊天系统

    Java聊天室程序源码 Java即时通讯代码 Java局域网聊天系统  Java即时通讯 Java聊天系统 public Swingtest002() {// 设置标题setTitle("请 ...

  6. 用Asp.Net创建基于Ajax的聊天室程序

    原作者Dahan Abdo 译自CodeProject 如要下载源代码,请到我的网站,地址:http://www.vczx.com/article/show.php?id=1796 简 介 我的第一个 ...

  7. 2020暑假集训项目——Java简易聊天室

    经过一周的学习与搬砖,我成功的完成了暑假集训的第一个项目--Java简易聊天室,这里对整个项目做一个总结.(文末附下载地址) 本项目支持的功能: 1.可同时开启多个客户端进行多人聊天: 2.可与在线的 ...

  8. java web聊天室论文_基于java网页版聊天室的设计与实现毕业论文含开题报告及文献综述.doc...

    基于java网页版聊天室的设计与实现毕业论文含开题报告及文献综述.doc 还剩 52页未读, 继续阅读 下载文档到电脑,马上远离加班熬夜! 亲,很抱歉,此页已超出免费预览范围啦! 如果喜欢就下载吧,价 ...

  9. Java——实现聊天室

    学习Java的每一个人都知道,聊天室是每一个程序员都要过手的项目,根据要求的不同,聊天室的实现可易可难. 我今天的聊天室程序主要实现的功能是: 1.私聊功能 2.群聊功能 3.查看成员列表功能 4.退 ...

最新文章

  1. 关于网站更新速度的一点小心得
  2. grep,egrep及元字符和posix字符集
  3. Oracle PL/SQL语言初级教程
  4. 敏捷回顾会议的套路与实践分享
  5. 支付业务与技术架构学习总结(8)——支付系统设计包含:账户,对账,风控...
  6. 12muduo_base库源码分析(三)
  7. tor the onion router下载_盒马生鲜超市购物app下载,打开盒马鲜生小程序!
  8. git可视化工具小乌龟安装使用
  9. 9月14日-全外显子组测序分析流程
  10. 平面/球面坐标中已知起点坐标、(偏转)角度、长度求终点坐标(三角函数)
  11. 关于html5的发展历史,HTML5发展历程
  12. 时钟晶振电路EMC设计标准电路详解
  13. arduino智能浇花系统_基于Arduino单片机的智能浇花器
  14. 错误模块名称: KERNELBASE.dll 问题记录
  15. 操作系统——文件管理学习笔记
  16. SAP标准供应商寄售业务自动清账测试
  17. 魏小亮:国内软件工程师如何面试硅谷创业公司
  18. Redmi Note 11T什么时候发布 Redmi Note 11T配置如何
  19. 基于 NCF图书推荐系统 有代码+数据 可直接运行
  20. 分数用计算机怎么分数除法,分数除法怎么算

热门文章

  1. c++期末上机oj题目汇总二(2018北邮信通版)纯干货
  2. mac系统上Unity classes.jar 目录
  3. 名词解释语言表达的6c原则,货币银行学中的“6C原则”是什么意思
  4. uniapp 微信小程序发布版本提示珊瑚运营平台、uniAD 有新版本怎么解决?
  5. keepalived 解决入口机器(Nginx)挂掉的问题
  6. glibc 知:手册12:输入/输出流
  7. Oracle 系统函数
  8. illustrator画图
  9. 【DNF】收藏版网游单机版简体中文一键端横版地下城90局域网架设GM
  10. GitHub标星1.6K,大佬开源的抖音项目,刷屏全网!