东北大学-软件学院-15级-计算机网络实验报告.doc

上传人:z**** 文档编号:61249363 上传时间:2022-11-20 格式:DOC 页数:15 大小:831KB
返回 下载 相关 举报
东北大学-软件学院-15级-计算机网络实验报告.doc_第1页
第1页 / 共15页
东北大学-软件学院-15级-计算机网络实验报告.doc_第2页
第2页 / 共15页
点击查看更多>>
资源描述

《东北大学-软件学院-15级-计算机网络实验报告.doc》由会员分享,可在线阅读,更多相关《东北大学-软件学院-15级-计算机网络实验报告.doc(15页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。

1、优质文本课程编号:B080109003网络应用程序设计实践报告姓名学号班级软件1501指导教师费园园实践课程名称网络应用程序设计实践开设学期2016-2017 第二学期开设时间第1周第3周报告日期2017.03.17评定成绩评定人签字评定日期东北大学软件学院优质文本1. 实践目的 写出本次实践的目的,要求简洁清楚。(1)理解FTP通信原理;(2)学习使用Socket和多线程编写简单的FTP效劳器;(3)学习使用Sokcet编写简单的FTP客户端;(4)理解 通信原理;(5)学习使用Socket编写 效劳器;(6)学习使用Socket编写 客户端;(7)理解WebSocket的通信原理;(8)使

2、用tomcat效劳器搭建多人聊天室;2. 预习内容 写出本次实践过程中你所用到的知识;(1) FTP通信流程和通信命令FTP 使用2个端口,一个数据端口和一个命令端口(也叫做控制端口)。这两个端口一般是21(命令端口)和 20(数据端口)。(2) Socket编程利用TCP协议进行通信的两个应用程序,server和client交互过程:1) 效劳器创立一个ServerSocket,然后调用accept方法等待客户连接2) 客户端程序创立一个socket并请求与效劳器建立连接3) 在连接的socket上进行单独的线程对话4) 效劳器开始等待新的连接请求多线程(3) 多线程编程为了保证FTP效劳器

3、能够同时处理多个客户端的请求,效劳器为每个客户端分配一个线程。(4) 通信原理 的请求格式 的应答模式(5) WebSocket概念在 WebSocket API,浏览器和效劳器只需要做一个握手的动作,然后,浏览器和效劳器之间就形成了一条快速通道。两者之间就直接可以数据互相传送。在此 WebSocket 协议中,为我们实现即时效劳带来了两大好处:1. Header互相沟通的 Header 是很小的-大概只有 2 Bytes2. Server Push效劳器的推送,效劳器不再被动的接收到浏览器的 request 之后才返回数据,而是在有新数据时就主动推送给浏览器。(6) WebSocket通信规

4、那么1) 客户端发起请求,效劳器端创立一个 ChatAnnotation 对象,自动运行 start 方法,将 Websocket 会话对象 session 作为入参。效劳器端将当前 ChatAnnotation 对象参加到 static 的集合中。2) 客户端 onopen 方法自动运行。3) 客户端通过事件触发 socket.send()方法,效劳器端 incoming 方法自动运行,客户端发送的信息自动作为方法入参,效劳器端可以遍历 static 的集合,把消息推送给所有的客户端。4) 收到推送消息后,客户端的 onmessage 方法自动运行。5) 客户端如果推出,客户端的 onclo

5、se 方法自动运行,接着效劳器端的 end 方法自动运行,在 end 方法中,从 static 的集合中删除当前 ChatAnnotation 对象。3. 实践内容和实践过程1. 编写简单的FTP客户端程序;编写简单的FTP效劳器程序(1) 实践内容本实验要求完成以下功能(使用PASV模式):功能名称功能说明优先级获取文件列表给定用户工作目录,获得文件列表,包括文件名称,文件大小,文件创立时间高文件上传上传文件到用户指定工作目录中高上传文件夹到用户指定工作目录中低支持断点续传低文件下载给定用户工作目录,下载文件高给定用户工作目录,下载文件夹低支持断点续传低(2) 实现过程1) 效劳器创立一个S

6、erverSocket,然后调用accept方法等待客户连接2) 客户端程序创立一个socket并请求与效劳器建立连接3) 在连接的socket上进行单独的线程对话客户端通过发送命令来使效劳器做出相应的反响。当发送PASV命令时候,效劳器进入被动模式,并翻开数据端口。客户端连接数据端口,两者之间即可以通过命令端口处理请求,数据端口传输数据,比方文件夹的上传、下载。上传:将文件写进DataOutputStream输出流之中,流中的数据通过数据端口传输至效劳器。效劳器端同样从数据端口获取流DataInputStream,并将其输出为文件。此间需要传输文件的名字、大小等等参数。文件夹的上传与下载:类

7、似于单文件操作。首先遍历文件夹,获取文件的集合,发送文件夹名字,在另一端新建同名文件夹。循环发送所有文件,发送一个文件之后,另一端开始下载,下载完毕返回验证。开始发送第二个文件,继续下载,直至所有文件传输完毕。操作过程如流程图:4) 效劳器开始等待新的连接请求多线程下列图为工程流程:(3) 关键技术开启被动模式:if (s.equals(PASV) / 如果是被动模式if (pasvSocket != null) pasvSocket.close();try pasvSocket = new ServerSocket(0);int pPort = pasvSocket.getLocalPort

8、();if (pPort 1024) pPort = 1025;response(227 entering passive mode ( + InetAddress.getLocalHost().getHostAddress().replace(, .)+ , + pPort + );DataOutputStream dataOutputStream=new DataOutputStream(socket.getOutputStream();dataOutputStream.writeUTF(InetAddress.getLocalHost().getHostAddress();dataOut

9、putStream.flush();dataOutputStream.writeInt(pPort);dataOutputStream.flush();if (pasvSocket != null) dataSocket = pasvSocket.accept();/ 阻塞response(数据端口连接成功,继续输入命令:); catch (Exception e) / TODO Auto-generated catch blockif (pasvSocket != null) pasvSocket.close();pasvSocket = null;return;获取文件list:if (s

10、.equals(LIST) = new );/ 路径名字File files = ();String list = ;for (int i = 0; i ; i+) long time = filesi.lastModified();String stime = new SimpleDateFormat(yyyy-MM-dd hh:mm:ss).format(new Date(time);list += filesi.getName() + t + filesi.length() + kb + t + stime + n;DataOutputStream dataOutputStream2 =

11、 new DataOutputStream(dataSocket.getOutputStream();dataOutputStream2.writeUTF(list);response(150 来自数据端口的文件list:);return;文件夹的传输:if (response_code.equals(153) / RETRDataInputStream dis = new DataInputStream(dataSocket.getInputStream();String dirName = dis.readUTF();/ 获取文件夹名字System.out.println(文件夹的名字:

12、+ dirName); = new + / + dirName);();int = dis.readInt();/ 获取文件的数量System.out.println(文件的数量: + );for (int i = 0; i 开始下载文件: + + , 文件大小为: + + B -);while (true) int read = 0;read = dis.read(sendBytes);if (read = -1) break;transLen += read;fos.write(sendBytes, 0, read);fos.flush();if (transLen = (int) ) b

13、reak;System.out.println(下载文件: + + 成功 );DataOutputStream dataOutputStream3 = new DataOutputStream(dataSocket.getOutputStream();dataOutputStream3.writeUTF(done);dataOutputStream3.flush();System.out.println(文件夹 + dirName + 下载成功);(4) 遇到的问题及解决方案在处理文件夹传输的时候,遇到了一些问题:上传多个文件,但是在效劳器端仅仅收到一个文件,而且文件的大小是所有的文件的总和。

14、后来经过分析,发现是由于上传的时候使用的流操作,将所有文件顺序通过一个流操作进行传输,效劳器端接收文件的时候会把流中的数据解析成文件,但是并不会把多个文件解析出来,最终导致所有的数据堆在一个文件之中。解决方案:在流程图中也可以看到文件夹的传输方式,现对客户端上传文件夹至效劳器来进行说明。客户端获取文件夹下在所有File对象,存为一个集合。同时可以得到文件的数量等等根本属性,客户端将这些信息发送至效劳器,效劳器按照指令创立文件夹。接着客户端发送第一个文件,而后暂停readline()方法阻塞进程。效劳器开始接收第一个文件,接收完毕发送一道指令给客户端,readline()方法执行之后,进入下个循

15、环发送第二个文件。直至所有文件循环结束。上传文件夹完毕。2. 编写简单的 1.1 客户端程序;编写简单的 1.1 效劳器程序;(1) 实践内容功能名称功能说明优先级效劳器功能提供 HTML,JPG 等 MIME 类型的资源高客户端功能访问效劳器,获取 HTML 和 JPG 资源,保存到本地磁盘高访问效劳器,获取 WMV 等其他资源类型,保存到本地磁盘低(2) 实现过程(3) 关键技术连接socket端口:Socket socket=new Socket(localhost, 8081);客户端发送 请求:PrintWriter writer=new PrintWriter(socket.get

16、OutputStream();DataOutputStream dataOutputStream=new DataOutputStream(socket.getOutputStream();String =final_travel/index.html;/发送请求头 GET 方式中,请求数据挂在 URL 后,POST 方式中,请求数据放在请求体中writer.println(GET + /1.1);writer.println(Host:localhost);writer.println(connection:keep-alive);writer.println();/空行writer.flu

17、sh();客户端接收效劳器返回的资源:InputStream inputStream=socket.getInputStream();BufferedReader reader=new BufferedReader(new InputStreamReader(inputStream);String firstLineOfResponse=reader.readLine();/ /1.1 200 OKSystem.out.println(firstLineOfResponse);String secondLineOfResponse=reader.readLine();/Content-Type

18、:image/jpgSystem.out.println(secondLineOfResponse);String thirdLineOfResponse = reader.readLine();/Content-Length:System.out.println(thirdLineOfResponse);String fourthLineOfResponse = reader.readLine();/空行byte b = new byte1024;String real=;if (.contains(/) /处理 类似于 文件夹/文件.后缀 类型的文件String num=.split(/)

19、;real=numnum.length-1; out = new (/home/scc/eclipse/workspaces/experient_2/client+/+real);String string=out.toString();System.out.println(string);int len=inputStream.read(b);while(len!=-1)out.write(b, 0, len);len = inputStream.read(b);inputStream.close();out.close();(4) 遇到的问题及解决方案问题:客户端与效劳器进行通讯时候,使用

20、流操作来传输数据,出现返回文件偶尔出错的现象。解决方案:每次客户端接收完数据之后,都将 连接断开,需要时候再进行连接。3. 编写Websocket聊天室功能,包括客户端JavaScript和效劳器端Servlet(1) 实践内容本实验要求完成以下功能:功能名称功能说明优先级完成度多人聊天在网页上实现多人聊天高多人聊天跟某个人聊天用户登录,显示在线列表,指定和某个人聊天中用户登录,显示在线列表,指定和某个人聊天在线客服在线客服功能低未完成(2) 实现过程客户端与效劳器建立连接并进行第一条通讯的流程图:群发消息的通讯流程:显示在线列表的实现流程:私聊功能,以文字形式描述如下:用户1 发送消息,格式

21、为+&用户2 昵称。效劳端识别之后,将用户1 的私聊对象talkTo属性设置为用户2,isPrivateChat属性设置为true。根据提供的用户名,获取到用户2 的chatAnontation,并将用户2 的私聊对象talkTo属性设置为用户1 ,isPrivateChat属性设置为true。因此可以实现:当进入私聊模式后,用户1或者用户2发送一条消息,在后台判断isPrivateChat,如果为true,那么将根据该用户的talkTo属性存储的用户名获取到私聊对象的session,只将消息播送给特定私聊对象。当退出私聊模式时候,一方输入-&即可,后台去除用户1 和用户2 的talkTo属性

22、,并将isPrivateChat均设置为false。从而结束私聊模式,今后发送消息均为群聊消息,播送给所有的在线用户。(3) 关键技术显示在线列表的实现:当用户连接或者断开时,均会执行以下方法核心代码:首先将所有的用户信息获取到,封装成一个JSON对象,将JSON格式的字符串播送出去JSONObject jsonObject_send=new JSONObject();JSONArray jsonArray_send=new JSONArray();for (User user2 : users) jsonArray_send.put(user2.getName();try jsonObjec

23、t_send.put(list, jsonArray_send); catch (JSONException e) e.printStackTrace();listbroadcast(jsonObject_send.toString();播送List的方法private static void listbroadcast(String msg) for (ChatAnnotation client : connections) / 每个客户端都发送一遍try synchronized (client) client.session.getBasicRemote().sendText(list

24、+ msg); catch (IOException e) System.out.println(在线列表显示出错);前端解析如下:过程为先将接收到的消息进行过滤,如果为用于更新list的消息,那么进行解析。将获取到的字符串转换成一个JSON对象,解析整个JSON对象,获取到在线列表,输出到列表框中。var receivedMsg = message.data;if (receivedMsg.startsWith(list) receivedMsg = receivedMsg.substring(4);var obj = JSON.parse(receivedMsg);var print =

25、;for (var i = 0; i obj.list.length; i+) print = print + +obj.listi+在线 +;print=print+;document.getElementById(listbox).innerHTML = print;私聊功能:后台接收到要进行私聊的命令,过滤之后得到talkToName,设置当前用户的TalkTo、 PrivateChat属性。遍历users集合,获取到要私聊对象的user类,将其TalkTo、 PrivateChat属性也进行相应的设置,同是私聊对象的chatAnnotation将作为参数传至播送方法privateBro

26、adcast(String ,ChatAnnotation )。if (message.startsWith(+&) String talkToName=message.substring(2);/获得想要私聊的对象名字user.setTalkTo(talkToName);user.setPrivateChat(true);System.out.println(talkToName+talkToName);ChatAnnotation chatAnnotation=null;for (int i=0;iusers.size();i+) if (users.get(i).getName().eq

27、uals(talkToName) users.get(i).setTalkTo(user.getName();users.get(i).setPrivateChat(true);chatAnnotation=users.get(i).getChatAnnotation();System.out.println(要私聊的名字是+user.getTalkTo();break;privateBroadcast(user.getName()+和进入+user.getTalkTo()+进入私聊模式,chatAnnotation);return;私聊播送方法:实现只将消息播送给本人以及要私聊的对象。pri

28、vate void privateBroadcast(String string,ChatAnnotation chatAnnotation) if (chatAnnotation=null) try System.out.println(对方不存在!);this.session.getBasicRemote().sendText(对方不存在!); catch (IOException e) e.printStackTrace();return;else try System.out.println(私聊);chatAnnotation.session.getBasicRemote().sen

29、dText(system : + string);this.session.getBasicRemote().sendText(system : + string);return; catch (IOException e) e.printStackTrace();(4) 遇到的问题及解决方案问题:在实现私聊的过程中,在后台想要获取所要私聊对象的user类以及其chatAnnotation对象,结果发现获取到的user为空。然后开始逐步调试,结果没发现问题。后来打算把所有的user信息作为物理信息存在文件中,在改版快完成的时候,发现方法内和方法外各new了一个user对象,导致我所使用的use

30、r为空值。解决方案:删除全局的user,保存方法内的user对象。4. 实践总结1. 加深了 协议,FTP协议的理解,使得之前停留在书本层面的知识变成了实践,对今后的实践会产生积极的影响;2. 熟练使用JAVA的多线程,网络编程。多线程的使用将解决应用单用户连接的为难局面,多线程将能开发出真正能够被广泛使用的程序,程序的逻辑设计才能化为实际生产力;3. 提升了JAVA编程的动手和调试能力,JAVA调试代码不仅仅是简单的设置断点、步进调试,调试代码需要技巧,巧妙设置断点能是调试代码效率提升数倍,同时加深对JAVA代码执行的理解。4. 熟悉了结构流程图的画法,虽然画的流程图不是非常标准,但是很努力

31、的在将程序中的逻辑通过结构化的呈现表达出来,这也是一大收获;5. 熟悉了JSON的使用,在传递数据的时候将字符串封装成JSON格式,一是对于多平台的适用,二是对方法的简化、标准化,三是减少代码的出错率。熟悉了JSON的使用会对以后关于网络编程方面提供一个较好的工具,毕竟当前网站数据传输很大一局部比例都在使用JSON。 其他方面的提升:1. 通过课程实践提升了网络/软件编程的兴趣;2. 学会了如何利用网络资源寻求帮助,众多开发者们分享了一些较好的博客等文章,其精华局部肯定能让我们有所收获。3. 通过辩论,跟老师和同学交流问题,提升了沟通表达的能力;5. 参考资料1实验指导书2博客: FTP效劳器

32、端的实现 博主:automationer 博文链接:3博客:Java中的多线程你只要看这一篇就够了博主:Givefine博文链接:4博客: 如何利用JavaScript 在页面间传值博主:钢钢博文链接:239.html5 博客: java-使用socket模拟简单的 请求效劳器,响应简单的文件请求操作博主:平凡之奇博文链接:实践成绩评定表考核内容考核标准分值得分平时表现实践过程中,无缺勤、迟到、早退现象,学习态度积极。实践过程未做与本实践无关的事情。10实验一内容能够按实验要求合理设计并开发出FTP客户端与效劳器程序,认真记录实验数据,原理及实验结果分析准确,归纳总结充分。程序代码书写标准,简洁,有重要位置的注释内容。20实验二内容能够按实验要求合理设计并开发出 客户端与效劳器程序,认真记录实验数据,原理及实验结果分析准确,归纳总结充分。程序代码书写标准,简洁,有重要位置的注释内容。20实验三内容能够按实验要求合理设计并开发出WebSocket聊天室程序,认真记录实验数据,原理及实验结果分析准确,归纳总结充分。程序代码书写标准,简洁,有重要位置的注释内容。20创新性在实践内容实现上,有自己独立的想法,并在功能实现上有一定的创新性;完成选做实验工程。10报告质量实验报告格式标准,体例符合要求;报告内容充实、正确,实验目的归纳合理到位,思考题答复准确。20总 分百分制

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 高中资料

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知得利文库网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号-8 |  经营许可证:黑B2-20190332号 |   黑公网安备:91230400333293403D

© 2020-2023 www.deliwenku.com 得利文库. All Rights Reserved 黑龙江转换宝科技有限公司 

黑龙江省互联网违法和不良信息举报
举报电话:0468-3380021 邮箱:hgswwxb@163.com