版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、课程编号:B080109003网络应用程序设计实践报告姓名学号班级软件150 1指导教师血 回 回 费园园实践课程名称网络应用程序设计实践开设学期2 0 1 6- 2 0 1 7 第二学期开设时间第1周第3周报告日期2 0 1 7. 0 3. 1 7评定成绩评定人签字评定日期东北大学软件学院1.实践目的L 写出本次实践的目的,要求简洁清楚。(1)理解ftp通信原理;(2)学习使用Socket和多线程编写简单的FTP服务器;(3)学习使用Sokcet编写简单的FTP客户端;(4)理解HTTP通信原理;(5)学习使用Socket编写HTTP服务器;(6)学习使用Socket编写HTTP客户端;(7
2、)理解WebSocket的通信原理;(8)使用tomcat服务器搭建多人聊天室;2.预习内容L 写出本次实践过程中你所用到的知识;(1)FTP通信流程和通信命令FTP使用2个端口,一个数据端口和一个命令端口(也叫做控制端口)。这两个端口一般 是21(命令端口)和20(数据端口)。(2)Socket 编程利用TCP协议进行通信的两个应用程序,server和client交互过程:1)服务器创建一个ServerSocket,然后调用accept方法等待客户连接2)客户端程序创建一个socket并请求与服务器建立连接3)在连接的socket上进行单独的线程对话4)服务器开始等待新的连接请求(多线程)(
3、3)多线程编程为了保证FTP服务器能够同时处理多个客户端的请求,服务器为每个客户端分配一个线 程。(4)HTTP通信原理http的请求格式HTTP请求格式BtanH hireEntity bo4yiak Thiinri: HI IffL BtanH hireEntity bo4yiak Thiinri: HI IffL hll|TFr* tnniiWULkXhttp的应答模式HTTP应答格式WebSocket 概念在WebSocket API,浏览器和服务器只需要做一个握手的动作,然后,浏览器和服务 器之间就形成了一条快速通道。两者之间就直接可以数据互相传送。在此 WebSocket 协议中,
4、为我们实现即时服务带来了两大好处:Header互相沟通的Header是很小的-大概只有2 BytesServer Push服务器的推送,服务器不再被动的接收到浏览器的request之后才返回数据,而是 在有新数据时就主动推送给浏览器。WebSocket通信规则1)客户端发起请求,服务器端创建一个ChatAnnotation对象,自动运行start方法, 将 Websocket会话对象session作为入参。服务器端将当前ChatAnnotation对象加入 到static的集合中。2)客户端onopen方法自动运行。3)客户端通过事件触发socket.send()方法,服务器端incoming
5、方法自动运行,客 户端发送的信息自动作为方法入参,服务器端可以遍历static的集合,把消息推送给所 有的客户端。4)收到推送消息后,客户端的onmessage方法自动运行。5)客户端如果推出,客户端的onclose方法自动运行,接着服务器端的end方法 自动运行,在end方法中,从static的集合中删除当前ChatAnnotation对象。3.实践内容和实践过程1.编写简单的FTP客户端程序;编写简单的FTP服务器程序实践内容本实验要求完成以下功能(使用PASV模式):优先级功能名称功能说明优先级获取文件列 表给定用户工作目录,获得文件列表,包括文件名称,文件大小,文件创建 时间获取文件列
6、 表 TOC o 1-5 h z 上传文件到用户指定工作目录中高文件上传上传文件夹到用户指定工作目录中低支持断点续传低文件下载给定用户工作目录文件下载给定用户工作目录,下载文件给定用户工作目录,下载文件夹支持断点续传实现过程1)服务器创建一个ServerSocket,然后调用accept方法等待客户连接2)客户端程序创建一个socket并请求与服务器建立连接3)在连接的socket上进行单独的线程对话客户端通过发送命令来使服务器做出相应的反应。当发送PASV命令时候,服务器进入被动模式,并打开数据端口。客户端连接数据端 口,两者之间即可以通过命令端口处理请求,数据端口传输数据,比如文件(夹)的
7、上传、 下载。上传:将文件写进DataOutputStream输出流之中,流中的数据通过数据端口传输至服 务器。服务器端同样从数据端口获取流DataInputStream,并将其输出为文件。此间需要传 输文件的名字、大小等等参数。文件夹的上传与下载:类似于单文件操作。首先遍历文件夹,获取文件的fileList集合,发送文件夹名字,在 另一端新建同名文件夹。循环发送所有文件,发送一个文件之后,另一端开始下载,下载 完毕返回验证。开始发送第二个文件,继续下载,直至所有文件传输完毕。操作过程如流 程图:4)服务器开始等待新的连接请求(多线程) 下图为项目流程:FA5V开放数据端口FA5V开放数据端口
8、关键技术开启被动模式:if (s.equals(PASV)/ 如果是被动模式 if (pasvSocket != null) pasvSocket.close();try pasvSocket = new ServerSocket(0);int pPort = pasvSocket.getLocalPort();if (pPort 1024) pPort = 1025;response(227 entering passive mode ( +InetAddress. getLocalHost ().getHostAddress().replace(, .) + , + pPort + );D
9、ataOutputStream dataOutputStream=newDataOutputStream(socket.getOutputStream();dataOutputStream.writeUTF(InetAddress. getLocalHost().getHostAddress();dataOutputStream.flush();dataOutputStream.writeInt(pPort);dataOutputStream.flush();if (pasvSocket != null) dataSocket = pasvSocket.accept();/ 阻塞 respon
10、se (数据端口连接成功,继续输入命令:); catch (Exception e) / TODO Auto-generated catch blockif (pasvSocket != null) pasvSocket.close(); pasvSocket = null;return;获取文件list:if (s.equals(LIST) File file = new File(this. currentDir);/ 路径名字File files = file.listFiles();String list =”;for (int i = 0; i files. length; i+)
11、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 = newDataOutputStream(dataSocket.getOutputStream();dataOutputStream2.writeUTF(list
12、);response(150来自数据端口的文件list:);return;文件夹的传输:if (response_code.equals(153) / RETR DataInputStream dis = newDataInputStream(dataSocket.getInputStream();String dirName = dis.readUTF();/ 获取文件夹名字 System. out.println(文件夹的名字:+ dirName); File file = new File(clientDir + / + dirName); file.mkdir();5int fileN
13、um = dis.readInt();/ 获取文件的数量System. out.println(文件的数量:+ fileNum);for (int i = 0; i 开始下载文件:“+ fileName + ”, 文件大小为:+ fileLength + 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) fileLength) br
14、eak;System. out.println(下载文件:“+ fileName + 成 功 );DataOutputStream dataOutputStream3 = new DataOutputStream(dataSocket.getOutputStream();dataOutputStream3.writeUTF(done);dataOutputStream3.flush();System. out.println(文件夹+ dirName + 下载成功”);遇到的问题及解决方案在处理文件夹传输的时候,遇到了一些问题:上传多个文件,但是在服务器端仅仅收到一个文件,而且文件的大小是所有
15、的文件的总 和。后来经过分析,发现是由于上传的时候使用的流操作,将所有文件顺序通过一个流操作 进行传输,服务器端接收文件的时候会把流中的数据解析成文件,但是并不会把多个文件解 析出来,最终导致所有的数据堆在一个文件之中。解决方案:在流程图中也可以看到文件夹的传输方式,现对客户端上传文件夹至服务器来进行说 明。客户端获取文件夹下在所有File对象,存为一个集合。同时可以得到文件的数量等等基本属性,客户端将这些信息发送至服务器,服务器按照指令创建文件夹。接着客户端发送 第一个文件,而后暂停(readline()方法阻塞进程)。服务器开始接收第一个文件,接收完毕 发送一道指令给客户端,readlin
16、e()方法执行之后,进入下个循环发送第二个文件。直至所有 文件循环结束。上传文件夹完毕。2.编写简单的HTTP 1.1客户端程序;编写简单的HTTP 1.1服务器程序;(1)实践内容功能名称功能说明优先级服务器功能提供HTML,JPG等MIME类型的资源高客户端功能访问服务器,获取HTML和JPG资源,保存到本地磁盘高访问服务器,获取WMV等其他资源类型,保存到本地磁盘低(2) 实现过程返回返回JPG请求 W返回返回JPG请求 W、返回 |返I可reA 请产 I吨开超”_1返回请求自湾求JPG请求U*啃求湾求JPG请求U*啃求HIXL(3)关键技术X断开遥(3)关键技术连接socket端口:S
17、ocket socket=new Socket(localhost”, 8081);客户端发送HTTP请求:PrintWriter writer=new PrintWriter(socket.getOutputStream();DataOutputStream dataOutputStream=newDataOutputStream(socket.getOutputStream();String fileName=final_travel/index.html”;发送请求头GET方式中,请求数据挂在URL后,POST方式中,请求数据放在请 求体中writer.println(GET +file
18、Name+“ HTTP/1.1);writer.println(Host:localhost);writer.println(connection:keep-alive);亚丘6小511口();空行writer.flush();客户端接收服务器返回的资源:InputStream inputStream=socket.getInputStream();BufferedReader reader=new BufferedReader(newInputStreamReader(inputStream);String firstLineOfResponse=reader.readLine();/HTT
19、P/1.1 200 OKSystem. out.println(firstLineOfResponse);String secondLineOfResponse=reader.readLine();/Content-Type:image/jpgSystem. out.println(secondLineOfResponse);String thirdLineOfResponse = reader.readLine();/Content-Length:System. out.println(thirdLineOfResponse);String fourthLineOfResponse = re
20、ader.readLine();/空行byte b = new byte 1024;String realFileName=fileName;if (fileName.contains(/)/处理 类似于文件夹/文件.后缀 类型的文件String口 num=fileName.split(/);realFileName=numnum. length-11;FileOutputStream out = newFileOutputStream(/home/scc/eclipse/workspaces/experient_2/client+/+realFileName );String string=
21、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)遇到的问题及解决方案问题:客户端与服务器进行通讯时候,使用流操作来传输数据,出现返回文件偶尔出错的现象。 解决方案:每次客户端接收完数据之后,都将HTTP连接断开,需要时候再进行连接。3. 编写Websocket聊天室功能,包括客户端JavaScript和服务器
22、端Servlet(1)实践内容本实验要求完成以下功能:功能名称功能说明优先级完成度多人聊天在网页上实现多人聊天高多人聊天跟某个人聊 天用户登录,显示在线列表,指定和某个人聊天中用户登录,显示在线列 表,指定和某个人聊天在线客服在线客服功能低未完成实现过程客户端与服务器建立连接并进行第一条通讯的流程图:群发消息的通讯流程:显示在线列表的实现流程:私聊功能,以文字形式描述如下:用户1发送消息,格式为+&用户2昵称。服务端识别之后,将用户1的私聊对象talkTo 属性设置为用户2, isPrivateChat属性设置为true。根据提供的用户名,获取到用户2的 chatAnontation,并将用户
23、2的私聊对象talkTo属性设置为用户1 ,isPrivateChat属性设置为true。因此可以实现:当进入私聊模式后,用户1或者用户2发送一条消息,在后台判断 isPrivateChat,如果为true,那么将根据该用户的talkTo属性存储的用户名获取到私聊对象的 session,只将消息广播给特定私聊对象。当退出私聊模式时候,一方输入-&即可,后台清除用户1和用户2的talkTo属性,并将 isPrivateChat均设置为false。从而结束私聊模式,今后发送消息均为群聊消息,广播给所有的在 线用户。关键技术显示在线列表的实现:当用户连接或者断开时,均会执行以下方法(核心代码):首先
24、将所有的用户信息获取到,封装成一个JSON对象,将JSON格式的字符串广播出去 JSONObject jsonObject_send=new JSONObject();JSONArray jsonArray_send=new JSONArray();for (User user2 : users) jsonArray_send.put(user2.getName();try jsonObject_send.put(list”, jsonArray_send); catch (JSONException e) e.printStackTrace();listbroadcast(jsonObjec
25、t_send.toString();广播List的方法private static void listbroadcast(String msg) for (ChatAnnotation client : connections) / 每个客户端都发送一遍try 10synchronized (client) client.session.getBasicRemote().sendText(list + msg); catch (IOException e) System. out.println(在线列表显示出错);前端解析如下:过程为先将接收到的消息进行过滤,如果为用于更新list的消息,则
26、进行解析。将获取到 的字符串转换成一个JSON对象,解析整个JSON对象,获取到在线列表,输出到列表框中。var receivedMsg = message.data;if (receivedMsg.startsWith(list) receivedMsg = receivedMsg.substring(4);var obj = JSON.parse(receivedMsg);var print = ”;for (var i = 0; i obj.list.length; i+) print = print + +obj.listi+在 线 +;print=print+“”;document.
27、getElementById(listbox).innerHTML = print;私聊功能:后台接收到要进行私聊的命令,过滤之后得到talkToName,设置当前用户的TalkTo、 PrivateChat属性。遍历users集合,获取到要私聊对象的user类,将其TalkTo、PrivateChat 属性也进行相应的设置,同是私聊对象的chatAnnotation将作为参数传至广播方法 privateBroadcast(String ,ChatAnnotation )。if (message.startsWith(+&) String talkToName=message.substrin
28、g(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().equals(talkToName) users.get(i).setTalkTo(user.getName();users.get(i).setPrivateChat(true);cha
29、tAnnotation=users.get(i).getChatAnnotation();System. out.println(要私聊的名字是+user.getTalkTo(); break;privateBroadcast(user.getName()+”和进入+user.getTalkTo()+”进入私聊模式“,chatAnnotation);11return;私聊广播方法:实现只将消息广播给本人以及要私聊的对象。private void privateBroadcast(String string,ChatAnnotation chatAnnotation) if (chatAnnot
30、ation=null) try System. out.println(对方不存在!);this. session.getBasicRemote().sendText (对方不存在!”); catch (IOException e) e.printStackTrace();return;else try System. out.println(私聊);chatAnnotation. session.getBasicRemote().sendText(system : + string);this.session.getBasicRemote().sendText(system : + stri
31、ng);return; catch (IOException e) e.printStackTrace();遇到的问题及解决方案问题:在实现私聊的过程中,在后台想要获取所要私聊对象的user类以及其chatAnnotation对象,结果 发现获取到的user为空。然后开始逐步调试,结果没发现问题。后来打算把所有的user信息作为物理信息存在文件中,在改版快完成的时候,发现方法内和方法 外各new 了一个user对象,导致我所使用的user为空值。解决方案:删除全局的user,保留方法内的user对象。4.实践总结.加深了 HTTP协议,FTP协议的理解,使得之前停留在书本层面的知识变成了实践,
32、 对今后的实践会产生积极的影响;.熟练使用JAVA的多线程,网络编程。多线程的使用将解决应用单用户连接的尴尬 局面,多线程将能开发出真正能够被广泛使用的程序,程序的逻辑设计才能化为实 际生产力;.提升了 JAVA编程的动手和调试能力,JAVA调试代码不仅仅是简单的设置断点、步 进调试,调试代码需要技巧,巧妙设置断点能是调试代码效率提升数倍,同时加深 对JAVA代码执行的理解。4,熟悉了结构流程图的画法,虽然画的流程图不是非常标准,但是很努力的在将程序12中的逻辑通过结构化的呈现表达出来,这也是一大收获;5,熟悉了 JSON的使用,在传递数据的时候将字符串封装成JSON格式,一是对于多 平台的适用,二是对方法的简化、标准化,三是减少代码的出
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年度新能源汽车生产合作协议范本正规范本
- 绿色循环农业新模式策略及实施路径
- 2024年监理服务居间代理协议格式版B版
- 2021-2026年中国民用机场行业发展监测及投资战略规划研究报告
- 2024年甲乙双方关于二手房买卖的贷款担保合同3篇
- 2024消防工程合同-消防水池及消防泵房改造3篇
- 二零二五年仓储租赁合同(含仓储技术支持)3篇
- 二零二五年度企业形象设计与品牌管理合作合同3篇
- 二零二五年度VOCs减排设备运维与技术服务合同3篇
- 二零二五年度保险代理居间保险代理人激励机制合同2篇
- 审计常用法规培训课件
- 健康指南知己知彼了解你的身体质量指数BMI
- 主题二:拥军优属心连心 课件 2023-2024学年广州版初中劳动技术九年级下册
- 海洋技术与海洋装备发展
- 智慧火电厂整体解决方案
- 电厂锅炉炉膛烟道内部作业三措两案
- 收费站(所)事故隐患排查清单
- 驾驶证学法减分(学法免分)题库及答案(200题完整版)
- 高绩效教练的读书心得分享
- 软管出厂检测报告
- 公司业务流程与工作流程介绍
评论
0/150
提交评论