版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、目录需求分析 5 5 5 5 5总体设计 5 5 5 62.4 模块划分 6详细设计 6 6 6 8系统实现编码及运行结果 9 9 11 12结论与总结 19 20 20课程设计分工及参考文献 20 20 21附录 22关键代码 22 需求分析1.1课程设计目的本次计算机网络课程设计,旨在通过该课程设计,使学生了解、掌握TCP、UDP协议的原理;了解、掌握Socket编程的方法;了解、掌握应用协议设计的思想;利用Winsock API或者Java Socket API编制一个能部署在Internet上的点对点数据交换P2P、HTTP/FTP效劳器系统、共享白板。1.2课程设计要求要求每组学生从
2、上述3个系统中任选一个,独立完成系统的功能设计和实现,使所实现的系统可以能够包含主要的内容要求,并要求学生必须在报告中明确具体分工情况。1.3选题与操作流程在网络越来越兴旺的今天,人们对网络的依赖越来越多,越来越离不开网络,由此而产生的聊天工具越来越多,类似QQ、网络聊天时一类的聊天系统的开展日新月异。因此,基于我们实际的知识结构构成以及网络聊天在当今时代的盛行趋势,本课程设计小组选择了课程设计题目点对点数据交换P2P,用于实现基于效劳器转发的任意多点间的数据共享与交换。其具体设计内容如下:1类似P2P的QQ聊天系统,有客户端和效劳器端。2效劳器端记录当前在线客户列表,把客户列表发送给每一个在
3、线客户,并实时刷新。3任一个客户可以和任意其它的客户进行交互,即从在线客户列表中选择一个或一组其它客户通过效劳器转发彼此进行交互,包括信息交互,文件交互。总体设计2.1总体设计概念为实现网络聊天的功能,采用Java Socket编程,效劳器与客户端采用了TCP/IP连接方式,在设计聊天方案时,实行将所有信息发往效劳器端,再由效劳器进行分别处理的思路,效劳器端是所有信息的中心。效劳器端可以查看所有用户的聊天记录,监控所有用户的状态,发出用户上线提示等公告,客户端那么提供接收公告的功能。2.2系统功能本课程设计按照实验的具体要求,首先应用Socket编程创立客户端和效劳器端,它们之间通过一个交互的
4、连接来实现数据通信;然后在客户端 设置一个监听器,用于监听效劳器发来的消息;最后在客户端设置点对点的文件交互需要用到的接受和发送类,以及表征文件传输过程的进度条。2.3系统架构1选择传输控制协议TCP,使用Java的Socket编程机制,分别建立客户端与效劳器端;2分别设计客户端与效劳器端的界面,并使用Java应用程序用户界面的开发工具包Swing进行窗体界面的布局,以及实现局部窗口事件的相应。2.4 模块划分1效劳器端,主要实现向各个客户端发布系统消息,接受来自客户端的各种信息并分别处理。具体功能如下:连接控制:管理作用:刷新列表:登陆信息:聊天记录:消息处理:2客户端:主要实现向效劳器端发
5、布消息,并且对来自效劳器的消息做出相应的响应。具体功能如下:连接功能:登录设置:监听作用:消息处理:聊天记录:消息处理:传输进度:文件传输: 详细设计软件层次模型效劳器层次结构和客户端层次结构。协议结构在Java socket通信中使用的协议是TCP协议。TCP协议是TCP/IP协议中面向连接的运输层协议,它提供全双工的和可靠交付的效劳。由于通信是全双工方式,因此TCP连接的任何一方都能够发送和接收数据。发送端的应用进程按照自己产生数据的规律,不断地将数据块其长短可能各异陆续写入到TCP的发送缓存中。TCP再从发送缓存中取出一定数量的数据,将其组成TCP报文段逐个传给IP层,然后发送出去。接收
6、端从IP层收到TCP报文段后,先将其存在接收缓存中,然后让接收端的进程从接收缓存中将数据块逐个读取。 TCP协议的报文分为首部和数据两个局部。众所周知首部中含有源端口、目的端口、序号、确认号等内容。因此在利用socket通信时,要想实现不同的功能和数据传输,包括指令和纯数据的传输,可以通过在TCP报文的数据局部进行再分段来实现。由此指定一些套接字,并接利用这些套接字来对不同的数据进行分段,这样就能轻松地将提取所需数据以实现不同功能。本课程设计正是利用上述方法来建立一个基于TCP协议的协议。这个协议的主要组成局部为套接字及数据段。在程序中主要使用的套接字有:“NICKNAME:、“SPECIAL
7、:、“$SPECIAL$、“FLENGTH:、“FILEECHO:以及“FILE:等。其中各个套接字又有不同的使用方法。如果数据没有使用套接字,那么就被默认为这一数据是播送数据及聊天室的公开数据,这样的数据将会全部传给聊天室里的各个用户并且会保存在聊天室效劳器里。如果使用的是“NICKNAME:,那么其后数据为发此数据者所要变更的昵称。另外,将“$SPECIAL$当作划分两个数据的套接字,通常在一个套接字之后有两种数据的情况下使用。如果使用的是“SPECIAL:,那么其后数据至“$SPECIAL$之间的为目的昵称,而在“$SPECIAL$之后的那么为所要传输的信息数据,同时我们拟定这个套接字为
8、私聊套接字,虽通过效劳器转发但其内容不会在效劳器上显示。假设套接字为“FILE:,那么表示该用户发出了一个对一的客户文件传送请求,此时,效劳器端同样通过控制字头后的昵称,查找到对应的接收端用户的信息,并将该用户的IP地址传递给发送端,并在效劳器端显示发送端想要对接收端传输文件的信息。协议格式如下:“FILE:+目的昵称+“$FILE$+文件名称。假设套接字为“FILEFINISH:,那么表示客户之间文件传输完毕,此时效劳器端发出文件传输完毕的信息。“FLENGTH:的套接字表示文件长度,其格式为“FLENGTH:+目的昵称+“$SPECIAL$+文件长度。这样我们在文件传输过程中就可以知道所接
9、收文件的大小同时有益于进度条的使用。套接字“FILEECHO:是为效劳器发给客户端的目的地的IP地址。使用套接字的方法能够把控制信息和数据局部一起传送到达效劳器和客户端的不同沟通,这样我们就可以利用效劳器来完成我们所需的各个效劳,无论公开聊天还是私下聊天都可以,同时还能在某种意义上保护隐私。这个socket的协议就是利用TCP协议的数据流、面向连接和全双通来实现的。数据流程图根据以上的程序模块划分,设计好效劳器端和客户端的流程图,如下:效劳器端流程:客户端流程图: 系统实现编码及运行结果 效劳器程序该段(程序代码请见附录),具体实现过程如下:启动效劳并接收连接:效劳器的任务首先是建立一个由IP
10、地址到昵称的映射的哈希表,用于存放用户的根本信息;启动效劳器后,等候建立一个连接,然后用这个连接产生的Socket创立一个Client,同时检查该用户是否已存在哈希表中,假设以存在,那么提示该次连接请求失败,从而实现限制IP的目的;假设不存在,那么将该IP地址及其昵称或默认昵称的映射添加到哈希表中,接着效劳器端向所有的用户发送管理信息,提示有新的用户登录,并且将刷新后的用户列表同时发送到各个客户端。关闭效劳:效劳器端遍历哈希表,关掉每一个用户对应的Socket,之后,关闭效劳Server。管理作用之发送消息: 效劳器端解析由客户端发送的请求,假设控制字以“SPECIAL开头,那么通过控制字后的
11、昵称从哈希表中找到对应的用户,实现效劳器端到客户端的点对点消息交互;假设不是以“SPECIAL开头,那么实现消息的播送发布。管理作用之修改昵称:首先判断新的昵称是否在哈希表中存在,假设已存在那么给出错误提示,否那么通过该用户的旧昵称在哈希表中查找到该用户,并用欲修改的昵称替换掉原昵称;接着刷新效劳器端的用户列表显示,最后刷新客户端的用户列表显示。管理作用之断开连接:假设要断开某个客户端与效劳器的连接,首先向该用户发送被管理员请出系统的信息,然后通过该用户的昵称从哈希表中找到对应socket、service及IP地址等信息,再从每一项信息对应的列表里删除该用户的信息,最后关闭该用户的socket
12、,同时刷新效劳器端以及各个客户端的用户列表显示。在效劳其中,需要同时处理多个客户端的请求,因此此处用到了多线程处理机制。在效劳器程序里创立单个Server Socket,并调用accept来等候一个新连接,一旦accept返回,就取得结果获得的socket,并用它新建一个线程,令其只为那个特定的客户端效劳,然后再调用accept,等候下一次新的连接请求。 4.1.2功能函数该段功能由ChatTookit.java文件中的ChatTookit类实现程序代码请见附录,具体实现过程如下:函数getAllNickname:该函数实现从IP地址昵称对照哈希表中得到所有的昵称的功能,函数原型如下:publ
13、ic static String getAllNickname(Hashtable ip2nickname)函数sendInfoToAll:该函数实现遍历所有已连接的客户端,并且发送输入的信息的功能,函数原型如下:public static void sendInfoToAll(ArrayList onLineUsers,String info) throws IOException函数sendInfo:该函数实现给某个特定用户发送一条信息的功能,函数原型如下:public static void sendInfo(Socket client,String info) throws IOExc
14、eption函数getIP:该函数实现从socket中得到用户的ip地址的功能,函数原型如下:public static String getIP(Socket socket) 函数getIP:该函数实现从一个hashtable中根据value得到key的功能,函数原型如下:public static String getIP(Hashtable ip2nickname,String nickname)函数getNickname:该函数实现从socket和IP地址昵称对照hashtable中得到用户的昵称的功能,函数原型如下:public static String getNickname(S
15、ocket socket,Hashtable ip2nickname)函数updateOnLineUsersList:该函数实现将在线用户列表的显示清空,并用最新的用户列表更新客户端的用户列表,只显示昵称,函数原型如下:public static void updateOnLineUsersList(List onLineUsersList,String allNickname)函数updateOnLineUsersList:该函数实现将在线用户列表的显示清空,并用最新的用户列表更新效劳器端的用户列表:显示的是ip:昵称,函数原型如下:public static void updateOnLi
16、neUsersList(List onLineUsersList,Hashtable ip2nickname)函数getSocketByIP:该函数实现根据用户ip地址得到该用户所在的socket功能,函数原型如下:public static Socket getSocketByIP(ArrayList onLineUsers,String ip)函数getServiceByIP,该函数实现根据用户ip地址得到该用户所在的service功能,函数原型如下:public static Service getServiceByIP(ArrayList allService,String ip)由于
17、效劳器端需要一次处理多个客户端的请求,所以客户端的设计均使用了Java的多线程处理机制实现。客户端程序该段功能由Client.java文件中的Client类实现(程序代码请见附录),具体实现过程如下:新建客户端:初始化该客户端的监听器、套接字、在线用户列表以及发送消息的String流,并且将客户端连接状态设置为真。初始化一个客户端时,需要用到该客户端的IP地址、端口号、在线用户列表以及聊天内容列表等信息。建立监听:创立一个BufferedReader以及一个PrintStream之后,再通过多线程机制建立对效劳器发来消息进行监听的监听器Listener。发送消息:客户端循环发送消息给效劳器,直
18、到发送的String流遇到结尾字符。4.2.2文件发送该段功能主要实现文件发送,默认端口为9900,由FileSender.java文件中的FileSender类实现程序代码请见附录,具体实现过程如下:初始化:使用接收端用户的昵称、需要被传输的文件名以及聊天记录列表初始化FileSender相应的属性。用需要被传输的文件名新建一个文件输入流,通过该文件输入流新建一个缓冲输入流,用于缓冲文件输入数据;同时使用接收端用户的IP地址以及端口号新建一个套接字,并通过该套接字建立一个缓冲输出流,用于文件输出数据的缓冲及刷新,然后使用一个字节数组用于读取文件数据。 初始化进度条:设置其最小值为零,最大值为
19、文件长度除以字节数组长度。发送文件数据:循环从字节数组中读取数据,假设没有到String流的结尾,那么更新count值为原值与此时字节数组的长度之和,根据此时的count值修改良度条的值,再将字节数组中的数据写入到用于输出的套接字中,并刷新输出流。关闭输入输出流以及建立的套接字,系统使用对话框提示用户文件发送成功,再次将进度条设置为不可见,文件长度设置为零,以便下一次文件传输使用。 4.2.3文件接收该段功能主要实现文件接收,默认端口为9900,由FileReceiver.java文件中的FileReceiver类实现程序代码请见附录,具体实现过程如下:初始化:使用需要被传输的文件名以及聊天记
20、录列表初始化FileReciever相应的属性。用需要被传输的文件名新建一个文件输出流,通过该文件输入流新建一个缓冲输出流,用于缓冲文件输出数据及刷新;同时使用发送端用户的端口号新建一个效劳器套接字,并通过该套接字的accept方法建立一个缓冲输入流,用于文件输入数据的缓冲,然后使用一个字节数组用于读取文件数据。接收文件数据:循环从字节数组中读取数据,假设没有到String流的结尾,那么更新count值为原值与此时字节数组的长度之和,根据此时的count值修改良度条的值,再将字节数组中的数据写入到用于输出的文件中,并刷新输出流。关闭输入输出流以及建立的套接字,系统使用对话框提示用户接收文件成功
21、,再次将进度条设置为不可见,文件长度设置为零,以便下一次文件传输使用。 4.2.4消息监听该类主要实现对效劳器发送的消息进行监听的功能,由Listener.java文件中的Listener类实现程序代码请见附录,具体实现过程如下:使用缓冲输入流、在线用户列表以及聊天记录列表初始化Listener对象的相关属性,并启动多线程。循环接收从效劳器发送来的信息,直到输入流读到了String流的末尾,接着开始判断消息的类型。假设控制字以“NICKNAME开始,那么证明需要更新用户列表,此时客户端进行相关操作。如控制字以“FILEECFO开始,那么客户端需要通过控制字以后的字符获得目的端的IP地址。假设控
22、制字以“FLENGHTH开头,那么客户端可以获得需要传输的文件长度。假设控制字都不满足的条件,那么将该信息作为是交谈内容更新在聊天记录列表中。效劳器启动效劳客户端登陆效劳器实现其管理功能 向所有客户端发送消息 向某一个客户端发送消息 制修改某个客户端的昵称客户端向所有客户端播送客户端与客户端间实现“私聊客户端与客户端之间实现文件传输功能文件发送文件接收 文件传输过程中 传输完成用户离开效劳器关闭结论与总结通过4.3运行结果,可以看出,该课程设计利用Java应用程序Socket编程实现了以下功能:使用Java的多线程处理机制建立两个套接字分别作为效劳器端和客户端。在效劳器端实现了向各个客户端发布
23、系统消息,接受来自客户端的各种信息并分别处理的功能,可以控制客户端的连接以及对用户的管理作用,并且能够适时检测已登录用户的连接状态且刷新在线用户列表,更能够解析客户端与效劳器端的消息交互并做出相应处理。在客户端实现了向效劳器端发布消息,并且对来自效劳器的消息做出相应的响应,可以连接到特定的效劳器,设置自己的昵称,并且能够监听效劳器端发送过来的消息并做出相应的响应,更加能够与其他用户进行播送或私聊,以及实现文件传输等功能。由此,可见,本次课程设计完成了最初的设计要求,即实现了类似P2P的QQ聊天系统,有相应的客户端和效劳器端;效劳器端可以记录当前在线客户列表,把客户列表发送给每一个在线客户,并实
24、时刷新;任何一个用户都可以和任意其它的用户进行交互,即从在线客户列表中选择一个或一组其它用户通过效劳器的转发彼此进行信息的交互以及文件的交互。在本次课程设计中,我们综合应用所学过的知识,在使用Java应用程序的Socket编程机制的根底上,根据传输层的传输控制协议TCP协议的原理,设计点对点数据交换程序,并且实现效劳器端和客户端的主要功能。另外,根据自己编写的程序,成功地实现了用户之间的聊天及文件传输功能,这一次的课程设计,使我们掌握了网络传输数据的概念、原理以及设计方法,也加深了对传输控制协议TCP的理解。通过本次课程设计,我们清楚地了解到TCP、UDP协议的原理及二者的区别,学会了网络中数
25、据传输的根本概念、根本原理和设计步骤、设计思路和调试步骤,体会到了程序设计结构在整个设计中起到的重要作用,最终能够清晰地解析计算机网络中数据传输这一概念,为进一步的网络知识学习奠定了根底,并且完成对?计算机网络?这门课程的综合应用,真正表达了“学以致用的机制。本次课程设计中,因为有老师的辛勤指导,我们设计小组对理论知识进行了充分研究,发扬了创新实践精神,积极探索,努力勤勉,共同越过了设计路上的每一处障碍,攻克了一个又一个的难关。最终,友好的协作关系与团队凝聚力促使我们顺利地完成了此次课程设计。本次课程设计,加深了我们对理论知识的理解,也锻炼了我们的实践能力,更多的是在实践中收获了太多的感触和心
26、得,.虽然计算机组成原理的课程设计已经结束,可我们明白“学无止境的道理,我们会继续刻苦钻研,求实创新,不断地用知识来充实自己,跟上科技时代前进的步伐。在此次的设计中,非常感谢老师对我们的帮助和指导。才疏学浅,过程难免还不够完善,望老师再次不吝赐教! 课程设计分工及参考文献 刘龙:效劳器端程序的设计以及实现,包括效劳器端的连接控制、管理作用、刷新列表以及消息处理等功能的实现:效劳器端界面的设计和窗口事件的处理,实现效劳器端和客户端的的登录信息、聊天记录功能的实现.奉光阳:客户端界面的设计和窗口事件的处理,以及实现客户端的连接功能、登录设计以及,提出消息处理的根本模式,以及客户端消息处理功能的实现
27、,实现客户端和效劳器端的登录信息、聊天记录功能的实现.。 韩超: 点对点信息交互的实现,监听功能,文件传输进度条的开发与实现,搜集资料,文件传输机制的设计与实现,同时对进度条和文件保存功能的实现。课程设计报告资料的搜集与整理,补充及修改课程设计报告表达了作为一个团队应有的凝聚力,完成了本次课程设计。1?计算机网络?第4版 谢希仁 电子工业出版社 2003年6月2?用TCP/IP进行网络互联?第一卷 电子工业出版社2004年11月第四版3?TCP/IP网络原理与技术?周明天、汪文勇清华大学出版社:19934?Java程序设计之网络编程?李芝兴、杨瑞龙、朱庆生 清华大学出版社 2006年3月第一版
28、 附录 实现代码内容已被演说,仅附关键性代码 效劳器程序在效劳器端维护一个hashtable,用来存放各客户端的IP地址与用户昵称之间的对照关系映射。 Hashtable ip2nickname=new Hashtable(); ArrayList allService=new ArrayList(); String clientIP=client.getInetAddress().getHostAddress(); /判断该客户端已经连接的话,提示退出 if(ip2nickname.get(clientIP)!=null) ChatTookit.sendInfo(client,已经有客户端从
29、该ip地址连接效劳器,本次连接将退出!); break; /把新建连接的用户参加当前用户列表 onLineUsers.add(client); /默认情况下,即在还没有收到用户自定义昵称的清空下,把用户的IP地址做为其昵称维护入ip2nickname ip2nickname.put(clientIP,clientIP); /在效劳器端提示有新的客户连接 this.onLineUsersList.add(clientIP); this.chatContentList.add(clientIP+ 来了); /对所有已连接的客户端,发送两条信息,1提示有新用户连接,2最新在线用户昵称列表ChatTo
30、okit.sendInfoToAll(onLineUsers,ChatTookit.getAllNickname(ip2nickname); ChatTookit.sendInfoToAll(onLineUsers,clientIP+ 来了); /针对每个client连接启动其特定效劳线程 Service(client,ip2nickname,onLineUsersList,chatContentList,onLineUsers,chatContent); this.allService.add(service); catch (IOException ex) JOptionPane.show
31、MessageDialog(null,接收客户端连接时出现问题!, 提示,JOptionPane.INFORMATION_MESSAGE); /强制更改用户的昵称 public void changeNickname(String oldName,String newName) /如果该昵称已经被别人使用那么不进行更改 if(ip2nickname.contains(newName) chatContent.add(该昵称已经有人使用,所以不做任何更改); this.chatContentList.select(this.chatContentList.getItemCount()-1); r
32、eturn; /找到旧昵称所在的ip地址 String ip=ChatTookit.getIP(ip2nickname,oldName); /用新昵称更新旧昵称 ip2nickname.put(ip,newName); /将负责该用户的Service里的昵称变量进行修改 Service service=ChatTookit.getServiceByIP(allService,ip); service.changeNickname(newName); /刷新效劳器端的显示 chatContentList.add(系统管理员 将 +oldName+ 的昵称改为 +newName); this.ch
33、atContentList.select(this.chatContentList.getItemCount()-1); ChatTookit.updateOnLineUsersList(onLineUsersList,ip2nickname); /刷新各客户端的显示 /先给该客户端提供提示信息 ChatTookit.sendInfo(client,你已经被系统管理员踢出聊天室); client.close(); catch (IOException ex) JOptionPane.showMessageDialog(null, 关闭客户端+ip+时出错!, 提示,JOptionPane.IN
34、FORMATION_MESSAGE); /刷新效劳器端的显示 chatContentList.add(系统管理员 将 +nickname+ 踢出聊天室!);ontentList.select(this.chatContentList.getItemCount()-1); ChatTookit.updateOnLineUsersList(onLineUsersList,ip2nickname); /刷新各客户端的显示try ChatTookit.sendInfoToAll(onLineUsers,系统管理员 将 +nickname+ 踢出聊天室!);ChatTookit.sendInfoToAl
35、l(onLineUsers,ChatTookit.getAllNickname(ip2nickname); catch (IOException ex) JOptionPane.showMessageDialog(null, 发送信息出错!, 提示,JOptionPane.INFORMATION_MESSAGE); 功能函数public class ChatTookit /从IP地址昵称对照hashtabel中得到所有的昵称 public static String getAllNickname(Hashtable ip2nickname) String allNickname=NICKNAM
36、E:; Enumeration e=ip2nickname.elements(); while(e.hasMoreElements() allNickname+=(String)e.nextElement()+ ; return allNickname; /遍历所有已连接的客户端,发送输入的信息 public static void sendInfoToAll(ArrayList onLineUsers,String info) throws IOException for (int i = 0; i onLineUsers.size(); i+) Socket c = (Socket) onLineUsers.get(i); PrintStream ps = new PrintStream(c.getOutputStream(); ps.println(info); /给某个特定用户发送一条信息 public static void sendInfo(Socket client,String info) throws IOException PrintStream ps = new PrintStream(client
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 初级西药职称考试题库及答案
- 全国科技经费投入统计调查制度
- 住院三级查房制度
- 企业的相关制度
- 企业产品成本核算制度
- 人事四项制度
- 物流园奖惩制度范本大全
- 异地恋情侣间奖惩制度
- 业务接洽人员奖惩制度
- 为防止财务资料外泄或丢失制定严格的资料查阅和备份制度
- 2026年高校教师资格证考试题库(附答案)
- 低空经济项目融资方案模板
- 介入治疗医疗废物处理标准流程
- 专科护士竞聘课件
- 设计类-《室内设计概论》全套课件
- 2026年抚州幼儿师范高等专科学校单招职业技能考试必刷测试卷完美版
- GB/T 46471-2025皮革色牢度试验试验通则
- 脊柱侧弯的健康宣教
- 充电桩运维服务优化项目完成情况总结汇报
- 2026届高考英语高频固定短语搭配(共1000个)
- 关于中职学生安全教育的课件
评论
0/150
提交评论