1、网络协议编程实验指导书九江学院信息科学与技术学院网络技术教研室二 0 一二年一月目录实验一、C#编程环境应用 实验二、C#编程基础(一) 实验三、C#编程基础(二) 实验四、C#面向对象编程基础 实验五、常用数据类的应用 实验六、Windows 程序设计实例 实验七、网络编程基础实例 实验八、多线程程序设计 实验九、TCP 编程实例 实验十、UDP 编程实例 实验十一、FTP 客户端设计 实验十二、FTP 服务器端设计 实验十三、基于 Socket 类的服务器编程 实验十四、基于 TcpListener 类的服务器编程 实验十五、基于 HTTP 的编程实例 实验十六、综合实例 实验项目名称和学
2、时分配序号 实验项目名称学时分配实验类型每组人数必做/选做1 C#编程环境应用 2 演示性 1 必做2 C#编程基础(一) 2 演示性 1 必做3 C#编程基础(二) 2 演示性 1 必做4 C#面向对象编程基础 2 演示性 1 必做5 常用数据类的应用 2 演示性 1 必做6 Windows 程序设计实例 2 演示性 1 必做7 网络编程基础实例 2 演示性 1 必做8 多线程程序设计 2 演示性 1 必做9 TCP 编程实例 2 演示性 1 必做10 UDP 编程实例 2 演示性 1 必做11 FTP 客户端设计 2 设计性 1 必做12 FTP 服务器端设计 2 设计性 1 必做13 基
3、于 Socket 类的服务器编程 2 演示性 1 必做14 基于 TcpListener 类的服务器编程 2 演示性 1 必做15 基于 HTTP 的编程实例 2 演示性 1 必做16 综合实例 2 设计性 1 必做实验一、C#编程环境应用实验目的:1、了解 C#应用程序的本结构。2、熟悉 C#应用程序的编译和运行过程。实验设备: 计算机实验所需软件:Visual Studio 2008实验步骤:1、创建控制台应用程序的操作过程1)启动 VS.NET 集成开发环境;2)选择“文件”菜单,在模版栏中选择“控制台应用程序” ;3)编写代码;4)调试程序。5)参考代码:/WelcomeToCS.cs
4、using System;class WelcomeToCSstatic void Main()Console.WriteLine(“Welcome to C#!“);2、创建 Windows 应用程序的操作过程1)启动 VS.NET 集成开发环境;2)选择“文件”菜单,在模版栏中选择“Windows 应用程序” ;3)编写代码;4)调试程序。5)参考代码(略) 。注意:1. VS.NET 集成开发环境。2. 程序的编译、调试方法。实验二、C#编程基础(一)实验目的:1、掌握 C#的数据类型和类型转换;2、了解常量的作用,掌握常量与变量的定义;3、掌握 C#运算符的用途和表达式的写法,熟悉调试
5、程序的方法。实验设备: 计算机实验所需软件:Visual Studio 2008实验步骤:1、求三个整数的最大值1)声明 int 型变量 a、b、c,用于保存三个待求整数。2)声明 int 型变量 max,用于保存最大值。3)声明 string 型变量 str,用于表示一串字符。4)分别向屏目输出提示信息,提示用户输入三个整数,将用户输入的字符串保存在变量str 中,并在将 str 中的数据转换成 int 型数据后分别赋值给变量 a、b、c。5)使用条件运算符和关系运算符求出变量 a 和 b 中的大者,并赋值给变量 max。6)使用条件运算符和关系运算符求出变量 max 和 c 中的大者,并赋
6、值给变量 max。7)输出变量 max 的值。8)调试运行程序。9)参考代码:using System;class Test2_1static void Main()int a,b,c;int max;string str;Console.Write(“请输入第一个数: “);str=Console.ReadLine();a=Int32.Parse(str);Console.Write(“请输入第二个数: “);str=Console.ReadLine();b=Int32.Parse(str);Console.Write(“请输入第三个数: “);str=Console.ReadLine();
7、c=Int32.Parse(str);/计算机已经按收了这三个数,然后比较三个数的大小.max=(ab)?a:b;max=(maxc)?max:c; Console.WriteLine(“最大值是0“,max);2、自定义数据类型1) 定义枚举类型 MonthOfYear,用于描述一年中的 12 个月。2)定义结构类型 Date,用于描述日期,结构类型 Date 中包含三个公共字段。其中,string型字段 Year 用于表示年份,MonthOfYear 型字段 Month 用于表示月份,string 型字段Day 用于表示天数。3)定义一个含有 Main()方法的类。4)在 Main 方法中
8、,首先声明两个 Date 变量 date1,date2。5)分别给变量 date1 的字段赋值。6)输出变量 date1 各字段的值。7)将变量 date1 的值赋给变量 2,然后,修改变量 date2 的 Day 字段值。8)输出变量 date2 各字段的值。9)调试运行程序。10) 参考代码using System;class Test2_2enum MonthOfYear一月,二月,三月,四月,五月,六月,七月,八月,九月,十月,十一月,十二月struct Datepublic string Year;public MonthOfYear Month;public string Day;
9、static void Main()Date date1,date2;date1.Year=“二零零九年 “;date1.Month=MonthOfYear.三月;date1.Day=“二号“;Console.WriteLine(“012“,date1.Year,date1.Month,date1.Day);date2=date1;date2.Day=“三十一号 “;Console.WriteLine(“012“,date2.Year,date2.Month,date2.Day);注意:1、算法的设计。2、程序的编译、调试方法。实验三、C#编程基础(二)实验目的:1、掌握 if、while 、
10、for 等常用语句的使用方法。2、掌握语句的嵌套使用。实验设备: 计算机实验所需软件:Visual Studio 2008实验步骤:1、对用户输入的三个整数按序输出1)声明 int 型变量 a、b、c,用于保存用户输入的三个整数。2)声明 int 型变量 t,在交换变量 a、b、c 的值时,用于临时保存其中的某个值。3)从键盘读入三个整数,分别保存在变量 a、b、c 中。4)使用 if 语句将变量 a、b、c 中的最大值赋给变量 c,最小值赋给变量 a,中间值赋给变量b。5)按从小到大的顺序依次输出变量 a、b、c 的值。6)调试运行程序。7)参考代码:using System;class T
11、est3_1static void Main()int a,b,c,t;Console.Write(“请输入第一个整数:“);a=Int32.Parse(Console.ReadLine();Console.Write(“请输入第二个整数:“);b=Int32.Parse(Console.ReadLine();Console.Write(“请输入第三个整数:“);c=Int32.Parse(Console.ReadLine();if(ab)t=a;a=b;b=t; if(bc)t=c;c=b;if(ta)b=t;elseb=a;a=t; Console.WriteLine(“从小到大的顺序依次
12、为:0,1 ,2“,a,b,c);2、简单计算器1) 声明 int 型变量 firstNumber 和 secondNumber,用于保存操作数。2) 声明 string 型变量 operation,用于保存运算符。3) 声明 string 型变量 response,用于保存用户输入的决定是否继续运算的字符。4) 声明 do-while 语句读入运算符和操作数,在该循环中用 switch 语句执行相应运算,并输出运算结果。5) 在 do-while 语句中提示用户输入相应的字符决定是否断续运算,并根据输入字符决定是否结束 do-while 语句的运行。6) 调试运行程序。7) 参考代码usin
13、g System;class test3_2static void Main()/声明两个输入的操作数。int firstNumber,secondNumber;/声明一个字符串类型来定义运算符。string operation;/来判断是否继续运算。string response;doConsole.Write(“请输入运算符(+ 、- 、*、/):“);operation=Console.ReadLine();Console.Write(“请输入第一个操作数: “);/接收输入的操作数并转换成整形。firstNumber=Int32.Parse(Console.ReadLine();Con
14、sole.Write(“请输入第二个操作数: “);secondNumber=Int32.Parse(Console.ReadLine();switch(operation)case“+“:Console.WriteLine(“0+1=2“,firstNumber,secondNumber,firstNumber+secondNumber);break;case“-“: Console.WriteLine(“0-1=2“,firstNumber,secondNumber,firstNumber-secondNumber);break;case“*“:Console.WriteLine(“0*1
15、=2“,firstNumber,secondNumber,firstNumber* secondNumber);break;case“/“: Console.WriteLine(“0/1=2“,firstNumber,secondNumber,firstNumber/secondNumber);break;default:Console.WriteLine(“运算符不合法“);break;Console.Write(“是否继续进行运算(Y/N) ;“);response=Console.ReadLine();while(response!=“Y“Console.Write(“是否继续进行运算
16、(Y/N):“);response=Console.ReadLine();while(response=“Y“|response=“y“);2、求指定范围内的所有合数1)声明 int 型变量 min、max,并分别初始化为 10 和 100;2)声明 int 型变量 num,用于保存合数的个数,初始化为 0。3)嵌套使用 for 语句,顺序判断 10100 中的每个整数,如果某个整数是合数,则输出该数,并将变量 num 加 1。4)调试运行程序。5)参考代码using System;class Test3_3static void Main()int min=10,max=100;int nu
17、m=0;Console.WriteLine(“0到1之间的合数有:“,min,max);for(int i=min;i“);i+;输出结果为:HelloWorld(6)插入字符串String 类包含了在一个字符串中插入新元素的方法 Insert,用于在字符串的任意位置插入任意的字符:public string Insert(int startIndex, string value);其中,参数 startIndex 用于指定所要插入的位置,从 0 开始索引;value 指定所要插入的字符串。下例中,在“Hello”的字符“H”后面插入“World”,构造一个串“HWorldello”。例:使用
18、 Insert 插入字符串:/InsertnewStr=“;newStr=strA.Insert(1,strB); /“HWorldello“(7)填充字符串有时候,可能需要对一个字符串进行填充,例如,想要把“Hello”变为长度为 20 个字符的串,并使用字符“*”进行填充,即变为 “*Hello”。PadLeft 方法可以实现这个功能,用于在一个字符串的左侧进行字符填充,使其达到一定的长度。PadLeft 有两种重载形式:public string PadLeft(int totalWidth);public string PadLeft(int totalWidth, char padd
19、ingChar);其中,参数 totalWidth 指定了填充后的字符长度,而 paddingChar 指定所要填充的字符,如果默认,则填充空格符号。下例中,实现了对“Hello”的填充操作,使其长度变为 20。使用 PadLeft 填充字符串:Default.aspx.cs/PadLeftnewStr=“;newStr=strA.PadLeft(20,*); /“*Hello “同 PadLeft 类似,PadRight 可以实现对一个字符在其右侧的填充功能,对其不作赘述。(8)删除字符串String 类包含了删除一个字符串的方法,可以用 Remove 方法在任意位置删除任意长度的字符,也可
20、以使用 Trim/TrimEnd/TrimStart 方法剪切掉字符串中的一些特定字符。1Remove 方法Remove 方法从一个字符串的制定位置开始,删除指定数量的字符。最常用的为:public string Remove( int startIndex, int count);其中,参数 startIndex 用于指定所要开始删除的位置,从 0 开始索引;count 指定所要删除的字符数量。下例中,把“Hello”中的“ell”删掉。使用 Remove 删除字符串:/RemovenewStr=“;newStr=strA.Remove(1,3); /“Ho“2Trim/TrimStart/
21、TrimEnd 方法若想把一个字符串首尾处的一些特殊字符剪切掉,如去掉一个字符串首尾的空格等,可以使用 String 的 Trim 方法。其形式为:public string Trim ();public string Trim (params chartrimChars);其中,参数 trimChars 数组包含了指定了所要去掉的字符,如果默认,则删除空格符号。下例中,实现了对“Hello# $”的净化,去掉首尾的特殊符号。使用 Trim 去掉首尾的特殊符号:Default.aspx.cs/TrimnewStr=“;char trimChars=,#,$, ;String strC=“Hel
22、lo# $“;catorldnewStr=strC.Trim(trimChars); /“Hello“另外,同 Trim 类似,TrimStart 和 TrimEnd 分别剪切掉一个字符串开头和结尾处的特殊字符。(9)复制字符串String 类包含了复制字符串方法 Copy 和 CopyTo,可以完成对一个字符串及其一部分的复制操作。1Copy 方法若想把一个字符串复制到另一个字符串中,可以使用 String 的静态方法 Copy 来实现,其形式为:static string Copy(string str);其中,参数 str 为需要复制的源字符串,方法返回目标字符串。下例中,把 TextB
23、oxA 种的字符串复制到 newStr 中。使用 Copy 复制字符串:/CopynewStr=“;newStr=String.Copy(strA); /“Hello“2CopyTo 方法CopyTo 方法可以实现 Copy 同样的功能,但功能更为丰富,可以复制源字符串中的一部分到一个字符数组中。另外,CopyTo 不是静态方法,其形式为: public void CopyTo(int sourceIndex, char destination, int destinationIndex, int count);其中,参数 sourceIndex 为需要复制的字符起始位置,destinatio
24、n 为目标字符数组,destinationIndex 制定目标数组中的开始存放位置,而 count 指定所要复制的字符个数。下例中,把 strA 字符串“Hello”中的“ell”复制到 newCharArr 中,并在 newCharArr 中从第 2 个元素开始存放。使用 CopyTo 复制字符串:Default.aspx.cs/CopyTochar newCharArr=new char100;strA.CopyTo(2,newCharArr,0,3); /“Hel“(10)替换字符串如果想要替换掉一个字符串中的某些特定字符或者某个子串,可以使用 Replace 方法来实现,其形式为:pu
25、blic string Replace(char oldChar, char newChar);public string Replace(string oldValue, string oldValue,);其中,参数 oldChar 和 oldValue 为待替换的字符和子串,而 newChar 和 newValue 为替换后的新字符和新子串。下例把“Hello”通过替换变为“Hero”。使用 Replace 替换字符串:Default.aspx.cs/ReplacenewStr=strA.Replace(“ll“,“r“); /Hero(11)更改大小写String 提供了方便转换字符串
26、中所有字符大小写的方法 ToUpper 和 ToLower。这两个方法没有输入参数,使用也非常简单。下例首先把“Hello”转换为“HELLO” ,然后在变为小写形式“hello”。使用 ToUpper 更改字符串大小写:Default.aspx.cs/ToUppernewStr=strA.ToUpper(); /HELLO /ToLowernewStr=strA.ToLower(); /hello注意:1、文件类的常见操作。2、相关类的常用方法。实验六、 Windows程序设计实例实验目的:1、掌握 IO 流的定义和应用;2、掌握文件的基本操作方法;3、掌握 Windows 程序设计方法。实
27、验设备: 计算机实验所需软件:Visual Studio 2008实验步骤:1、常用控件的使用1)Label 标签控件的使用;2)文本框控件的使用;3)列表框控件的使用;4)容器控件的使用;5)对话框控件的使用。6)菜单的设计与编程2、 Windows 程序设计实例1)窗体之间的链接案例(参见 84 页案例) 。2)常用控件使用案例,编程完成如同所示功能(参见课本 86 页) 。3)容器控件使用案例(参见课本 90-93 页) 。注意:1、常用控件的使用方法。2、常用控件的常用属性和方法。实验七、网络编程基础实例实验目的:1、理解 TCP/IP 协议参考模型;2、熟练掌握网络编程的基本方法。实
28、验设备: 计算机实验所需软件:Visual Studio 2008实验步骤:1、通过 Socket 对象建立客户机与服务器的连接。2、客户端向服务器发送信息。3、服务器收到后将信息显示出来并向客户机返回确认信息。4、客户机收到服务器的确认信息后,显示相关信息。详细流程如下图:5、预期效果图6、参考代码/server端using System;using System.Text;using System.IO;using System.Net;using System.Net.Sockets;namespace Project1class Class2static void Main()tryi
29、nt port = 2000;string host = “192.168.118.238“;IPAddress ip = IPAddress.Parse(host);IPEndPoint ipe = new IPEndPoint(ip, port);Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream,ProtocolType.Tcp);/创建一个Socket类s.Bind(ipe);/绑定2000端口s.Listen(0);/开始监听Console.WriteLine(“Wait for connect“);
30、Socket temp = s.Accept();/为新建连接创建新的Socket。Console.WriteLine(“Get a connect“);string recvStr = “;byte recvBytes = new byte1024;int bytes;bytes = temp.Receive(recvBytes, recvBytes.Length, 0);/从客户端接受信息recvStr += Encoding.ASCII.GetString(recvBytes, 0, bytes);Console.WriteLine(“Server Get Message:0“, rec
31、vStr);/把客户端传来的信息显示出来string sendStr = “Ok!Client Send Message Sucessful!“;byte bs = Encoding.ASCII.GetBytes(sendStr);temp.Send(bs, bs.Length, 0);/返回客户端成功信息temp.Close();s.Close();catch (ArgumentNullException e)Console.WriteLine(“ArgumentNullException: 0“, e);catch (SocketException e)Console.WriteLine(
32、“SocketException: 0“, e);Console.WriteLine(“Press Enter to Exit“);Console.ReadLine();/client端using System;using System.Text;using System.IO;using System.Net;using System.Net.Sockets;namespace socketsampleclass Class1static void Main()tryint port = 2000;string host = “192.168.118.238“;IPAddress ip =
33、IPAddress.Parse(host);IPEndPoint ipe = new IPEndPoint(ip, port);/把ip和端口转化为IPEndPoint实例Socket c = new Socket(AddressFamily.InterNetwork, SocketType.Stream,ProtocolType.Tcp);/创建一个SocketConsole.WriteLine(“Conneting.“);c.Connect(ipe);/连接到服务器string sendStr = “hello!This is a socket test“;byte bs = Encodi
34、ng.ASCII.GetBytes(sendStr);Console.WriteLine(“Send Message“);c.Send(bs, bs.Length, 0);/发送测试信息string recvStr = “;byte recvBytes = new byte1024;int bytes;bytes = c.Receive(recvBytes, recvBytes.Length, 0);/从服务器端接受返回信息recvStr += Encoding.ASCII.GetString(recvBytes, 0, bytes);Console.WriteLine(“Client Get
35、 Message:0“, recvStr);/显示服务器返回信息c.Close();catch (ArgumentNullException e)Console.WriteLine(“ArgumentNullException: 0“, e);catch (SocketException e)Console.WriteLine(“SocketException: 0“, e);Console.WriteLine(“Press Enter to Exit“);Console.ReadLine();注意:1、套接字对象的使用。2、套接字对象常用属性和方法。实验八、多线程程序设计实验目的:1、理解进
36、程和线程的概念;2、熟练掌握多线程程序设计的方法。实验设备: 计算机实验所需软件:Visual Studio 2008实验步骤:模拟吃苹果1)案例需求:一个家庭有三个孩子,爸爸妈妈不断削苹果往盘子里面放,老大、老二、老三不断从盘子里面取苹果吃。盘子的大小有限,最多只能放 5 个苹果,并且爸妈不能同时往盘子里面放苹果,妈妈具有优先权。三个孩子取苹果时,盘子不能为空,三人不能同时取,老三优先权最高,老大最低。老大吃的最快,取的频率最高,老二次之。程序设计了四个类:EatAppleSmp 类、Productor 类、Consumer 类和 Dish 类。其中 Dish 类是中间类,包含了共享数据区和
37、放苹果、取苹果的方法,这两个方法利用 lock 语句实现了同步控制。2)参考代码using System;using System.Collections.Generic;using System.Text;using System.Threading;namespace ThreadSampleclass EatAppleSmppublic EatAppleSmp( )Thread th_mother, th_father, th_young, th_middle, th_old;Dish dish = new Dish(this, 30);Productor mother = new Pr
38、oductor(“妈妈“, dish);/建立线程Productor father = new Productor(“爸爸“, dish);Consumer old = new Consumer(“老大“, dish, 1000);Consumer middle = new Consumer(“老二“, dish, 1200);Consumer young = new Consumer(“老三“, dish, 1500);th_mother = new Thread(new ThreadStart(mother.run);th_father = new Thread(new ThreadSta
39、rt(father.run);th_old = new Thread(new ThreadStart(old.run);th_middle = new Thread(new ThreadStart(middle.run);th_young = new Thread(new ThreadStart(young.run);th_mother.Priority = ThreadPriority.Highest;/设置优先级th_father.Priority = ThreadPriority.Normal;th_old.Priority = ThreadPriority.Lowest;th_midd
40、le.Priority = ThreadPriority.Normal;th_young.Priority = ThreadPriority.Highest;th_mother.Start( );th_father.Start( );th_old.Start( );th_middle.Start( );th_young.Start( );static void Main(string args) EatAppleSmp mainstart = new EatAppleSmp( );class Dish int f = 5;/盘子最多只能放 5 个苹果EatAppleSmp oEAP;int EnabledNum;/可放苹果总数int n = 0;public Dish(EatAppleSmp oEAP, int EnabledNum) this.oEAP = oEAP;this.EnabledNum = EnabledNum;