基于java的多人聊天程序课程设计

perfunctory

发布日期: 2018-10-21 14:43:22 浏览量: 2030
评分:
star star star star star star star star star star
*转载请注明来自write-bug.com

一、设计内容及要求

1.1 设计内容

聊天工具大多数由客户端程序和服务器程序外加服务器端用于存放客户数据的数据库组成,本程序采用客户机/服务器架构模式。通过Java提供的Socket类来连接客户机和服务器并使客户机和服务器之间相互通信,由于聊天是多点对多点的而Java提供的多线程功能。用多线程可完成多点对多点的聊天。

1.2 设计要求

主要有两个应用程序,分别为服务器程序和客户端程序。服务器应用程序主要用于消息转发、客户登录信息的管理以及向所有用户发送系统消息等;客户端应用程序主要用于客户聊天记录的显示和信息输入。采用Client/Server(C/S)体系结构,即客户机/服务器体系结构。聊天服务器专门用于监控用户状态和转发消息,客户端负责接收消息的用户序列和消息文本发送到服务器。该聊天系统实现私聊,群聊,用户注册,登陆,退出聊天系统等功能。

二、系统需求分析

2.1 系统介绍

在当今信息时代,有许多的聊天工具,例如QQ、微信等。本程序就是利用Java网络编程的知识,采用客户机/服务器架构模式来实现客户端与客户端之间的通讯。

2.2 开发背景

在当今信息时代,越来越多的聊天工具被应用,Java语言是当今流行的网络编程语言,它具有面对对象、跨平台、安全、多线程等特点。使用Java语言不仅可以实现大型企业级的分布式系统应用,还能为小型的、嵌入式设备进行应用程序开发。面对对象的开发方法是当今最流行的开发方法,它不仅更贴近现实,而且有利于软件的维护和继承。为了进一步巩固课堂上所学到的知识,深刻把握Java语言的重要概念及面对对象的特性,锻炼我们熟练的应用面对对象的思想和设计方法解决实际问题的能力,所以我选择了开发Java多人聊天程序。

三、系统总体设计

3.1 系统功能结构图

3.2 系统数据流程图

四、系统详细设计

4.1 本设计所涉及技术和知识点

  • C/S体系结构:采用Client/Server(C/S)体系结构,即客户机/服务器体系结构。其中客户端用了发送和接受收显示聊天消息,服务器用来监听客户端的消息,并将接收到的数据转发到所用的客户端上,这样实现群聊功能。
  • Socket套接字:作为多人聊天程序,网络编程的知识必不可少,其中用到了Socket套接字、IP地址、端口号等网络编程的知识。
  • 客户端与服务器的窗口用到Java Swing图形用户界面知识,其中包括界面的布局、组件的使用以及各种监听事件的使用。
  • 多线程:为了是客户端与客户端之间的消息、客户端发送与接收的消息不发生冲突,将每个客户端的发送和接收用不同的线程。
  • IO流:聊天时客户端与服务器之间肯定有数据的输入输出,所以IO流的知识在这里也十分重要。

4.2 功能模块详细设计

  • 客户端:运行客户端时,弹出登录客户端界面,这是需要设置用户名、IP地址和端口号,其中IP和端口号必须和服务器的对应,否则连接不上服务器。登录后进入客户端聊天界面窗口。这时可以与其他客户端之间在一个聊天室中聊天,若想私聊某人,只需在聊天内容前加上@该用户的姓名+:就可以了。点击右上角的下线按钮即退出该聊天室。

  • 发送消息:当点击发送按钮时,将消息通过DataOutputStream流中的writeUTF发送到服务端,服务端通过DataInputStream中的readUTF接受客户端的消息,紧接着服务端通过DataOutputStream中的writeUTF发送个所有客户端。

  • 私聊:当用户登录后,在没有点击发送按钮前,先将该客户端的姓名发送到服务器,服务器先接收到用户的姓名,然后在接收聊天消息。

  • 服务器:启动服务器,弹出设置服务器的窗口,填写服务器的IP地址和端口号,点击确定后,服务器启动,并不断监听客户端的连接和接收客户端发来的消息。

五、编码与实现

5.1 具体功能模块实现

该多人聊天程序包括8个文件,功能如下:

1. Client.java
包含Client类,其中有main、connectServer函数,是客户端启动的入口。在main函数中通过创建一个ClientLogin对象,来打开登陆窗口。 ClientLogin login = newClientLogin();

2. ClientFrame.java

包含ClientFrame类,该类继承于Jframe类,用来创建客户端的窗口。
其中包括窗口中的各个组件、布局以及组件的监听事件。

  1. sendButton.addActionListener(new ActionListener() {
  2. public void actionPerformed(ActionEvent e) {
  3. msg = msgText.getText().toString();
  4. ClientSend.send();
  5. msgText.setText(null); });

发送按钮的监听事件,当点击发送时,将发送栏中的消息保存在字符串msg中,在,然后调用 ClientSend.send()函数,将该字符串发送到服务器。

3. ClientLogin.java

包含ClientLogin类,该类继承于Jframe类,用来创建客户端登录窗口,其中包括设置IP地址、端口号、用户姓名的各种组件,和登录按钮的监听事件:

  1. btn_login.addActionListener(new ActionListener() {
  2. public void actionPerformed(ActionEvent e) {
  3. name = jtf_userName.getText().toString();
  4. ip = jtf_ip.getText().trim();
  5. port = Integer.parseInt(jtf_port.getText().toString());
  6. //点击登录后,客户端连接服务器
  7. try {
  8. Client.connectServer();
  9. } catch (UnknownHostException e1) {
  10. e1.printStackTrace();
  11. } catch (IOException e1) {
  12. e1.printStackTrace();
  13. }
  14. //隐藏当前窗口
  15. dispose(); //关闭
  16. //打开客户端
  17. new ClientFrame();
  18. }
  19. });

点击登录按钮时,将窗口中用户姓名、IP地址和端口号分别赋值给字符串name、ip、port变量,然后调用Client.connctServer()来连接服务器,并且关闭该窗口,创建ClientFrame对象来打开客户端窗口。

4. ClientReceive.java

包含ClientReceive类,该类中有Runnable接口,用于创建一个用户接受服务器消息的客户端接受线程。

线程体:

  1. public void run() {
  2. String msg = null;
  3. while(isRunning){
  4. //将接受信息输出到客户端窗口中
  5. msg = receive();
  6. System.out.println(msg);
  7. ClientFrame.msgRecordText.append(msg+"\n");
  8. }
  9. }

该线程处于死循环中,其中receive()函数用来接收服务器的消息,并通过ClientFrame.msgReceordText.append(msg+”\n”)将消息显示在客户端的窗口聊天记录面板上。

5. ClientSend.java

包含ClientReceive类,该类中有Runnable接口,用于发送消息,该线程的线程体为空:

  1. public void run() {
  2. }

当用户点击客户端窗口中的发送按钮时,会调用该类中的send函数,用于将消息发送到服务器。

6. Server.java

包含Server类,其中包含main、setServer方法和List<ServerForward>集合类。

其中main函数是服务器的入口,用来打开服务器设置窗口。

main函数:

  1. ServerFrame serverFrame = new ServerFrame();

setServer函数:

  1. public static void setServer() throws IOException {
  2. //从服务器窗口获取ip和端口号
  3. String ip = ServerFrame.ip;
  4. int port = ServerFrame.port;
  5. ServerSocket server = new ServerSocket(port, 0,InetAddress.getByName(ip));
  6. while(true) {
  7. Socket client = server.accept();
  8. System.out.println("连接成功");
  9. ServerForward serverForward = new ServerForward(client);
  10. allClient.add(serverForward);
  11. Thread thread = new Thread(serverForward); thread.start();
  12. }
  13. }

启动服务器,不断的监听客户端的连接,当有客户端连接上时,在List<ServerForward>集合类中添加该线程,并启动该线程。

7. ServerForward.java

包含ServerForward类,服务器接受一个客户端得信息,再转发给其他客户端。该类中主要包括receive、send函数,用于转发客户端的消息。

线程体:

  1. public void run() {
  2. //接受用户的昵称
  3. while(isRunning) {
  4. if (name == null)
  5. name = getClientName();
  6. else
  7. break;
  8. }
  9. while(isRunning) {
  10. sendToClient(receive());
  11. }
  12. }

因为服务器的工作不间断的,所以用无限循环。getClientName()从客户端中接受用户的姓名,并保存字符串name中。sendToClient(receive())接收一个客户端的消息,并转发给所有客户端。

8. ServerFrame.java

包含serverFrame类,该类继承于JFrame,用于创建服务器设置界面,其中包括设置IP地址、端口号,和确认按钮的监听事件:

  1. btn_set.addActionListener(new ActionListener() {
  2. public void actionPerformed(ActionEvent e) {
  3. ip = jtf_ip.getText().trim();
  4. port = Integer.parseInt(jtf_port.getText().toString());
  5. //关闭窗口
  6. dispose();
  7. //点击确定后,设置服务器ip和端口号
  8. try {
  9. Server.setServer();
  10. } catch (UnknownHostException e1) {
  11. e1.printStackTrace();
  12. } catch (IOException e1) {
  13. e1.printStackTrace();
  14. }
  15. }
  16. });

将服务器设置窗口中的IP地址和端口信息ip、port字符串中,并调用Server.setServer函数,开始启动服务器。

5.2 演示界面

5.2.1 服务器设置窗口

5.2.2 客户端登录窗口

5.2.3 客户端窗口

5.2.4 群聊和私聊

上传的附件 cloud_download 基于java的多人聊天程序.7z ( 925.66kb, 241次下载 )
error_outline 下载需要4点积分

keyboard_arrow_left上一篇 : 基于JAVA和SQL SERVER数据库实现的酒店管理系统 基于JSP的车险模拟系统的设计与实现 : 下一篇keyboard_arrow_right



perfunctory
2018-10-21 15:57:04
java实现的,仿QQ,可以聊天,也可以传输文件~
minaran
2019-04-30 18:58:15
怎么传输文件呀
长发还是短发
2019-07-03 14:51:11
直接拉进Eclipse里好像不能用

发送私信

你是清晨一场雨,淋湿在胸口却感觉好温柔

9
文章数
14
评论数
最近文章
eject