《C#网络应用编程》课程设计.docx
- 文档编号:3771374
- 上传时间:2022-11-25
- 格式:DOCX
- 页数:40
- 大小:801.84KB
《C#网络应用编程》课程设计.docx
《《C#网络应用编程》课程设计.docx》由会员分享,可在线阅读,更多相关《《C#网络应用编程》课程设计.docx(40页珍藏版)》请在冰豆网上搜索。
《C#网络应用编程》课程设计
C#网络应用编程
院(系):
专业班级:
姓名:
学号:
组员:
日期:
成绩:
一、课程设计目标
1.通过C#网络编程的课程设计,能够增强我们对C#网络编程的认识,更加牢固的掌握网络编程的相关知识。
2.综合运用学习到的理论知识,提高实践能力。
3.通过小组讨论形式对任务进行分解,提出实现方案,制定计划,小组成员分工协作,共同完成课程设计题目,培养团队合作能力。
4.课程设计期间,通过对问题的分析查找资料,培养资料查询以及运用现代信息技术获取相关信息并进行归纳总结的基本能力。
5.与同学讨论,互相学习,提升个人学习能力。
二、课程设计内容
1课程设计的内容
1.1参考《C#网络应用编程实验指导与开发实例》,编写一个网络对战五子棋游戏,简单的实现网络对战五子棋游戏的基本功能。
1.2由于和小组成员分工合作,本人负责客户端方面代码。
因此,本课程设计报告主要涉及服务器端的内容。
并且把重点放在了线程管理,服务器如何管理多个玩家,服务器和客户端如何进行通信等等。
2原理介绍(服务器与客户端通信描述)
网络编程的关键是服务器和客户端如何通信,当服务器和客户端建立连接后,服务器或客户端当接收到对方发送过来的信息后,要对接收的信息做出反应。
为了让通信双方都能理解对方发送过来的信息含义,必须事先规定每条信息的格式以及信息的含义,在本例中,规定任何一条信息,都必须以命令开头,命令后面跟上需要的参数。
命令和参数以及各参数之间均用逗号分隔。
这样接收方接收到信息后,才能理解,并且根据参数可作出相应的反应。
3开发环境及技术介绍
3.1开发环境:
MicrosoftVisualStudio2008
MicrosoftVisualStudio2008是面向WindowsVista、Office2007、Web2.0的下一代开发工具,代号“Orcas”,是对VisualStudio2005一次及时、全面的升级。
VS2008引入了250多个新特性,整合了对象、关系型数据、XML的访问方式,语言更加简洁。
使用VisualStudio2008可以高效开发Windows应用。
设计器中可以实时反映变更,XAML中智能感知功能可以提高开发效率。
同时VisualStudio2008支持项目模板、调试器和部署程序。
VisualStudio2008可以高效开发Web应用,集成了AJAX1.0,包含AJAX项目模板,它还可以高效开发Office应用和Mobile应用。
3.2引用命名空间以及相关类
命名空间:
除了一些基本的,本例中还引用了一些其他的命名空间,如下:
System.IO命名空间包含允许读写文件和数据流的类型以及提供基本文件和目录支持的类型。
System.Net.Sockets命名空间为需要严密控制网络访问的开发人员提供了WindowsSockets(Winsock)接口的托管实现。
TcpClient 、TcpListener 和 UdpClient 类封装有关创建到Internet的TCP和UDP连接的详细信息。
System.Threading用于多线程编程,对线程进行管理,如创建线程、启动线程、终止线程、合并线程等等。
System.Net该命名空间为Internet网络上使用的多种协议提供了方便的编程接口,利用这个命名空间提供的类,不需要考虑所使用协议的具体细节,就能很快实现具体功能。
System.Windows.Forms 命名空间包含用于创建基于Windows的应用程序的类,以充分利用MicrosoftWindows操作系统中提供的丰富的用户界面功能
相关类:
BinaryReader类,用特定的编码将基元数据类型读作二进制值。
BinaryWriter类,以二进制形式将基元类型写入流,并支持用特定的编码写入字符串。
TcpListener类,侦听来自TCP网络客户端的连接。
Thread类,创建并控制线程,设置其优先级并获取其状态。
IPaddress类,提供网际协议(IP)地址。
IPEndPoint类,将网络端点表示为IP地址和端口号。
界面设计:
使用的控件:
(1)两个button负责启动和终止服务。
(2)listBox显示客户状态信息以及服务器与客户端通信的内容。
(3)两个textBox控件,分别控制游戏室允许进入的最多人数和游戏室同时开出的房间数。
整体界面如图所示
4服务器端主要代码介绍
运行VS,新建一个名为GobangServer的Windows应用程序项目。
4.1添加一个User.cs类,表示所有连接到服务器的客户。
代码如下:
usingSystem;
usingSystem.Collections.Generic;
usingSystem.Linq;
usingSystem.Text;
usingSystem.Net.Sockets;
usingSystem.IO;
namespaceGobangServer
{
classUser
{
publicreadonlyTcpClientclient;
publicreadonlyStreamReadersr;
publicreadonlyStreamWritersw;
publicstringuserName;
publicUser(TcpClientclient)
{
this.client=client;
this.userName="";
NetworkStreamnetStream=client.GetStream();
sr=newStreamReader(netStream,System.Text.Encoding.Default);
sw=newStreamWriter(netStream,System.Text.Encoding.Default);
}
}
}
4.2添加一个名为Player.cs的类,表示坐在游戏桌两边的玩家,代码如下:
usingSystem;
usingSystem.Collections.Generic;
usingSystem.Linq;
usingSystem.Text;
namespaceGobangServer
{
classPlayer
{
privateUseruser;
publicUserGameUser
{
get
{
returnuser;
}
set
{
user=value;
}
}
privateboolstart;
publicboolStart
{
get
{
returnstart;
}
set
{
start=value;
}
}
publicPlayer()
{
start=false;
user=null;
}
}
}
4.3添加一个名为GobangBoard.cs的类,表示棋盘,代码如下:
usingSystem;
usingSystem.Collections.Generic;
usingSystem.Linq;
usingSystem.Text;
namespaceGobangServer
{
classGobangBoard
{
publicconstintNone=-1;//无棋子
publicconstintBlack=0;//黑色棋子
publicconstintWhite=1;//白色棋子
privateint[,]grid=newint[15,15];//15*15的方格
///
///棋盘
///
publicint[,]Grid
{
get
{
returngrid;
}
}
privateintnextIndex;
publicintNextIndex///应该黑方放棋子还是白方放棋子
{
get
{
returnnextIndex;
}
set
{
nextIndex=value;
}
}
publicGobangBoard()//构造函数
{
InitializeBoard();
}
publicvoidInitializeBoard()///将15*15的方格中的每个交叉点均设置为无棋子
{
for(inti=0;i<=grid.GetUpperBound(0);i++)
{
for(intj=0;j<=grid.GetUpperBound
(1);j++)
{
grid[i,j]=None;
}
}
nextIndex=Black;
}
publicboolIsExist(inti,intj)///判断放棋子的位置是否已有棋子
{if(grid[i,j]!
=None)
{
returntrue;
}
else
{
returnfalse;
}
}
publicboolIsWin(inti,intj)///判断棋子落下后是否获胜
{
//与方格的第ij交叉点向四个方向的连子数,依次是水平,垂直,左上右下,左下右上
int[]numbers=newint[4];
numbers[0]=GetRowNumber(i,j);
numbers[1]=GetColumnNumber(i,j);
numbers[2]=GetBacklashNumber(i,j);
numbers[3]=GetSlashNumber(i,j);
for(intk=0;k { if(Math.Abs(numbers[k])==5) { returntrue; } } returnfalse; } ///判断横向相同颜色的棋子个数 privateintGetRowNumber(inti,intj) { intnum=1;//连子个数 intx=i+1;//向右检查 while(x<15) { if(grid[x,j]==grid[i,j])//前方棋子与ij点不同时跳出循环 { num++; x++; } else { break; } } x=i-1;//向左检查 while(x>=0) { if(grid[x,j]==grid[i,j])//前方棋子与ij点不同时跳出循环 {num++;x--;} else {break;} } returnnum; } privateintGetColumnNumber(inti,intj)///判断纵向相同颜色的棋子个数 { intnum=1;//连子个数 inty=j+1;//向下检查 while(y<15) { if(grid[i,y]==grid[i,j])//前方棋子与ij点不同时跳出循环 {num++;y++;} else {break;} } //向上检查 y=j-1; while(y>=0) { //前方棋子与ij点不同时跳出循环 if(grid[i,y]==grid[i,j]) {num++;y--;} else {break;} } returnnum; } //判断左上到右下相同颜色的棋子个数 privateintGetBacklashNumber(inti,intj) { intnum=1;//连子个数 intx=i+1;//右下方向 inty=j+1; while(x<15&&y<15) { if(grid[x,y]==grid[i,j])//前方棋子与ij点不同时跳出循环 { num++; x++; y++; } else {break;} } //左上方向(x-,y-) x=i-1; y=j-1; //不超出棋格 while(x>=0&&y>=0) { if(grid[x,y]==grid[i,j])//前方棋子与ij点不同时跳出循环 {num++;x--;y--;} else {break;} } returnnum; } privateintGetSlashNumber(inti,intj)//判断左下到右上相同颜色的棋子个数 { intnum=1;//连子个数 intx=i-1; inty=j+1; while(x>=0&&y<15) { if(grid[x,y]==grid[i,j])//前方棋子与ij点不同时跳出循环 {num++;x--;y++; } else {break;} } x=i+1; y=j-1; while(x<15&&y>=0) { //前方棋子与ij点不同时跳出循环 if(grid[x,y]==grid[i,j]) { num++; x++; y--; } else { break; } } returnnum; } } } 4.4添加一个名为Service.cs的类,代码如下: usingSystem; usingSystem.Collections.Generic; usingSystem.Linq; usingSystem.Text; usingSystem.Windows.Forms; usingSystem.Net.Sockets; usingSystem.IO; namespaceGobangServer { //显示或发送信息 classService { privateListBoxlistbox; privatedelegatevoidAddListBoxItemCallback(stringstr); privateAddListBoxItemCallbackaddListBoxItemCallback; publicService(ListBoxlistbox) { this.listbox=listbox; addListBoxItemCallback=newAddListBoxItemCallback(AddListBoxItem); } publicvoidAddListBoxItem(stringstr) { //比较调用AddListBoxItem方法的线程和创建listBox的线程是否为同一个线程 if(listbox.InvokeRequired==true) { listbox.Invoke(addListBoxItemCallback,str); } else { if(listbox.IsDisposed==false) { listbox.Items.Add(str); listbox.SelectedIndex=listbox.Items.Count-1; listbox.ClearSelected(); } } } //将信息发送给指定的客户 publicvoidSendToOne(Useruser,stringstr) { try { user.sw.WriteLine(str); user.sw.Flush(); AddListBoxItem(string.Format("向{0}发送{1}",user.userName,str)); } catch { AddListBoxItem(string.Format("向{0}发送信息失败",user.userName)); } } //将信息发送给指定房间的所有人 publicvoidSendToRoom(GameRoomgameRoom,stringstr) { //向玩家发送 for(inti=0;i { if(gameRoom.gamePlayer[i].GameUser! =null) { SendToOne(gameRoom.gamePlayer[i].GameUser,str); } } //向旁观者发送 for(inti=0;i { SendToOne(gameRoom.lookOnUser[i],str); } } publicvoidSendToAll(System.Collections.Generic.List { for(inti=0;i { SendToOne(userList[i],str); } } } } 4.5添加一个名为GameRoom.cs的类,游戏室内的每个小房间,代码如下: usingSystem; usingSystem.Collections.Generic; usingSystem.Linq; usingSystem.Text; usingSystem.IO; usingSystem.Net.Sockets; usingSystem.Windows.Forms; namespaceGobangServer { classGameRoom { //进入房间的旁观者 publicList //坐在玩家位置上的黑白两个游戏者 publicPlayer[]gamePlayer=newPlayer[2]; //黑方玩家 publicPlayerBlackPlayer { get { returngamePlayer[0]; } set { gamePlayer[0]=value; } } ///白方玩家 publicPlayerWhitePlayer { get { returngamePlayer[1]; } set { gamePlayer[1]=value; } } privateGobangBoardgameBoard=newGobangBoard(); publicGobangBoardGameBoard { get { returngameBoard; } } ///向listbox中添加显示信息以及向客户发送信息 privateListBoxlistbox; privateServiceservice; //构造函数 publicGameRoom(ListBoxlistbox) { this.listbox=listbox; gamePlayer[0]=newPlayer(); gamePlayer[1]=newPlayer(); service=newService(listbox); //将棋盘上的棋子全部清除 gameBoard.InitializeBoard(); } //放置棋子 publicvoidSetChess(inti,intj,intchessColor) { //发送格式: SetChess,行,列,颜色 gameBoard.Grid[i,j]=chessColor; gameBoard.NextIndex=gameBoard.NextIndex==0? 1: 0; service.SendToRoom(this,string.Format("SetChess,{0},{1},{2}",i,j,chessColor)); if(gameBoard.IsWin(i,j)) { ShowWin(chessColor); } else { service.SendToRoom(this,"NextChess,"+gameBoard.NextIndex); } } privatevoidShowWin(intchessColor) { gamePlayer[0].Start=false; gamePlayer[1].Start=false; gameBoard.InitializeBoard(); service.SendToRoom(this,string.Format("Win,{0}",chessColor)); } } } 4.6重命名Form1.cs为FormServer.cs,修改代码如下: usingSystem; usingSystem.Collections.Generic; usingSystem.ComponentModel; usingSystem.Data; usingSystem.Drawing; usingSystem.Linq; usingSystem.Text; usingSystem.Windows.Forms; usingSystem.Net.Sockets; usingSystem.IO; usingSystem.Threading; usingSystem.Net; namespaceGobangServer { publicpartia
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C#网络应用编程 C# 网络 应用 编程 课程设计
![提示](https://static.bdocx.com/images/bang_tan.gif)