收藏 分享(赏)

基于Java网络聊天室系统毕业设计说明书.doc

上传人:为人民服务 文档编号:2355801 上传时间:2018-09-12 格式:DOC 页数:18 大小:214.50KB
下载 相关 举报
基于Java网络聊天室系统毕业设计说明书.doc_第1页
第1页 / 共18页
基于Java网络聊天室系统毕业设计说明书.doc_第2页
第2页 / 共18页
基于Java网络聊天室系统毕业设计说明书.doc_第3页
第3页 / 共18页
基于Java网络聊天室系统毕业设计说明书.doc_第4页
第4页 / 共18页
基于Java网络聊天室系统毕业设计说明书.doc_第5页
第5页 / 共18页
点击查看更多>>
资源描述

1、课程设计1操作系统课程设计报告课程设计2目录一 设计要求和目的3二 背景知识4三 客户端设计5四 客户端主要代码6五 设计体会9课程设计3摘要随着网络信息时代的来临,Internet 应用越来越广泛 人们越来越习惯于在网上获取和交流信息。据调查显示,80%以上的人上网都会打开聊天工具来聊天,而几乎每一个年轻人都会去聊天。使用网上聊天已经成为现代年轻人一种新的交往方式。聊天室更适合于陌生人之间进行较为主观、感兴化的讨论。所以有大部分的人会进入聊天室聊天 它会给人一个完全自由的聊天世界。因此我们联系所学的操作系统、数据库和 MFC 知识决定做一个简易的聊天系统。1、设计要求和目的此课题是实现一个即

2、时通信系统完成 1:进程间通信、并发(同步/互斥)、文件读写2:内存管理、Dll 、Windows 消息机制、IO。课题任务分工:客户端子系统:在客户端系统的功能实现上,可以分为以下几个部分:1进程信息的输入系统把用户进程要求发送的信息由键盘输入从文件读取。这部分功能是客户端子系统的基本部分,这个功能是以后各个部分的基础。系统要求做到即能够从其它子系统中共享一部分信息2进程信息的存储:将进程的信息存储到客户端系统中,以及将发送的信息保存在文件中,以备以后进程之间通信确认以及查询。3通信数据的传递及接收:将客户所发送的信息由客户端由网络传到服务器端上,并且接受航服务器返回的接收方发送的信息,然后

3、存储起来。课程设计4用户客户端服务器端用户设置连接设置用户发送信息通信内容用户得到的信息处理用户退出服务器日志 数据通信信息连接保存保存处理监控2背景知识SOCKETSocket 可以看成在两个程序进行通讯连接中的一个端点,是连接应用程序和网络驱动程序的桥梁,Socket 在应用程序中创建,通过绑定与网络驱动建立关系。此后,应用程序送给 Socket 的数据,由 Socket 交网络驱动程序向网络上发送出去。计算机从网络上收到与该 Socket 绑定 IP 地址和端口号相关的数据后,由网络驱动程序交给 Socket,应用程序便可从该 Socket 中提取接收到得数据,网络应用程序就是这样通过

4、Socket 进行数据的发送与接收的(1) 创建 Socket;(2) 打开连接到 Socket 的输入/ 出流;(3) 按照一定的协议对 Socket 进行读/ 写操作;课程设计5(4) 关闭 Socket.IO 技术阻塞模式可能造成阻塞的函数有:connect()、accept()、读写函数C/S 两端通过 Socket 机制进行连接(1) 客户端的编程流程:a 创建 Socket 对象,向 Server 的监听端口请求;b 通过向新 Socket 中读写数据与 Server 端通信;c 关闭 Socket,结束与 Server 端;(2)服务器端的编程流程:1 打开 Server Soc

5、ket,创建一个服务器型套接字和一个普通套接字,服务器型套接字在指 定端口为客户端请求的 Socket 服务;2 等待来自客户端的 Client 端的请求;3 接收 Client 端的请求,用返回的 Socket 建立连接;4 通过向 Socket 中读写数据来与 Client 端通信;5 关闭 Socket,结束与当前 Client 端的通信;6 关闭 SerketSocket 对象结束监听服务。3客户端设计客户端主要完成建立连接、消息输入、消息发送、消息存储功能。功能含义如下:1.建立连接:建立一个 ServerSocket 连接,不断侦听是否有服务端连接或者断开连接。2.消息输入:根据用

6、户输入的消息,将消息显示在屏幕面板上。3.消息发送:把用户输入的消息作为字符串通过 Socket 端口发送到服务器。4.消息存储:把用户输入的消息存储到 data.txt 文件中,以便用户以后查阅聊天记录。客户端设计如下:1.界面设计2.连接设计3.接收信息设计4.用户信息设计5.帮助设计客户端用户设计的 IP 地址和端口号连接到相应的服务器,通过接收用户输入的消息,然后通过所监听的端口把消息发送到服务端,由服务端把消息发送课程设计6到指定的用户用户连接服务器1 客户端请求连接客户端通过 connect()请求连接,填写端口号以及 IP 地址,填写自己的信息。2 服务器端响应服务器端的监听器监

7、听到客户端的连接请求后,检测后允许客户端连接到服务器。3 给客户端返回信息连接成功后服务器返回给客户端连接成功的信息,并且给所有的用户发送用户登录信息。4 关闭 Socket 连接当以上的程序都正常运行后,需要关闭 Socket 连接,否则将会浪费服务器与客户端之间的资源。5 用户退出5.1 接收退出信息当用户退出时,客户端将会用基于 Socket 的对象输出流发送给服务器退出对象。5.2 在线列表中删除用户用户退出后应该把用户从在线列表中删除,否则用户退出用户还在在线列表中,那么该用户下次将会无法登录。5.3 更新在线列表用户退出后将服务器端监控界面的用户列表更新。否则用户数据将会不同步。4

8、客户端主要代码/* 事件处 理*/public void actionPerformed(ActionEvent e) Object obj = e.getSource();if (obj = userItem | obj = userButton) /用户信息设置/调出用户信息 设置对话框UserConf userConf = new UserConf(this,userName);userConf.setVisible(true);userName = userConf.userInputName;课程设计7else if (obj = connectItem | obj = connec

9、tButton) /连接服务端设置/调出连接设 置对话框ConnectConf conConf = new ConnectConf(this,ip,port);conConf.setVisible(true);ip = conConf.userInputIp;port = conConf.userInputPort;else if (obj = loginItem | obj = loginButton) /登录Connect();else if (obj = logoffItem | obj = logoffButton) /注销DisConnect();showStatus.setText

10、(“);else if(obj = dataItem)tryFile read=new File(“data.txt“);Desktop.getDesktop().open(read);catch (IOException e1)e1.printStackTrace();else if (obj = clientMessage | obj = clientMessageButton) /发 送消息SendMessage();clientMessage.setText(“);else if (obj = exitButton | obj = exitItem) /退出int j=JOptionP

11、ane.showConfirmDialog(this,“真的要退出吗?“,“退出“ ,JOptionPane.YES_OPTION,JOptionPane.QUESTION_MESSAGE);if (j = JOptionPane.YES_OPTION)if(type = 1)DisConnect();System.exit(0);else if (obj = helpItem) /菜单栏中的帮助/调出帮助对话 框Help helpDialog = new Help(this);课程设计8helpDialog.setVisible(true);public void run()while(!s

12、ocket.isClosed()tryString type = (String)input.readObject();if(type.equalsIgnoreCase(“系统信息“)String sysmsg = (String)input.readObject();SimpleDateFormat sdf = new SimpleDateFormat(“yyyy-MM-dd HH:mm:ss“); String ly_time = sdf.format(new Date();textarea.append(ly_time);textarea.append(“n“);textarea.app

13、end(“系统信息: “+sysmsg);else if(type.equalsIgnoreCase(“服务关闭“)output.close();input.close();socket.close();textarea.append(“服务器已关闭!n“ );break;else if(type.equalsIgnoreCase(“聊天信息“)String message = (String)input.readObject();SimpleDateFormat sdf = new SimpleDateFormat(“yyyy-MM-dd HH:mm:ss“); String ly_time

14、 = sdf.format(new Date();textarea.append(ly_time);textarea.append(“n“);textarea.append(message);tryrecord=new BufferedWriter(new FileWriter(“data.txt“,true);record.write(ly_time);record.newLine();record.write(message);record.newLine();record.close();catch (IOException e)e.printStackTrace();课程设计9else

15、 if(type.equalsIgnoreCase(“用户列表“)String userlist = (String)input.readObject();String usernames = userlist.split(“n“);combobox.removeAllItems();int i =0;combobox.addItem(“所有人“);while(i usernames.length)combobox.addItem(usernamesi);i +;combobox.setSelectedIndex(0);showStatus.setText(“在线用 户 “ + usernam

16、es.length + “ 人“);catch (Exception e )System.out.println(e);5设计体会本次课程设计历时将近两个月,当老师布置课程设计题目时还觉得这个课程设计很简单,再加上正在学 Java,以及相关界面设计,当时还没有学 Socket编程,觉得只要学号 Socket 就行差不多了,但是在做的过程中,要写需求分析等资料,之前也没怎么写过,对这方面不是很了解,所以遇到了种种困难,好多功能和逻辑都没想到,导致后来写程序的时候走了很过弯路。还有就是在学习 Socket 编程的时候,本来觉得不就是 Java 里面的一个类吗,这还不好写吗,但是真的用起来,就没有那

17、么简单了,不是这儿出错就是那儿出错,最后看了几个例子,然后有看了好多的 API 函数,慢慢的,也就写的越来越顺手了。课程设计10服务器端程序设计模块: 作为 C/S 模式下的系统开发,很显然服务器端程序的设计是非常重要的。下面就服务器端的相关程序模块进行设计,并一定程度上实现了相关功能。主服务器类的设计设计服务器时需要考虑如下几个因素:(1)服务器的运行速度;(2)服务器的响应速度,包括新建连接和发送数据的响应速度;(3)I/O 吞吐量;(4)其他:流量控制(QoS) 、安全性。针对 TCP/IP 协议的数据结构,设计服务器的程序结构需要考虑以下的因素:(1)多线程;(2)多进程;(3)单线程

18、。主服务器类实现了服务器端的多线程,使用 SeverSocket s=newServerSocket(8080)语句在 8080 端口创建套接口;使用 new ServerThread(socket)语句创建新的线程。主服务器类调用 ServerThread 类,而每个 ServerThread 实体就是一个独立的线程,刚好对应于客户端的连接请求响应线程。服务器端有一个(或多个)进程在指定的端口等待客户的连接信息,一旦连接成功,就可以按设计的数据交换方法和格式进行数据传输。客户端只在需要的时候向服务器端发出连接请求。实现界面如图课程设计11服务器端完成的功能是:对服务器的某一可用端口进行监听,

19、以获得客户端请求,从而对客户端请求进行处理。因为是多客户同时请求,所以要采用多线程,为每一个在线用户分配一个线程,实时处理每个客户端的请求。因此,对服务器端程序抽象如下:2、公共数据处理 处理公共数据。如在线人数统计,客户的公共数据(如通知等) ,客户数据资料的存储与读取等(与数据库交互) ;3、端口监听器监听服务器某一端口,为每一在线客户建立一个会话线程;4、客户请求处理 课程设计12处理客户的请求。根据客户的请求执行相应的操作。5、服务器管理器服务器端的管理工具,如对数据进行统计服务器端的结构图:客户端服务器端用户发送信息通信内容用户得到的信息处理用户退出服务器日志 数据通信信息连接保存保

20、存处理监控服务器设置服务器实现所涉及的几个主要类以及各个类中主要的方法实现:1. ChatServer.java 服务器的主框架类。此类实现接口 ActionListener,用于对用户事件的监听,以及对事件的处理。/* 事件处 理*/public void actionPerformed(ActionEvent e)Object obj = e.getSource();课程设计13if (obj = startServer | obj = startItem) / 启动服务端startService(); else if (obj = stopServer | obj = stopItem)

21、 / 停止服务端int j = JOptionPane.showConfirmDialog(this, “真的停止服务吗?“, “停止服务“ ,JOptionPane.YES_OPTION, JOptionPane.QUESTION_MESSAGE);if (j = JOptionPane.YES_OPTION)stopService(); else if (obj = portSet | obj = portItem) / 端口设置/ 调出端口设 置的对话框PortConf portConf = new PortConf(this);portConf.setVisible(true); el

22、se if (obj = exitButton | obj = exitItem) / 退出程序int j = JOptionPane.showConfirmDialog(this, “真的要退出吗?“, “退出“ ,JOptionPane.YES_OPTION, JOptionPane.QUESTION_MESSAGE);if (j = JOptionPane.YES_OPTION)stopService();System.exit(0); else if (obj = helpItem) / 菜单栏中的帮助/ 调出帮助对话 框Help helpDialog = new Help(this)

23、;helpDialog.setVisible(true); else if (obj = sysMessage | obj = sysMessageButton) / 发送系统消息sendSystemMessage(); /* 此函数用于 启动服务 器,并在指定的端口监听客户端的连接*/public void startService()课程设计14tryserverSocket = new ServerSocket(port, 10);messageShow.append(“服务端已经启动,在 “ + port + “端口侦听.n“);startServer.setEnabled(false

24、);startItem.setEnabled(false);portSet.setEnabled(false);portItem.setEnabled(false);stopServer.setEnabled(true);stopItem.setEnabled(true);sysMessage.setEnabled(true); catch (Exception e)e.printStackTrace();userLinkList = new UserLinkList();listenThread = new ServerListen(serverSocket, combobox, messa

25、geShow,showStatus, userLinkList);listenThread.start();/* 此函数用于关闭服务器,关闭服务器后给所有在线用户发送服务器关闭的信息,服 * 务器关 闭后,所有的 input,output输入输出流都会关闭,并且socket也会关闭。* 所有的数据都恢复初始化*/public void stopService()try/ 向所有人发 送服务器关闭的消息sendStopToAll();listenThread.isStop = true;serverSocket.close();int count = userLinkList.getCount(

26、);int i = 0;课程设计15while (i count)Node node = userLinkList.findUser(i);node.input.close();node.output.close();node.socket.close();i+;stopServer.setEnabled(false);stopItem.setEnabled(false);startServer.setEnabled(true);startItem.setEnabled(true);portSet.setEnabled(true);portItem.setEnabled(true);sysMe

27、ssage.setEnabled(false);messageShow.append(“服务端已经关闭n“);combobox.removeAllItems();combobox.addItem(“所有人“); catch (Exception e)e.printStackTrace();2. ServerListen.java 服务端的侦听类。此类继承于 Thread 类,服务器的监听类,等待用户的连接,并且给在线用户发送上线用户的信息提示。public void run()while(!isStop client.socket = server.accept();client.output

28、 = new ObjectOutputStream(client.socket.getOutputStream();client.output.flush();client.input = new ObjectInputStream(client.socket.getInputStream();client.username = (String)client.input.readObject();/显示提示信息课程设计16combobox.addItem(client.username);userLinkList.addUser(client);SimpleDateFormat sdf = n

29、ew SimpleDateFormat(“yyyy-MM-dd HH:mm:ss“); String str = sdf.format(new Date();textarea.append(str + “n“ + “用户 “ + client.username + “ 上 线 “ + “n“);textfield.setText(“在线用户“ + userLinkList.getCount() + “人n“);recvThread = new ServerReceive(textarea,textfield,combobox,client,userLinkList);recvThread.st

30、art();catch(Exception e)3. ServerReceive.java 服务器收发消息的类。此类也继承于 Thread 类,主要处理客户端发来的信息,并对信息进行必要的处理,通过 input 输入流以及 output 输出流把信息输出在指定用户的对话框中。除此之外还对用户下线时作必要的处理,提示用户下线,以及显示在线人数。public void run()/向所有人 发送用户 的列表sendUserList();while(!isStop if(type.equalsIgnoreCase(“聊天信息“)String toSomebody = (String)client.i

31、nput.readObject();String status = (String)client.input.readObject();String action = (String)client.input.readObject();String message = (String)client.input.readObject();String msg = client.username +“ “+ action+ “对 “+ toSomebody + “ 说 : “+ message + “n“;if(status.equalsIgnoreCase(“悄悄话“ )msg = “ 悄悄话

32、“ + msg;SimpleDateFormat sdf = new SimpleDateFormat(“yyyy-MM-dd HH:mm:ss“); String str = sdf.format(new Date(); 课程设计17textarea.append(str + “n“ + msg);if(toSomebody.equalsIgnoreCase(“所有人“)sendToAll(msg);/向所有人发送消息elsetryclient.output.writeObject(“聊天信息“);client.output.flush();client.output.writeObject

33、(msg);client.output.flush();catch (Exception e)/System.out.println(“#“+e);Node node = userLinkList.findUser(toSomebody);if(node != null)node.output.writeObject(“聊天信息“ ); node.output.flush();node.output.writeObject(msg);node.output.flush();else if(type.equalsIgnoreCase(“用户下线“ )Node node = userLinkLis

34、t.findUser(client.username);userLinkList.delUser(node);String msg = “用户 “ + client.username + “ 下线n“;int count = userLinkList.getCount();combobox.removeAllItems();combobox.addItem(“所有人“);int i = 0;while(i count)node = userLinkList.findUser(i);if(node = null) i +;continue; combobox.addItem(node.usern

35、ame);课程设计18i+;combobox.setSelectedIndex(0);SimpleDateFormat sdf = new SimpleDateFormat(“yyyy-MM-dd HH:mm:ss“); String str = sdf.format(new Date(); textarea.append(str + “n“ + msg);textfield.setText(“在线用户“ + userLinkList.getCount() + “人n“);sendToAll(msg);/向所有人发送消息sendUserList();/重新发送用户列表, 刷新break;catch (Exception e)/System.out.println(e);

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 学术论文 > 毕业论文

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报