软件学院课程设计报告书课程名称计算机网络编程课程设计设计题目猜数游戏专业班级学号姓名指导教师年月目录1设计时间.....................................................12设计目的.....................................................13设计任务.....................................................14设计内容.....................................................14.1实验内容...................................................14.2算法原理...................................................24.3设计思路...................................................24.4设计过程....................................................34.4.1猜数游戏客户端程序........................................34.4.2猜数游戏服务器端程序......................................64.4.3程序框图.................................................125总结与展望..................................................131设计时间2011年12月13日——2011年12月20日2设计目的(1)加深对计算机网络的基本概念和原理,以及网络编程接口Socket概念及编程原理的理解;(2)提高学生网络应用与编程的能力。学生在七个设计题目中选择一个,提高其分析与解决问题的能力,为大型网络编程打下坚实基础;(3)通过撰写课程设计报告,锻炼学生的逻辑组织和语言表达能力;(4)培养学生理论运用于实践的综合应用和设计创新能力。3设计任务(1)设计完成与网络应用相关题目的网络应用软件;(2)调试运行之后,要求边演示边解释设计的思想、过程及采用的方法;(3)完成课程设计报告。4设计内容4.1实验内容软件名:猜数游戏(分服务器端和客户端两部分)功能:游戏后台运行一个服务器软件,游戏者通过客户端程序登陆后,服务器随机产生一个1—100之间的随机数供游戏者猜,游戏者从客户端输入一个数值,如果该数比设定的数大,软件提示:“大了”,如果小,软件提示“小了”,若相等返回“猜对了,你共猜了*次”。服务器同时记录并维护一个游戏玩家的TOP10排行榜,供玩家查询。描述:服务器端:接收客户端的命令请求并提供相应的服务。客户端:完成游戏人机界界面的设计,以命令的方式向服务器请求服务,并显示相应的提示。主要的命令有:1.CONNECTIP地址端口号指定游戏服务器的IP地址和端口号,连接到服务器。响应:连接成功/失败。2.LOGIN用户名用户登录,报告服务器玩家的名字。响应:成功/失败。3.GUESS数字猜数。响应:大了/小了/对了。4.LISTTOP10请求显示TOP10排行榜。响应:显示TOP10排行榜。5.EXIT退出游戏。4.2算法原理客户端通过点击登录连接到服务器端,发送的数据是String类型的,需要将String类转换成Int类之后才能与服务器端产生的随机数进行比较(不同类型间无法比较)。在服务器端利用方法创建int[]ccc=newint[4];即ccc整形数组将接收的String类型数据转换成整形数据后所存放数组。ccc[0]=Convert.ToInt32(talkString.ToString());方法表示将转换类型后的数据转存到ccc[0]中即将String到Int的转换。使用if(number[0]ccc[0])语句进行比较,输出的语句如:“你输入的数大了”即message=输入的数大了;赋值给message然后利用user.bw.Write(message+操作次数为”+i);将结果送给客户端。服务器在MainForm类下publicint[]number=newint[4];建立数组来存放服务器端自动生成的随机数,随机数用Randomrand=newRandom();类方法实例化一个rand对象,通过调用.Next()方法来创建随机数即number[0]=rand.Next(1,100);产生的随机数为1—100之间。当服务器接受来自客户端的数据之后,通过比较之后返回给客户端信息告知客户端的猜测结果。4.3设计思路客户端程序:在客户端首先登录到服务器端,在客户端会自动创建一个UserSher+数字用户连接到服务器端,当连接成功后会收到来自服务器端的信息:“游戏开始,请输入数据”表示游戏已经开始。客户端通过向服务器端发送String类型的数据通过流套接在服务器端进行比较,每次比较服务器端都会向客户端发送数据信息。服务器端程序:服务器端有用户登录程序。当开始监听后,便监听客户端的连接请求,当建立连接后服务器端会产生一个1—100的随机数,这个随机数会存放到ccc[0]中。当服务器端接收到客户端发送来的数据后通过转存到数组方法将其存放到一个整形数组中。然后与服务器生成的随机数进行比较,比较后用message向客户端发送返回数据。4.4设计过程4.4.1猜数游戏客户端程序:publicpartialclassMainForm:Form{//建立客户端程序privateboolisExit=false;//定义私有类型的布尔值privateTcpClientclient;//私有类型变量privateBinaryReaderbr;//私有类型的读如流privateBinaryWriterbw;//自由输出类型的写入流///summary///【连接服务器】按钮的Click事件////summaryprivatevoidbuttonConnect_Click(objectsender,EventArgse){//与服务器端建立连接,通过Click事件实现buttonConnect.Enabled=false;//设置button的初始状态try{client=newTcpClient(Dns.GetHostName(),51888);AddTalkMessage(连接成功);}catch{AddTalkMessage(连接失败);buttonConnect.Enabled=true;return;}//获取网络流NetworkStreamnetworkStream=client.GetStream();//将网络流作为二进制读写对象br=newBinaryReader(networkStream);bw=newBinaryWriter(networkStream);SendMessage(Login,+textBoxUserName.Text);ThreadthreadReceive=newThread(newThreadStart(ReceiveData));threadReceive.IsBackground=true;threadReceive.Start();}///summary处理接收的服务器端数据/summaryprivatevoidReceiveData(){stringreceiveString=null;while(isExit==false){try{//从网络流中读出字符串//此方法会自动判断字符串长度前缀,并根据长度前缀读出字符串receiveString=br.ReadString();}catch{if(isExit==false){MessageBox.Show(与服务器失去联系。);}break;}///summary向服务器端发送信息/summaryprivatevoidSendMessage(stringmessage){try{bw.Write(message);//将字符串写入网络流,此方法会自动附加字符串长度前缀bw.Flush();//清空缓冲区}catch{//发生异常是进行捕获,显示“发送失败”AddTalkMessage(发送失败!);}}///summary【发送】按钮的Click事件/summaryprivatevoidbuttonSend_Click(objectsender,EventArgse){SendMessage(Talk,+listBoxOnlineStatus.SelectedItem+,+textBoxSend.Text);textBoxSend.Clear();}///summary关闭窗口时触发的事件/summaryprivatevoidMainForm_FormClosing(objectsender,FormClosingEventArgse){//未与服务器连接前client为nullif(client!=null){SendMessage(Logout,+textBoxUserName.Text);isExit=true;br.Close();bw.Close();client.Close();}}///summary在发送信息文本框中按下【Enter】键触发的事件/summaryprivatevoidtextBoxSend_KeyPress(objectsender,KeyPressEventArgse){if(e.KeyChar==(char)Keys.Return){//触发buttonSend的Click事件buttonSend.PerformClick();}}4.4.2猜数游戏服务器端程序:publicpartialclassMainForm:Form{///summary保存连接的所有用户/summaryprivateListUseruserList=newListUser();///summary使用的本机IP地址/summaryIPAddresslocalAddress;///summary监听端口/summaryprivateconstintport=51888;privateTcpListenermyListener;///summary是否正常退出所有接收线程/summaryboolisNormalExit=false;privatedelegatevoidSetComboBoxDelegate(Useruser);publicint[]number=newint[4];//创建一个整形数组number用来存放随机数。stringmessage;//定义一个String类型的message用来向客户端返回相应的信息。publicinti=0;//定义一个public类型的整形变量i用于记录操作次数。publicMainForm(){InitializeComponent();listBoxStatus.HorizontalScrollbar=true;IPAddress[]addrIP=Dns.GetHostAddresses(Dns.GetHostName());localAddress=addrIP[0];buttonStop.Enabled=false;}///summary【开始监听】按钮的Click事件/summaryprivatevoidbuttonStart_Click(objectsender,EventArgse){Randomrand=newRandom();//通过Random类实例化一个对象rand用于产生随机数number[0]=rand.Next(1