1、Java 网络程序设计大作业分组报名表项目名称 简易聊天应用程序的设计与实现项目功能网络聊天室通常直称聊天室,是一种人们可以在线交谈的网络论坛,在同一聊天室的人们通过广播消息进行实时交谈。运用 java 程序编写聊天室,实现简单的聊天功能。它是图形界面,线程,流与文件系统等技术的综合应用。程序实现了聊天室的基本功能,其中有:1.启动服务器。2.启动登陆界面。3.进入客户端界面。4.发送信息。5.离开客户端界面。6.关闭服务器。姓名 性别 年级 院、系、专业 学号 备注计算机科学与技术计算机科学与技术计算机科学与技术团队成员计算机科学与技术指导教师 姓名 研究方向 软件设计 职称联系人姓名 联系
2、电话团队联系方式 邮件地址 邮编目 录一、团队介绍及人员分工 .11.1 团队介绍 .11.2 人员分工 .1二、作品概述 .12.1 创作背景 .12.2 功能概要 .12.3 相关技术 22.4 作品可行性分析 .3三、需求分析 .33.1 功能性需求 .33.2 非功能性需求 .6四、作品实现 .64.1 服务端界面实现 64.2 客户端界面实现 84.3 登录实现 94.4 聊天功能实现 .114.5 退出功能实现 .12五、作品设计、实现难点分析 .145.1 难点分析 .145.2 解决方案 .145.3 测试结果 .15计算机科学与技术专业大作业报告0一、团队介绍及人员分工1.1
3、 团队介绍吴益帆:有良好的统筹能力和领导力,能合理安排各组员工作。张咪:踏实耐心,有良好的创新能力和策划能力。沈丹丹:勤奋刻苦、有钻研精神,对待编程工作热情细心,孜孜不倦。吴晓晓:对待工作细致专注,设计能力较强。团队成员之间有较好的默契度及协作性。分工明确,各司其职,在共同的努力及相互的配合下,共同解决程序中出现的困难并尽可能的优化程序,最终完成整个项目。1.2 人员分工吴益帆:负责程序最后的整理,完成部分功能及错误的处理。张咪:负责程序的编码部分及项目具体功能的实现。沈丹丹:负责程序的界面部分,为改程序搜索解决的方案。吴晓晓:负责程序的策划部分,项目的可行性分析及文档的编写工作。二、作品概述
4、2.1 创作背景网络聊天室通常直称聊天室,是一种人们可以在线交谈的网络论坛,在同一聊天室的人们通过广播消息进行实时交谈。在当今信息时代,越来越多的聊天工具被应用,java 语言是当今流行的网络编程语言,它具有面向对象,与平台无关,安全,多线程等特点。使用 java 语言不仅可以实现大型企业级的分布式应用系统,还能够为小型的的,嵌入式设备进行应用程序的开发。面向对象的开发是当今世界最流行的开发方法,它不仅具有更贴近自然地语义,而且有利于软件的维护和继承,锻炼我们熟练地应用面向对象的思想和设计方法解决实际问题的能力。2.2 功能概要运用 java 程序编写聊天室,实现简单的聊天功能。它是图形界面,
5、线程,流与文件系统等技术的综合应用。其界面主要采用了 java.awt 包,java.swing 包等。计算机科学与技术专业大作业报告1程序实现了聊天室的基本功能,其中有:(1) 服务器端功能描述:启动服务器端:点击“开启”按钮,启动服务;端口服务:输入服务器的某个端口号,开启服务器的这个端口;显示在线用户信息:在右边的用户列表显示所有在线的用户信息;显示用户聊天信息:在左边的聊天信息区域内显示所有用户所发的信息;服务端关闭:点击“关闭按钮,关闭服务。(2) 客户端功能描述:启动客户端:运行客户端程序,启动客户端;选择服务器端口号:输入想要连接的服务器的端口号;用户登录:填入用户名,点击“登录
6、”按钮,连接相应服务器;显示在线用户:在右边的用户列表中可以看到当前在线的用户;发送/接受聊天消息:在下面的文本输入区域输入要发送的内容,点击发送可以在左边的聊天信息区域内显示自己以及其他用户所发的信息;用户离线:点击“离线”按钮,与服务器断开连接;客户端关闭:关闭客户端图形用户界面,关闭客户端。2.3 相关技术(1) Java 概述JAVA 语言有下面一些特点:简单、面向对象、分布式、解释执行、鲁棒、 安全、体系结构中立、可移植、高性能、多线程以及动态性。丰富的类库 JAVA 提供了大量的类以满足网络化、多线程、面向对象系统的需要。语言包提供的支持包括字符串处理、多线程处理、数学函数处理等,
7、可以用它简单地实现 JAVA 程序的运行平台。实用程序包提供的支持包括哈希表、堆栈、可变数组、时间和日期等。输入输出包用统一的“流“模型来实现所有格式的I/O,包括文件系统、网络、输入低级网络包用于实现 Socket 编程。抽象图形用户接口包实现了不同平台的计算机的图形用户接口部件, 包括窗口、菜单、滚动条、对话框等,使得 JAVA 可以移植到不同平台的机器。网络包支持 Internet 的TCP/IP 协议,提供了与 Internet 的接口。它支持 URL 连接,WWW 的即时访问,并且简化了用户/服务器模型的程序设计。(2) 套接字Socket,简称套接字,用于实现网络上客户和服务器之间
8、的连接。也就是说计算机科学与技术专业大作业报告2网络上两个或两个以上双工方式通信的进程之间总有一个连接,这个连接的端点成为套接字,套接字是在比较低的层次上通信的。具体的说:一个服务器应用程序一般侦听一个特定的端口等待客户端的连接请求,当一个连接请求到达时,客户端和服武器端建立一个通信连接,在连接过程中,客户端被分配一个本地端口与一个 Socket 建立连接,客户端通过写Socket 来通知服务器,以读 Socket 中的信息,类似的服务器也获得一个本地端口,它需要一个新的端口号来侦听原始端口上的其他连接请求。服务器也通过它的本地端口连接一个 Socket,通过读写和客户端通信。Socket 程
9、序的工作过程:1.建立 Socket 连接:在通信开始之前由通信双方确认身份,建立一条专用的虚拟连接道。2.数据通信:利用虚拟连接通道传送数据信息进行通信。3.关闭:通信结束时,再将所建的虚拟连接拆除。2.4 作品可行性分析由于本软件知识一个聊天程序,程序只提供用户之间的聊天功能,故对网络传输数据要求不是很高,只要正常的传输速度就可以了。三、需求分析3.1 功能性需求本聊天室分为聊天室服务端和聊天室客户端,服务端与客户端之间通过套接字 Socket(TCP)连接。在 java 中使用套接字相当简单,Java API 为处理套接口的通信提供了一个类 .Socket.,使得编写网络应用程序相对容易
10、服务器采用多线程以满足多用户的请求,并通过创建一个 ServerSocket 对象来监听来自客户的连接请求,默认 IP 地址为:localhost 默认端口为 8888。(1) 聊天室服务端模块,包括端口服务、启动服务、关闭服务、显示在线用户、显示用户聊天信息,如图 3.1 所示;计算机科学与技术专业大作业报告3图 3.1 聊天室服务端模块图端口服务:输入要侦听的端口,默认为 8888;启动服务:启动服务器,并开始在设置的端口中侦听,客户端用户可以登录并开始聊天;关闭服务:关闭服务器,侦听结束。客户端用户不能再聊天;显示在线用户:服务器列表显示在线用户数和所有在线用户名称;显示用户聊天信息:在
11、文本区中显示所有用户聊天信息和登录、退出信息。(2) 聊天室客户端模块,包括用户登录、用户离线、连接设置、发送和接收聊天信息、显示在线用户、退出,如图 3.2 所示:图 3.2 聊天室客户端模块图计算机科学与技术专业大作业报告4用户登录:只能在聊天室服务端已开启的情况下,用户点击“按钮”才能登录,用户登录之后才能开始聊天,登录后不能再修改用户设置和连接设置;用户离线:用户点击“离线”按钮,退出聊天,与服务器断开连接;连接设置:用户可以设置自己连接的服务器的 IP 地址和端口号,默认的连接地址为:localhost:8888;发送和接收聊天信息:用户可以给所有人发送信息,并能看到其他用户发送给所
12、有人的消息;显示在线用户:服务器列表显示在线用户数和所有在线用户名称;退出:关闭所有聊天并退出客户端。(3) 程序流程:首先启动服务器,用户打开客户端,输入服务器端口号,再输入用户名就可以登录,登录以后会显示当前在线的用户信息,用户可以看到其他用户所发的信息,自己也可以发送信息。用户点击离线就会与服务器断开连接,最后关闭服务器,如图 3.3 所示:入入入入入入入入入入入入入入入入入入入入入入入入入入入计算机科学与技术专业大作业报告5图 3.3 程序流程图3.2 非功能性需求(1) 安全需求本程序能防卫禁止未登录用户进行通信,防止数据丢失,需要输入用户名、端口号连接相应的服务器才允许用户间的通信
13、。(2) 性能需求本程序使用的对象是所有运行该程序的用户,用户在连接服务器可以进行客户端之间的通信。(3) 易用性需求本程序的使用对象计算机水平一般,有一定的易用性上的要求,程序应当存在着一些友好性的提示,提高程序的友好度。(4) 可维护性需求本程序能够及时发现并纠正系统故障,对系统数据进行备份,有系统还原功能。(5) 健壮性需求本程序在遭遇非法输入数据,能够排除该数据并继续运行;对于系统异常有完备的预警预防处理机制。四、作品实现4.1 服务端界面实现在服务端启动后,要显示“简易聊天室服务器”的图形用户界面,如图6.1所示:图 6.1 服务端图形用户界面 “简易聊天室服务器”的图形用户界面实现
14、的主要代码如下:private Label svrIP = new Label(“服务器IP:“);private TextField showSvrIP = new TextField();private Label svrPort = new Label(“服务器端口:“ );private TextField getSvrPort = new TextField(“8888“);private Button enter = new Button(“启动“ );计算机科学与技术专业大作业报告6private TextArea output = new TextArea();private
15、Label user = new Label(“当前在线用户(0)“);private List list = new List();private void setup() Panel top = new Panel();top.setLayout(new FlowLayout();top.add(svrIP);svrIP.setBackground(bg);top.add(showSvrIP);showSvrIP.setBackground(bg);top.add(svrPort);svrPort.setBackground(bg);top.add(getSvrPort);getSvrPo
16、rt.setBackground(bg);top.add(enter);enter.setBackground(bg);Panel east = new Panel();east.setLayout(new BorderLayout();east.add(“North“, user);user.setBackground(bg);east.add(“Center“, list);list.setBackground(bg);setLayout(new BorderLayout();add(“North“, top);top.setBackground(bg);add(“East“, east)
17、;east.setBackground(bg);add(“Center“, output);output.setBackground(bg);setBackground(bg);点击“启动”按钮,开启默认的服务器8888端口,如图6.2所示:图 6.2 服务端端口开启8888 端口开启实现代码如下:try server = new ServerSocket(Integer.parseInt(getSvrPort.getText();rightNow = Calendar.getInstance().getTime().toLocaleString();output.append(rightNo
18、w + “n开启服务器.nn“ );enter.setLabel(“关闭“ );ht = new Hashtable();ht_s = new Hashtable();st = new ServerThread();serving = true;计算机科学与技术专业大作业报告7 catch (IOException ioe) output.append(“Error: “ + ioe + “nn“);4.2 客户端界面实现在客户端启动后,显示“简易聊天室客户端”的图形用户界面,如图6.3所示:图 6.3 客户端图形用户界面“简易聊天室客户端”的图形用户界面实现的主要代码如下:private B
19、utton B_login = new Button(“登陆“ );private Button B_logout = new Button(“离线“);private Button B_send = new Button(“发送“);private Label userName = new Label(“您的用户名:“ );private TextField getUserName = new TextField(); / 获取用户名private Label svrIP = new Label(“当前服务器IP:“ );private TextField getSvrIP = new Te
20、xtField(); / 获取服务器 IP 地址private Label svrPort = new Label(“当前服务器端口:“ );private TextField getSvrPort = new TextField(); / 获取服务器端口private TextArea input = new TextArea(); / 输入文本框private TextArea output = new TextArea(); / 输出文本框private Label user = new Label(“当前在线用户(0)“);private List list = new List();
21、private void setup() Panel top1 = new Panel();top1.setLayout(new BorderLayout();top1.add(“West“, userName);userName.setBackground(bg);top1.add(“Center“, getUserName);getUserName.setBackground(bg);Panel top2 = new Panel();top2.setLayout(new BorderLayout();top2.add(“West“, svrIP);svrIP.setBackground(b
22、g);计算机科学与技术专业大作业报告8top2.add(“Center“, getSvrIP);getSvrIP.setBackground(bg);Panel top3 = new Panel();top3.setLayout(new BorderLayout();top3.add(“West“, svrPort);svrPort.setBackground(bg);top3.add(“Center“, getSvrPort);getSvrPort.setBackground(bg);Panel top4 = new Panel();top4.setLayout(new BorderLayo
23、ut();top4.add(“North“, top1);top4.add(“Center“, top2);top4.add(“East“, top3);Panel east = new Panel();east.setLayout(new BorderLayout();east.add(“North“, user);user.setBackground(bg);east.add(“Center“, list);list.setBackground(bg);Panel center = new Panel();center.setLayout(new BorderLayout();center
24、.add(“Center“, output);output.setBackground(bg);center.add(“South“, input);input.setBackground(bg);center.add(“East“, east);east.setBackground(bg);Panel south = new Panel();south.setLayout(new FlowLayout();south.add(B_login);B_login.setBackground(bg);south.add(B_send);B_send.setBackground(bg);south.
25、add(B_logout);B_logout.setBackground(bg);setLayout(new BorderLayout();add(“North“, top4);add(“Center“, center);add(“South“, south);setBackground(bg);4.3 登录实现在客户端输入用户名,点击“登陆”,客户端显示系统时间和“您已成功登陆”( 如图6.4所示),并将用户名发送给服务端。服务端接收来自客户端的数据,显示“sdd登陆”以及将用户名显示在用户列表中(如图6.5所示),并将用户数据发送给所有在线的客户端。计算机科学与技术专业大作业报告9图 6.
26、4 用户登录用户登录代码实现如下:if (login) return;boolean accepted = false, refused = false;String line = new String(“);try connection = new Socket(getSvrIP.getText(),Integer.parseInt(getSvrPort.getText();in = new DataInputStream(connection.getInputStream();out = new DataOutputStream(connection.getOutputStream();o
27、ut.writeUTF(“L “ + getUserName.getText();while (!accepted if (line.charAt(0) = R) refused = true; if (line.charAt(0) = A) accepted = true; if (refused) rightNow = Calendar.getInstance().getTime().toLocaleString();output.append(rightNow + “n登录失败 请使用合法用户名.nn“);if (accepted) rightNow = Calendar.getInst
28、ance().getTime().toLocaleString();output.append(rightNow + “n您已成功登陆.nn“ );login = true;图6.5 服务端显示用户服务端向在线用户发送当前在线用户列表代码实现如下:计算机科学与技术专业大作业报告10login = true;list.add(userName);user.setText(“User (“ + list.getItemCount() + “)“);String str = list.getItems();line = “A “; / acceptedfor (int i = 0; i str.le
29、ngth; i+) line += (stri + “ “); out.writeUTF(line);line = “L “ + userName;rightNow = Calendar.getInstance().getTime().toLocaleString();output.append(rightNow + “n“ + userName + “ 登陆.nn“ );客户端获取当前在线用户列表代码实现如下:String str = line.split(“ “);for (int i = 1; i str.length; i+) list.add(stri);user.setText(“
30、当前在线用户(“ + list.getItemCount() + “)“);4.4 聊天功能实现开启多个客户端,并登录。在输入框中输入信息,点击“发送”,数据传送至服务端(如图 6.6 所示),再由服务端数据发送给其他客户端。每个客户端都接收服务端发送过来的数据,并显示在消息框中,如图 6.7 所示。图6.6 服务端显示消息用户发送消息代码实现如下:private void sendMsg() if (!login)return;try 计算机科学与技术专业大作业报告11if (input.getText().equals(“) output.append(“n发送内容不能为空 请重新输入nn
31、“);return;out.writeUTF(“M “ + input.getText();input.setText(“); catch (IOException ioe) output.append(“Error: “ + ioe + “nn“);图6.7 客户端端显示消息4.5 退出功能实现当用户点击“离线”,该用户的客户端显示“您已成功离线”,其他用户的客户端显示“wxx离线” (如图6.8所示);服务端显示“wxx离线”(如图6.9所示)。计算机科学与技术专业大作业报告12图6.8 客户端离线图6.9 服务端显示用户离线离线实现代码如下:private void Quit() if
32、(!login)return;try out.writeUTF(“Q“);user.setText(“当前在线用户 (0)“); catch (IOException ioe) output.append(“Error: “ + ioe + “nn“);计算机科学与技术专业大作业报告13如果用户直接关闭客户端窗口,服务端则显示“客户端 zm 意外关闭”,如图 6.10 所示:图6.10 服务端显示用户意外关闭客户端意外关闭实现代码如下:catch (SocketException se) ht.remove(userName);ht_s.remove(connection);list.remo
33、ve(userName);output.append(“客户端“ + userName + “意外关闭n“);五、作品设计、实现难点分析5.1 难点分析一个项目的开发过程并不总是一帆风顺的,其中难免会遇到困难,使编程无法继续下去。本程序的难点在于对通信机制的了解以及实现,同时窗口之间的通讯也需要认真分析。5.2 解决方案针对程序设计过程中遇到的困难,我们采取了积极有效的解决方法:团队讨论、上网搜索及向有经验的人员请教。查看了大量相关资料,最终经过反复的调计算机科学与技术专业大作业报告14试及测试,解决了上述的难点,实现了服务器与客户端的通信。5.3 测试结果程序在 Eclipse 中运行测试,能实现预期的功能,项目完工!