C#课程设计の服务器与客户端交互的猜数互动程序模拟_第1页
C#课程设计の服务器与客户端交互的猜数互动程序模拟_第2页
C#课程设计の服务器与客户端交互的猜数互动程序模拟_第3页
C#课程设计の服务器与客户端交互的猜数互动程序模拟_第4页
C#课程设计の服务器与客户端交互的猜数互动程序模拟_第5页
已阅读5页,还剩11页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

软 件 学 院课程设计报告书课程名称 计算机网络编程课程设计 设计题目 猜数游戏 专业班级 学 号 姓 名 指导教师 年 月目录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实验内容 软件名:猜数游戏(分服务器端和客户端两部分)功能:游戏后台运行一个服务器软件,游戏者通过客户端程序登陆后,服务器随机产生一个1100之间的随机数供游戏者猜,游戏者从客户端输入一个数值,如果该数比设定的数大,软件提示:“大了”,如果小,软件提示“小了”,若相等返回“猜对了,你共猜了*次”。服务器同时记录并维护一个游戏玩家的TOP10排行榜,供玩家查询。描述:服务器端:接收客户端的命令请求并提供相应的服务。客户端:完成游戏人机界界面的设计,以命令的方式向服务器请求服务,并显示相应的提示。主要的命令有:1CONNECT IP地址 端口号指定游戏服务器的IP地址和端口号,连接到服务器。响应:连接成功/失败。2LOGIN 用户名用户登录,报告服务器玩家的名字。响应:成功/失败。3GUESS 数字猜数。响应:大了/小了/对了。4LISTTOP10请求显示TOP10排行榜。响应:显示TOP10排行榜。5EXIT退出游戏。4.2算法原理客户端通过点击登录连接到服务器端,发送的数据是String类型的,需要将String类转换成Int类之后才能与服务器端产生的随机数进行比较(不同类型间无法比较)。在服务器端利用方法创建int ccc=new int4;即ccc整形数组将接收的String类型数据转换成整形数据后所存放数组。ccc0 = Convert.ToInt32(talkString.ToString(); 方法表示将转换类型后的数据转存到ccc0中即将String到Int的转换。使用if (number0 ccc0)语句进行比较,输出的语句如:“你输入的数大了”即message = 输入的数大了;赋值给message然后利用user.bw.Write(message+ 操作次数为”+i);将结果送给客户端。服务器在MainForm类下public int number = new int4;建立数组来存放服务器端自动生成的随机数,随机数用Random rand = new Random();类方法实例化一个rand对象,通过调用.Next()方法来创建随机数即 number0 = rand.Next(1, 100);产生的随机数为1100之间。当服务器接受来自客户端的数据之后,通过比较之后返回给客户端信息告知客户端的猜测结果。4.3设计思路客户端程序:在客户端首先登录到服务器端,在客户端会自动创建一个UserSher+数字用户连接到服务器端,当连接成功后会收到来自服务器端的信息:“游戏开始,请输入数据”表示游戏已经开始。客户端通过向服务器端发送String类型的数据通过流套接在服务器端进行比较,每次比较服务器端都会向客户端发送数据信息。服务器端程序:服务器端有用户登录程序。当开始监听后,便监听客户端的连接请求,当建立连接后服务器端会产生一个1100的随机数,这个随机数会存放到ccc0中。当服务器端接收到客户端发送来的数据后通过转存到数组方法将其存放到一个整形数组中。然后与服务器生成的随机数进行比较,比较后用message向客户端发送返回数据。4.4设计过程4.4.1猜数游戏客户端程序: public partial class MainForm : Form /建立客户端程序 private bool isExit = false;/定义私有类型的布尔值 private TcpClient client;/私有类型变量 private BinaryReader br;/私有类型的读如流 private BinaryWriter bw;/自由输出类型的写入流 / / 【连接服务器】按钮的Click事件 / private void buttonConnect_Click(object sender, EventArgs e) /与服务器端建立连接,通过Click事件实现 buttonConnect.Enabled = false;/设置button的初始状态 try client = new TcpClient(Dns.GetHostName(), 51888); AddTalkMessage(连接成功); catch AddTalkMessage(连接失败); buttonConnect.Enabled = true; return; /获取网络流 NetworkStream networkStream = client.GetStream(); /将网络流作为二进制读写对象 br = new BinaryReader(networkStream); bw = new BinaryWriter(networkStream); SendMessage(Login, + textBoxUserName.Text); Thread threadReceive = new Thread(new ThreadStart(ReceiveData); threadReceive.IsBackground = true; threadReceive.Start(); / 处理接收的服务器端数据 private void ReceiveData() string receiveString = null; while (isExit = false) try /从网络流中读出字符串 /此方法会自动判断字符串长度前缀,并根据长度前缀读出字符串 receiveString = br.ReadString(); catch if (isExit = false) MessageBox.Show(与服务器失去联系。); break; / 向服务器端发送信息 private void SendMessage(string message) try bw.Write(message); /将字符串写入网络流,此方法会自动附加字符串长度前缀 bw.Flush();/清空缓冲区 catch /发生异常是进行捕获,显示“发送失败” AddTalkMessage(发送失败!); / 【发送】按钮的Click事件 private void buttonSend_Click(object sender, EventArgs e) SendMessage(Talk, + listBoxOnlineStatus.SelectedItem + , + textBoxSend.Text); textBoxSend.Clear(); / 关闭窗口时触发的事件 private void MainForm_FormClosing(object sender, FormClosingEventArgs e) /未与服务器连接前client为null if (client != null) SendMessage(Logout, + textBoxUserName.Text); isExit = true; br.Close(); bw.Close(); client.Close(); / 在发送信息文本框中按下【Enter】键触发的事件 private void textBoxSend_KeyPress(object sender, KeyPressEventArgs e) if (e.KeyChar = (char)Keys.Return) /触发buttonSend的Click事件 buttonSend.PerformClick(); 4.4.2猜数游戏服务器端程序: public partial class MainForm : Form / 保存连接的所有用户 private List userList = new List(); / 使用的本机IP地址 IPAddress localAddress; / 监听端口 private const int port = 51888; private TcpListener myListener; / 是否正常退出所有接收线程 bool isNormalExit = false; private delegate void SetComboBoxDelegate(User user); public int number = new int4;/创建一个整形数组number用来存放随机数。 string message;/定义一个String类型的message用来向客户端返回相应的信息。 public int i = 0;/定义一个public类型的整形变量i用于记录操作次数。 public MainForm() InitializeComponent(); listBoxStatus.HorizontalScrollbar = true; IPAddress addrIP = Dns.GetHostAddresses(Dns.GetHostName(); localAddress = addrIP0; buttonStop.Enabled = false; / 【开始监听】按钮的Click事件 private void buttonStart_Click(object sender, EventArgs e) Random rand = new Random();/通过Random类实例化一个对象rand用于产生随机数 number0 = rand.Next(1, 100);/产生1100的随机数存放到number数组中。 AddItemToListBox(产生的随机数 + number0);/将产生的随机数输出到服务器 myListener = new TcpListener(localAddress, port); myListener.Start(); AddItemToListBox(string.Format(开始在0:1监听客户连接, localAddress, port); /创建一个线程监听客户端连接请求 Thread myThread = new Thread(ListenClientConnect); myThread.Start(); buttonStart.Enabled = false; buttonStop.Enabled = true; / 接收客户端连接 private void ListenClientConnect() TcpClient newClient = null; while (true) try newClient = myListener.AcceptTcpClient(); catch break; User user = new User(newClient); Thread threadReceive = new Thread(ReceiveData); threadReceive.Start(user); userList.Add(user); /每接受一个客户端连接,就创建一个对应的线程循环接收该客户端发来的信息 AddItemToListBox(string.Format(0进入, newClient.Client.RemoteEndPoint); AddItemToListBox(string.Format(当前连接用户数:0, userList.Count);/用于显示当前连接的用户数量 / / 处理接收的客户端数据 / / 客户端信息 private void ReceiveData(object userState) User user = (User)userState; TcpClient client = user.client; user.bw.Write(服务器端已就绪,请输入数据);/告知客户端可以进行传输 / int ccc=new int4;/创建一个整形数组用于存放客户端发来的数据。ccc0 = Convert.ToInt32(talkString.ToString();/将客户端发来的String类型数据转存到整形数组中以完成String类向Int类的转换(无法利用(int)string强制类型转化)。 AddItemToListBox(输入的随机数 + ccc0);/向服务器显示接收到的数据 i = i + 1;/整形变量,用于存放操作的总次数,每次操作会自动+1; if (number0 ccc0)/进行比较,然后根据比较结果返回message信息 AddItemToListBox(输入的数小了 ); message = 输入的数小了; else if (number0 ccc0) AddItemToListBox(输入的数大了); message = 输入的数大了; else if (number0 =ccc0) AddItemToListBox(输入的数正确了); message = 恭喜你输入的数正确了; user.bw.Write(message+ 操作次数为:+i); / / 发送message给user / / 指定发给哪个用户 / 信息内容 private void SendToClient(User user, string me) try /将字符串写入网络流,此方法会自动附加字符串长度前缀user.bw.Write(me); user.bw.Flush(); AddItemToListBox(string.Format(向0发送:1, user.userName, message); catch AddItemToListBox(string.Format(向0发送信息失败, user.userName); / 移除用户 / 指定要删除的用户 private void RemoveUser(User user) userList.Remove(user); user.Close(); AddItemToListBox(string.Format(当前连接用户数:0, userList.Count); private delegate void AddItemToListBoxDelegate(string str); / 在ListBox中追加状态信息 / 【停止监听】按钮的Click事件 private void buttonStop_Click(object sender, EventArgs e) AddItemToListBox(开始停止服务,并依次使用户退出!); isNormalExit = true; for (int i = userList.Count - 1; i = 0; i-) RemoveUser(userListi); /通过停止监听让myListener.AcceptTcpClient()产生异常退出监听线程 myListener.Stop(); buttonStart.Enabled = true; buttonStop.Enabled = false; / 关闭窗口时触发的事件 private void MainForm_FormClosing(object sender, FormClosingEventArgs e) if (myListener != null) /引发buttonStop的Click事件 buttonStop.PerformClick(); 4.4.3程序框图服务器端运行并开启监听连接自动生成随机数监听接受数据客户端登录到服务器发送猜测数据将数据进行比较生成结果(message)5 总结与展望课程设计结束了,在这次的课程设计中不仅检验了我所学习的知识,也培养了我如何去把握一件事情,如何去做一件事情,又如何完成一件事情。在设计过程中出现了很多的困难,包括在数据调用的时候出现过无法使用的情况、未发现变量的错误,在使用了pub

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论