




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、TCP/IP与网络编程课 程 设 计 报 告 书题 目: 2 4分游戏 专 业: 学 号: 学生姓名: 指导教师: 完成日期: 目录1 题目与要求11.1 题目11.2 功能11.3描述12 系统概要设计22.1 实现环境22.2 模块设计22.2.1 客户端界面设计22.2.2 客户端代码设计22.2.3 服务器界面设计32.2.4 服务器代码设计33 系统关键代码43.1 客户端代码43.1.1 连接服务器43.1.2 用户登录43.1.3 获取四个数字53.1.4 提交表达式53.1.5 断开连接53.1.6 查看前十53.1.7 发送数据53.1.8 接收数据63.2 服务器端代码83
2、.2.1 开始服务83.2.2 接收客户端连接93.2.3 接收客户端数据93.2.4添加客户端信息113.2.5 产生四个随机数113.2.6 计算表达式123.2.7 筛选前十123.2.8 发送数据133.2.9 发送给所有客户端134 程序运行结果145 课程设计总结171 题目与要求1.1 题目24分游戏(分服务器端和客户端两部分)1.2 功能游戏后台运行一个服务器软件,游戏者通过客户端程序登陆后,服务器随机产生四个1-9之间的随机数供游戏者使用,游戏者根据计算得出结果。若计算出结果,且在规定的时间内,则从客户端输入表达式,服务器端根据客户端的表达式计算,若正确,软件提示:“对了”,
3、如果错了,软件提示“错了”,若超时。软件提示“超时”。服务器同时记录并维护一个游戏玩家的TOP10排行榜,供玩家查询。1.3描述服务器端:接收客户端的命令请求并提供相应的服务。客户端:完成游戏人机界界面的设计,以命令的方式向服务器请求服务,并显示相应的提示,主要的命令有:1 CONNECT IP地址 端口号指定游戏服务器的IP地址和端口号,连接到服务器。响应:连接成功/失败。2 LOGIN 用户名用户登录,报告服务器玩家的名字。响应:成功/失败。3 COUNT 表达式计算用户输入的表达式。响应:对了/错了/超时。4 LISTTOP10请求显示TOP1
4、0排行榜。响应:显示TOP10排行榜。5 EXIT退出游戏。2 系统概要设计2.1 实现环境采用基于.NET平台的c#语言进行编写,分成服务器端和客户端两部分完成本次设计,基于SOCKET实现客户端与服务器端的连接、交互,使游戏可以正常运行。2.2 模块设计2.2.1 客户端界面设计连接区:输入服务器端的地址及其端口,与服务器建立连接,为客户端用户登录服务器做准备。登录区:输入客户端用户的用户名,登录服务器后才能玩24分游戏与查看积分前十的玩家排行。出题区:用户点击产生四个数按钮后,客户端向服务器发出获取数字的请求,并开始计时。计时区:在用户点击产生四个数按钮后,计时器开始工作,计时器变为0时
5、,游戏结束。查看前十:用户登录服务器后,可查看服务器端记录的积分前十的玩家排行。答题区:用户可以在此提交表达式给服务器,用户当前的积分也在此给出,若表达式结果为24,则用户积分加1,否则,减1。2.2.2 客户端代码设计SendMessage :向服务器发送数据。将string类型消息转换为byte类型后,通过socket套接字向服务器发送数据。ReceiveMess:接收服务器的数据。将byte类型消息转换为string类型,根据服务器返回的消息,判断是返回的关于那部分命令的,做出相应的操作,比如:返回的关于用户请求查看积分排名前十的信息,那么答题区的listbox中会添加前十的用户的积分和
6、名字信息。connbtn_Click:连接按钮的点击事件。获取指定服务器的IP地址和端口,连接服务器,创建并启动线程接收服务器的信息。loginbtn_Click:登录按钮的点击事件。向服务器发送登录请求。getnumbtn_Click:获取四个随机数按钮的点击事件。向服务器请求四个随机数,并开始计时。submitbtn_Click:提交表达式按钮的点击事件。停止计时,并向服务器提交表达式。exitbtn_Click:断开连接按钮的点击事件。断开与服务器的连接。topbtn_Click:查看排名前十按钮的点击事件。向服务器请求查看前十信息。timer1_Tick:计时器。2.2.3 服务器界面
7、设计设置监听端口:指定服务器的端口。Listbox:存放出当前连接服务器的客户端信息。Textbox:存放服务器发出的各种信息。2.2.4 服务器代码设计startbtn_Click:开始服务按钮的点击事件。获取指定的服务器端口,创建监听套接字,绑定IP地址和端口。创建并启动一个监听线程。ClientAccept:接收客户端连接。创建一个套接字与客户端通信,创建并启动一个通信线程。RecevieData:接收客户端信息。将byte类型消息转换为string类型,并根据信息作出相应操作,比如:getnum,服务器产生四个随机数并返回给客户端;submit,服务器计算客户端提交的表达式,若结果为2
8、4,则用户积分加1并返回给客户端,否则,积分减1.log:向用户信息列表中添加用户信息。gnum:产生四个随机数,并将四个数字以消息的方式发送给客户端。sub:计算用户提交的表达式,判断结果是否为24,并判断结果相应地修改用户积分。GetTopTen:通过冒泡法选出排名前十的用户积分和用户名,将信息发送给客户端。SendToClient:将string类型的信息转换为byte类型发送给客户端。stopbtn_Click:停止服务按钮的点击事件。服务器停止工作。SendtoAll:发送给所有连接本服务器的客户端信息。3 系统关键代码3.1 客户端代码3.1.1 连接服务器private void
9、 connbtn_Click(object sender, EventArgs e) loginbtn.Enabled = true; connbtn.Enabled = false; exitbtn.Enabled = true; isExit = false; clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); address = IPAddress.Parse(IPtext.Text.Trim();/获取指定服务器IP地址 int port = int.Pa
10、rse(dktext.Text.Trim();/获取指定服务器端口 IPEndPoint endpoint = new IPEndPoint(address, port);/创建网络节点对象 try clientSocket.Connect(endpoint);/连接服务器 infolistbox.Items.Add("连接成功"); catch(SocketException ex) infolistbox.Items.Add("错误:" + ex.Message); connbtn.Enabled = true; return; SendMessag
11、e("connect,"); Thread threadReceive = new Thread(new ThreadStart(ReceiveMess); threadReceive.IsBackground = true; threadReceive.Start(); 3.1.2 用户登录 private void loginbtn_Click(object sender, EventArgs e) topbtn.Enabled = true; getnumbtn.Enabled = true; loginbtn.Enabled = false; SendMessage
12、("login," + unamtext.Text); Thread threadReceive = new Thread(new ThreadStart(ReceiveMess); threadReceive.IsBackground = true; threadReceive.Start(); 3.1.3 获取四个数字 private void getnumbtn_Click(object sender, EventArgs e) submitbtn.Enabled = true; SendMessage("getnum,"); Thread thr
13、eadReceive = new Thread(new ThreadStart(ReceiveMess); threadReceive.IsBackground = true; threadReceive.Start(); StartTime = DateTime.Now; count = 500; timelabel.Text = count.ToString(); timer1.Start(); 3.1.4 提交表达式 private void submitbtn_Click(object sender, EventArgs e) timer1.Stop(); SendMessage(&q
14、uot;submit," + unamtext.Text.ToString() + "," + textBox1.Text.ToString(); 3.1.5 断开连接 private void exitbtn_Click(object sender, EventArgs e) if (clientSocket != null) SendMessage("exit,"); 3.1.6 查看前十 private void topbtn_Click(object sender, EventArgs e) SendMessage("list
15、topten,"); infolistbox.Items.Clear(); 3.1.7 发送数据 private void SendMessage(string mess) try byte data = Encoding.ASCII.GetBytes(mess); clientSocket.Send(data,data.Length,SocketFlags.None); data = null; catch infolistbox.Items.Add("发送失败"); 3.1.8 接收数据 private void ReceiveMess() byte data
16、 = new byte1024; while (isExit = false) int bufLen = 0; try bufLen = clientSocket.Receive(data); if (bufLen = 0) continue; catch(Exception ex) MessageBox.Show("接收错误:" +ex.Message); return; string receive_mess = System.Text.Encoding.ASCII.GetString(data); string splitString = new string10;
17、splitString = receive_mess.Split(','); string command = splitString0.ToLower(); switch (command) case "connect": infolistbox.Invoke(new EventHandler(delegate infolistbox.Items.Add("连接服务器成功"); ); break; case "login": infolistbox.Invoke(new EventHandler(delegate i
18、nfolistbox.Items.Add("用户登录成功"); ); jifenlabel.Text = splitString1; break; case "getnum": num1.Text = splitString1; num2.Text = splitString2; num3.Text = splitString3; num4.Text = splitString4; break; case "exit": infolistbox.Invoke(new EventHandler(delegate infolistbox.
19、Items.Add("连接失败或与服务器断开连接"); ); isExit = true; clientSocket.Close(); connbtn.Enabled = true; break; case "stopserver": isExit = true; clientSocket.Close(); Application.Exit(); break; case "submit": jifenlabel.Text = splitString2; break; case "listtop": infolist
20、box.Invoke(new EventHandler(delegate infolistbox.Items.Add(splitString1); ); break; default: infolistbox.Invoke(new EventHandler(delegate infolistbox.Items.Add(receive_mess); ); break; Application.Exit();/退出 3.2 服务器端代码3.2.1 开始服务private void startbtn_Click(object sender, EventArgs e) int port; string
21、 address = null; port = Convert.ToInt32(porttext.Text);/获取监听端口 string myHostName = Dns.GetHostName();/得到主机名 /获取本机地址 IPHostEntry ipEntry = Dns.GetHostEntry(myHostName); for (int i = 0; i <ipEntry.AddressList.Length; i+) try if (ipEntry.AddressListi.AddressFamily = AddressFamily.InterNetwork) addre
22、ss = ipEntry.AddressListi.ToString(); catch break; /定义一个套接字用于监听客户端发来的消息,包含三个参数(IP4寻址协议,流式连接,Tcp协议) serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); /将IP地址和端口绑定到网络节点上 IPEndPoint endpoint = new IPEndPoint(IPAddress.Parse(address), port); /监听绑定的网络节点 serverSock
23、et.Bind(endpoint); /将套接字的监听队列长度限制为10 serverSocket.Listen(10); /创建一个监听线程 serverThread = new Thread(ClientAccept); serverThread.IsBackground = true; serverThread.Start(); textBox1.AppendText("开始监听客户端传来的信息!" + "rn" + address + ":"+ port + "rn"); startbtn.Enabled
24、= false; 3.2.2 接收客户端连接private void ClientAccept() /接收客户端连接 Socket clientSocket = null; while (isNormalExit = false) try clientSocket = serverSocket.Accept(); catch(Exception ex) /提示套接字监听异常 MessageBox.Show("listen Error:" + ex.Message); RemoteEndPoint = clientSocket.RemoteEndPoint.ToString(
25、); /客户端网络结点号 textBox1.AppendText("成功与" + RemoteEndPoint + "建立连接!tn"); /显示与客户端连接情况 dic.Add(RemoteEndPoint, clientSocket); /添加客户端信息 OnlineList_Disp(RemoteEndPoint); /显示在线客户端 /IPEndPoint netpoint = clientSocket.RemoteEndPoint as IPEndPoint; /创建一个通信线程 ParameterizedThreadStart pts = n
26、ew ParameterizedThreadStart(RecevieData); Thread thread = new Thread(pts); thread.IsBackground = true; /设置为后台线程,随着主线程退出而退出 thread.Start(RemoteEndPoint); /启动线程 3.2.3 接收客户端数据 private void RecevieData(object remoteEndPoint) /处理接收的客户端数据 string RemoteEndPoint = remoteEndPoint.ToString(); Socket clientSoc
27、ket = dicRemoteEndPoint; string receiveString = null; byte buffer = new byte1024*1024; while (isNormalExit = false) try /从网络流中读出字符串,此方法会自动判断字符串长度前缀,并根据长度前缀读出字符串 int bufLen = clientSocket.Receive(buffer); receiveString = System.Text.Encoding.ASCII.GetString(buffer); if (bufLen = 0) continue; /将发送的字符串
28、信息附加到文本框txtMsg上 Array.Clear(buffer, 0, bufLen); textBox1.AppendText("客户端:" + clientSocket.RemoteEndPoint + "rn" + receiveString + "rnn"); catch (Exception ex) textBox1.AppendText("客户端" + "已经中断连接" + "错误:" + ex + "rn"); /提示套接字监听异常 l
29、istBox1.Items.Remove(RemoteEndPoint.ToString();/从listbox中移除断开连接的客户端 clientSocket.Close();/关闭之前accept出来的和客户端进行通信的套接字 break; string splitString = receiveString.Split(','); string command = splitString0.ToLower(); /int score; /把收到的字符串按“,”分隔然后赋给splitString switch (command) case "connect&quo
30、t;: textBox1.AppendText(string.Format("来自0", clientSocket.RemoteEndPoint); mess = "connect," SendToClient(RemoteEndPoint, mess); break; case "login": string name = splitString1; textBox1.AppendText(string.Format("该用户用户名为0",name); log(name); break; case "g
31、etnum": gnum(); break; case "exit": mess="exit," SendToClient(RemoteEndPoint, mess); listBox1.Items.Remove(clientSocket.RemoteEndPoint.ToString(); dic.Remove(RemoteEndPoint); clientSocket.Close(); break; case "submit": name = splitString1; string expression = split
32、String2; sub(expression, name); break; case "listtopten": GetTopTen(RemoteEndPoint); break; default: textBox1.AppendText(string.Format(receiveString); break; 3.2.4添加客户端信息 private void log(string name) /添加客户端信息 score = 0; User client = new User(); client.userName = name; client.scores = 0;
33、user.Add(client); mess = "login," + score + "," SendToClient(RemoteEndPoint, mess); 3.2.5 产生四个随机数private void gnum() Random random = new Random(DateTime.Now.Millisecond); /用当前时间的毫秒作随机种子产生随机数 int num1 = random.Next(1, 9);/产生四个19随机数 int num2 = random.Next(1, 9); int num3 = random.N
34、ext(1, 9); int num4 = random.Next(1, 9); mess = "getnum," + num1 + "," + num2 + "," + num3 + "," + num4 + "," SendToClient(RemoteEndPoint, mess); 3.2.6 计算表达式private void sub(string expression,string name) DataTable eval = new DataTable(); int result
35、= Convert.ToInt32(eval.Compute(expression, ""); if (result = 24) score += 1; mess = "submit,回答正确," + score + "," SendToClient(RemoteEndPoint, mess); else score -= 1; mess = "submit,回答错误," + score + "," SendToClient(RemoteEndPoint, mess); 3.2.7 筛选前十 private void GetTopTen(string RemoteEndPoint) User useri = new User(); for (int i = 0; i <
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年山东职业学院辅导员考试真题
- 2024年山东交通学院辅导员考试真题
- 年度团队激励计划的实施
- 2024年陕西实验高级中学招聘笔试真题
- 多样化学习资源的开发与利用计划
- 2024年甘肃省乡村振兴局下属事业单位真题
- 建材市场安全保障总结与规划计划
- 2024年泸州市纳溪区事业单位引进笔试真题
- 2025届浙江省金华市婺城区第四中学八下数学期末联考试题含解析
- 应对压力的心理调适计划
- 广东旅游车队公司一览
- ESD标准培训资料ppt课件
- 河南省确山县三里河治理工程
- 水利工程合同工程完工验收工程建设管理工作报告
- photoshop实训指导书
- 多级泵检修及维护(1)
- 涵洞孔径计算
- 测量未知电阻的方法
- 中国民主同盟入盟申请表
- 观感质量检查表
- 企业信息登记表
评论
0/150
提交评论