




已阅读5页,还剩13页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
计算机网络程序设计实验报告实验题目: 面向TCP Socket编程 学 院 计算机学院 专 业 网络工程 班 级 02班 姓 名 温慧君 学 号 40909040232 2012年 4 月 13 日一、实验名称熟悉和掌握网络编程的基本方法和步骤;进一步理解client/server 交互模式;加深学生对于网络协议概念的理解以及协议的设计和实现方法二、实验目的和要求目的:熟悉和掌握网络编程的基本方法和步骤;进一步理解client/server 交互模式;加深学生对于网络协议概念的理解以及协议的设计和实现方法要求:编写网络选课模拟程序,它由 client 和 server 两部分组成, client 和 server 之间的通信基于 TCP 协议,并且实现 NCSP 应用层协议( Network-based Course Selection Protocol )。三、开发环境操作系统 Windows7Ip :05物理地址:90-4C-E5-E0-62-0E使用软件:eclipse四、实验内容和结果1、程序整体功能编写网络选课模拟程序,它由 client 和 server 两部分组成, client 和 server 之间的通信基于 TCP 协议,并且实现 NCSP 应用层协议( Network-based Course Selection Protocol )。 NCSP 应用层协议 NCSP Server 的功能 当接收到 client 发送的 GETCOURSE协议消息,返回该用户已经选择的所有课程名字; 当接收到 client 发送的 SETCOURSE协议消息,记录用户名和课程名,以便 client 使用 GETCOURSE 命令查询; 当接收到 client 发送的 SHUTDOWN 协议消息,检查用户是否有此权限,如果有则结束 server 程序。 NCSP Client 的功能允许用户选择要发送的协议消息及其附带参数,然后向 server 发送 GETCOURSE 、 SETCOURSE 或者 SHUTDOWN 命令之一,并从 server 得到应答结果,显示给用户。 NCSP 协议本次实验所要实现的网络选课程序,其核心是 client 和 server 之间所遵从的共同协议: NCSP 协议。下面我们详细描述该协议。 GETCOURSEGETCOURSE 命令由 client 发送给 server ,它由一个 ASCII 字符串组成:首先是“GETCOURSE ”,然后紧跟着一个空格( space ),然后是用户名,最后是换行符( n )。 client 然后等待服务器应答:如果返回的是“ 401 User does not exist ”字符串 ,说明该用户还没有选择课程;如果返回的是“200 OK ”字符串,说明该用户已经选择了课程, client 继续接收 server 发送的课程消息,每一门课程名是一个字符串,当接收到“ . ”字符串时,说明课程名发送完毕。 Client 断开连接,重新接收用户输入。当 server 接收到 GETCOURSE 命令,它解析出用户名,然后检索该用户是否已经选择了课程,如果没有,则返回“ 401 User does not exist ”字符串,关闭连接;如果用户选择了课程,则返回“ 200 OK ”字符串,然后将用户选择的课程名返回给 client ,由于用户可能选择了多门课程,因此每一门课程名作为一个字符串返回给 client ,当课程名都发送完毕,发送“ . ”字符串作为结束标志。然后断开连接,重新监听新的 client 的连接请求。当 server 解析 GETCOURSE 命令,发生错误时,返回“ 300 Message format error ”字符串。3.3.2 SETCOURSESETCOURSE 命令由 client 发送给 server ,它由一个 ASCII 字符串组成:首先是“SETCOURSE ”,然后紧跟着一个空格( space ),然后是用户名,最后是换行符( n )。 client 然后等待服务器应答:如果返回的是“ 301 User exists ”字符串,说明该用户已经选择了课程(这里我们假设用户必须一次选择好课程,不能更改);如果返回的是“ 200 OK ”字符串,说明该用户还没有选择课程,可以选课。 Client 将用户输入的课程名发送给 server ,每一门课程名是一个以换行符 n 终结的字符串,当课程名都发送完毕,发送“ . ”字符串作为结束标志。然后 Client 断开连接,重新接收用户输入。当 server 接收到 SETCOURSE 命令,它解析出用户名,然后检索该用户是否已经选择了课程,如果已经选择,则返回“ 301 User exists ”字符串,关闭连接;如果用户还没有选择课程,则返回“ 200 OK ”字符串, server 继续接收 client 发送的课程消息,每一门课程名是一个字符串,当接收到“ . ”字符串时,说明课程名发送完毕。 Server 将用户名和其选择的所有课程存储起来,然后断开连接,重新监听新的 client 的连接请求。当 server 解析 SETCOURSE 命令,发生错误时,返回“ 300 Message format error ”字符串。SHUTDOWNSHUTDOWN 命令由 client 发送给 server ,它由一个 ASCII 字符串组成:首先是“SHUTDOWN ”,然后紧跟着一个空格( space ),然后是用户名,最后是换行符( n )。 client 发送完毕后,接收 server 的响应结果,显示在屏幕上,然后关闭连接。当 server 接收到 SHUTDOWN 命令,解析出用户名,如果此用户没有关闭 server 的权限,则返回“ 201 User not allowed to execute this command ”字符串;如果此用户具有关闭 server 的权限,则返回“ 200 OK ”字符串,然后关闭连接,结束 server 程序。当 server 解析 SHUTDOWN 命令,发生错误时,返回“ 300 Message format error ”字符串。2、设计思路说明及重要类、数据结构、模块/函数算法说明 server client 建立服务器倾听SocketServerSocket serverSocket = new ServerSocket(5500);等待并接受请求Socket connectToClient = serverSocket.accept();创建客户SocketSocket client = new Socket(localhost, 5500);获取socket输入输出流BufferedReader in = new BufferedReader(new InputStreamReader(connectToClient.getInputStream();PrintWriter out = new PrintWriter(connectToClient.getOutputStream(), true);利用哈希表存放数据Hashtable course = new Hashtable();获取socket输入输出流BufferedReader buf = new BufferedReader(new InputStreamReader(System.in);BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream();获取用户命令In.readLine();将从客户端获取的命令分离出来,一个是用户名,一个是命令。将命令对应于switch语句的三个分支String fenli = str.split(s);/分离用户命令int a = 0;String order= fenli0; String name = fenli1;if (order.equals(GETCOURSE)a = 1;else if (order.equals(SETCOURSE)a = 2;else if (order.equals(SHUTDOWN)a = 3;while true 用户输入命令,交给服务器Out.pritln();将命令对应于switch语句的三个分支StringTokenizer str = new StringTokenizer(Order, );String str1 = str.nextToken();int i = 0;if (str1.equals(GETCOURSE)i = 1;else if (str1.equals(SETCOURSE)i = 2;else if (str1.equals(SHUTDOWN)i = 3;While trueSwltch 1:当用户命令是GETCOURSEIf 用户名存在 Out.pritln(200 OK) Out.pritln( 此用户所选课程)利用哈希表的get()方法Else Out.pritln( 401 User does not exist)Swltch 1:当用户命令是GETCOURSEIn.readLine()If 接收到的是200 OK In.readLine()跳出switchElse 跳出switchSwitch 2:当用户命令是SETCOURSEIf 用户名存在Out.pritln(301 User exists)Else Out.pritln(200 OK) In.readLine() 将用户输入课程存储到哈希表中course.put(name, str);Switch 2:当用户命令是SETCOURSEIn.readLine()If 接收到的是 301 user exists 跳出switchElse 接收到的是 200 OK 开始输入课程,然后发送给服务器 跳出switchSwitch 3:用户命令为SHUTDOWNIf 用户名为温慧君 Out.pritln(200 OK) 关闭连接跳出循环Else Out.pritln(201 User not allowed to execute this command) Switch 3:用户命令为SHUTDOWNIn.readLine()If 接收到的是 200 OK 关闭连接跳出循环Else 跳出switchdefault:当用户输入的命令不是以上三种Out.pritln(300 Message format error) 跳出switchdefault:当用户输入的命令不是以上三种In.readLine()跳出switch3、程序的运行和测试结果选课:客户端:服务器:如果用户名已经存在:客户端:服务器端:查询课程:客户端:服务器端:若用户名不存在客户端:服务器端:关闭连接:客户端:服务器端:若用户没有权限客户端:服务器端:5、程序清单服务器端:import java.io.*;import .ServerSocket;import .Socket;import java.util.Hashtable;public class Server public static void main(String args) Hashtable course = new Hashtable();/ 本程序使用哈希表进行数据存储try ServerSocket serverSocket = new ServerSocket(5500);/ 创建服务端套接字,端口号5500Socket connectToClient = serverSocket.accept();BufferedReader in = new BufferedReader(new InputStreamReader(connectToClient.getInputStream();/ socket输入流PrintWriter out = new PrintWriter(connectToClient.getOutputStream(), true);/ socket输出流boolean go = true;while (go) System.out.print(等待客户端的请求n);String str = in.readLine();System.out.print(str + n);/ 显示用户命令String fenli = str.split(s);/ 分离用户命令int a = 0;String order = fenli0;String name = fenli1;if (order.equals(GETCOURSE)a = 1;else if (order.equals(SETCOURSE)a = 2;else if (order.equals(SHUTDOWN)a = 3;/ a作为分支条件switch (a) case 1: if (course.containsKey(name) System.out.print(200 OK);out.println(200 OK);out.flush();System.out.print(已经发送课程信息n);String courseName = course.get(name);out.println(courseName);out.flush();break;/ 用户名存在else System.out.print(用户名不存在,正发送回应n);out.println(401 User does not existn);out.flush();break;/ else if用户名不存在/ case 1(GETCOURSE)case 2: if (course.containsKey(name) System.out.print(用户名已经存在,正发送回应n);out.println(301 User exists);out.flush();break; / 用户名已经存在else System.out.print(可以选课,正发送回应n);out.println(200 OK);out.flush();str = in.readLine();System.out.print(客户消息: + str + n);course.put(name, str);System.out.print(已经存储n);out.println(存储成功);out.flush();break;/ 用户名不存在/ case 2(SETCOURSE)case 3: if (name.equals(温慧君) System.out.print(已经关闭);out.println(200 OK);out.flush();go = false;break;/ 只有用户名为温慧君的人才可以关闭else System.out.print(用户没权限关闭n);out.println(201 User not allowed to execute this command);out.flush();break;/ case 3( SHUTDOWN)default: System.out.print(错误的命令n);out.println(300 Message format error);out.flush();break;/ default/ switch/ whileserverSocket.close();out.close();in.close(); catch (IOException e) / TODO Auto-generated catch blocke.printStackTrace();客户端:import java.io.*;import .Socket;import java.util.StringTokenizer;public class Client public static void main(String args) try boolean go = true;System.out.print(欢迎来到学生网络选课系统n);System.out.print(命令有:nGETCOURSEnSETCOURSEnSHUTDOWNn);Socket client = new Socket(localhost, 5500);/创建客户端套接字,IP号为本地BufferedReader buf = new BufferedReader(new InputStreamReader(System.in);/用户输入流BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream();/socket输入流PrintWriter out = new PrintWriter(client.getOutputStream(), true);/socket输出流while (go) System.out.print(n请选择命令(命令+空格+用户名)n);String str = buf.readLine();System.out.print(str + n);/ 显示用户命令out.print(str + n);out.flush();System.out.print(已经向服务器发送请求n);int x = fenzhi(str);/将命令处理,产生分支条件switch (x) case 1: System.out.print(等待回应n);str = in.readLine();System.out.print(str+n);if (str.equals(200 OK) do str = in.readLine();System.out.print(您所选的课程有+str);break; while (str.endsWith(.);break; elsebreak;/ case 1(GETCOURSE)case 2: System.out.print(等待回应n);str = in.readLine();System.out.print(str+n);if (str.equals(200 OK) System.out.print(请输入课程,空格隔开,“.”结束输入n);String course = buf.readLine();/用户输入课程名out.println(course);/交给服务器处理out.flush();str = in.readLine();System.out.print(str);break; else break;/ case 2(SETCOURSE)case 3: System.out.print(等待回应n);str = in.readLine();if (str.equals(200 OK) System.out.print(str+n);System.out.print(已经关闭);go = false;
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025版文旅产业商业合作总协议
- 2025年文化旅游产业财务策划服务协议
- 诺如病毒培训知识小结课件
- 纪念白求恩课件
- 语音课件教学课件
- 语音干货知识培训课件
- 2025购销合同争议管辖权异议申请书范文
- 语言文字知识培训课件
- 2025年财务、审计岗位劳动合同模板(或范文)
- 2025智能监控系统维护保养合同
- 儿童拍背排痰法课件
- 电力建设工程施工安全管理导则
- 2025年软件资格考试信息处理技术员(初级)(基础知识、应用技术)合卷试卷及解答参考
- 光伏车棚合同模板
- 《单片机项目化教程(C语言版)(第2版)》全套教学课件
- 2023-2024学年江苏省盐城市盐都区八年级(下)期末物理试卷(含答案)
- 外研版英语四年级下册阅读理解练习(含答案)
- DZT 0447-2023 岩溶塌陷调查规范(1:50000)
- 电子版简易防水合同范本
- 医院传染病防控管理SOP
- 甲状腺健康科普宣传课件
评论
0/150
提交评论