下载

1下载券

加入VIP
  • 专属下载特权
  • 现金文档折扣购买
  • VIP免费专区
  • 千万文档免费下载

上传资料

关闭

关闭

关闭

封号提示

内容

首页 网络五子棋系统(c#实现)

网络五子棋系统(c#实现).doc

网络五子棋系统(c#实现)

xianghuyi_fl2g5
2011-06-11 0人阅读 举报 0 0 暂无简介

简介:本文档为《网络五子棋系统(c#实现)doc》,可适用于IT/计算机领域

关键技术C#网络编程技术与实践–网络五子棋系统目录TOCo""hzuHYPERLINKl"Toc"第一章设计思路HYPERLINKl"Toc"第二章关键技术HYPERLINKl"Toc"在下拉列表中绘制图片HYPERLINKl"Toc"UDP协议HYPERLINKl"Toc"用socket实现信息传递的必备条件HYPERLINKl"Toc"自定义事件的设置HYPERLINKl"Toc"动态按钮的设置HYPERLINKl"Toc"第三章设计过程HYPERLINKl"Toc"类库的设计HYPERLINKl"Toc"客户端注册模块设计HYPERLINKl"Toc"客户端登录模块设计HYPERLINKl"Toc"五子棋大厅的设计HYPERLINKl"Toc"对决窗体的设计HYPERLINKl"Toc"网络五子棋服务器窗体的设计第一章设计思路随着计算机信息技术的发展网络游戏已成为我们生活中的重要组成部分由于网络游戏占用的资源比较大易受到病毒的攻击所以局域网游戏被游戏爱好者广泛应用。五子棋游戏因其优秀的人工智能深受广大玩家的喜爱而对于初步探索网络编程的编程爱好者来说编制五子棋程序因其规则简单而在受欢迎。设计思路网络五子棋游戏主要实现的目标如下:操作简单方便界面简洁美观在注册时设置注册人员的头像和性别进入某区的房间时显示当前房间的人员信息进入和退出座位时显示在座状态在对决双方的棋盘上显示棋子在下完棋后高亮度显示最后下的棋子按五子棋的规则计算对决双方的输赢在服务器端对人员的分数进行顺序了解网络五子棋游戏的主要实现目标之后接下来就要制作五子棋游戏但在制作之前必须要有一个大体的思路。制作网络五子棋游戏首先需要创建两个windows应用程序用于设置服务器端和客户端(即注册登录大厅及对决窗体)。然后创建一个windows类库主要用于记录传递信息的结构。该程序主要由客户端和服务器端两个部分设计组成。客户端主要用于显示注册登录和信息得发送等服务端主要用于显示在线人员的状态以及客户端向远程客户端发送信息的一个中转站。下图所示为网络五子棋游戏的业务流程图。第二章关键技术在下拉列表中绘制图片本章在对游戏用户进行注册时为了便于在游戏中区分用户自制了一个带有图片的下拉列表通过该列表用户可以随意设置头像。如下图在下拉列表中绘制图片中绘制图片是用ComboBox控件和GDI技术来实现的在ComboBox控件的列表项中绘制图片前要对DrawMode和DropDownStyle属性进行设置。下面对这两个属性进行详细说明。(DrawMode属性该属性用于获取或设置一个值该值指示是由代码还是由操作系统来处理列表中元素的绘制。语法格式如下:PublicDrawModeDrawMode{getset}属性值:DrawMode枚举值之一。默认为normalDrawMode的枚举值如下表所示。参数说明Normal控件中的所有元素都由操作系统绘制并且元素大小都相等OwnerDrawFixed控件中的所有元素都由手动绘制并且元素大小都相等OwnerDrawVariable控件中的所有元素都由手动绘制元素大小可能不相等(DropDownStyle属性该属性用于获取或设置指定组合框样式的值。用于确定用户能否在文本部分中输入新值以及列表部分是否总显示。语法格式如下:PublicDropDownStyleDropDownStyle{getset}属性值:ComBoxStyle值之一。默认为DropDown。ComBoxStyle值如表所示参数说明DropDown文本部分可编辑。用户必须单击箭头按钮来显示列表部分。这是默认样式。DropDownList用户不能直接编辑文本部分。用户必须单击箭头按钮来显示列表部分。Simple文本部分可编辑。列表部分总可见。在ComboBox控件的列表项中绘制图片主要是在该控件的DrawItem事件中进行的该事件在ComboBox控件的可视方位更改时发生。下面用来实现在ComboBox控件中绘制图片的相关步骤。首先在窗体的Shown(第一次显示)事件中设置ComboBox控件的DrawMode和DropDownStyle属性使该控件的下拉项可以进行手动绘制并且不能在文本部分输入新值。然后在ComboBox控件的DrawItem事件中将ImageList组件所存储的图片绘制到下拉列表的各项中。UDP协议UDP协议就是“用户数据报协议”它是一种无连接协议在用该协议进行数据传输时发送方只需要知道对方的IP地址和端口号就可以发送数据并不需要进行连接当连接的远程主机端口号处于监听状态时则UDP必须处于连接状态。用C#发送和接收UDP数据包是通过UdpClient类实现的下面对该类的常用方法进行说明。()Send方法该方法将UDP数据报发送给指定的远程计算机。其语法格式如下:publicintSend(byte,intbytesIPEndPointendPoint)Send方法的参数说明如表所示参数说明dgram要发送的UDP数据文报(以字节数组表示)bytes数据文报中的字节数endpoint一个IPEndPoint表示要将数据文报发送到的主机和端口filePath文件所在路径返回值:返回已发送的字节数。(Receive方法该方法用于返回远程主机发送的UDP数据报。其语法格式如下PublicbyteReceive(refIPEndPointremoteEP)RemoteEP:是一个IPEndPoint类的实例表示网络中发送此数据包的节点。如果指定了远程计算机发送到本地计算机的端口号可以通过监听本地端口号来实现对数据的获取下面就是通过监听本地计算机的端口号“”来获取信息的相关代码:用socket实现信息传递的必备条件在刚开始编写网络五子棋程序时客户端和服务器端分别调用GobangClass类库(主要是使用自定义组件UDPSocket实现局域网的通信)在客户端向服务器端发送信息时弹出“无法找到程序集”对话框。通过以上对话框可以分析出在对自定义控件进行序列化时将当前工程(类库)的信息也进行了序列化所以服务器端和客户端的程序集不一致就会出现上面问题。那么如何解决这一问题呢?将类库(主要UDP协议)添加到客户端和服务器端的引用中使其调用同一个类库。自定义事件的设置本章在设置五子棋的下棋过程中设置了几个自定义事件来完成在单击棋盘时添加棋子的操作。事件是类和对象向外界发出的消息事件的执行是通过事件委托的方式调用已准备好的处理方法它是在消息之前响应的。要响应事件并针对某些事件执行已定义的方法。需要做到以下几步。A声明事件委托。B声明事件C添加事件的触发方法D添加事件的处理程序(响应事件的方法)E将指定的事件处理程序绑定到要处理的事件上(订阅事件)F用户信息操作并触发事件(调用事件的触发方法)G通过事件委托的回调执行需要的事件处理程序动态按钮的设置在本程序的“登录”窗体“游戏大厅”窗体和“对决”窗体中对最小化最大化关闭和发送按钮设置了动态效果当鼠标在按钮上移动时可以改变按钮的样式。以上实现过程主要通过控件的MouseEnter和MouseLeave事件来完成MouseEnter事件是鼠标进入控件的可见部分时发生。在这里主要用于改变控件的图片样式。MouseLeave事件在鼠标离开控件的可见部分时发生。在这里主要用于恢复控件的原始图片样式。第三章设计过程网络五子棋程序的主要功能是通过自定义组件UDPSocke在服务器和大厅窗体中实现信息的互传使用服务器端记录当前所有用户的在线状态并在用户进入房间时显示该房间的所有用户信息。网络五子棋程序的运行结果如图所示类库的设计在开发网络五子棋时可以将UDP协议封装成一个控件或者将局域网中发送成接收信息的功能封装成类。为了便于客户端和服务端的调用可以将UDP组件和自定义类存储在QQClass类库中。下面对控件和类进行说明PublicClass类该类用于记录服务器和客户器的基本信息并通过自定义方法MyHostIP获取服务器端的所有IP地址通过自定义方法Getwindows获取Windows目录。ClassMsg类该类主要是用枚举类型的元素值指定消息发送的命令消息类型消息发送的状态等并用Serializable对类进行序列化当类序列化后序列化引擎将跟踪所有已序列化的引用对象以确保对象不被序列化多次ClassOptionData类该类将服务器端对数据库的操作进行了封装通过对该类中各方法的调用可以对数据表进行添加修改及读取的操作。下面对各方法进行详细说明。()ExSQL方法该方法通过ConStr参数所传递的SQL语句对指定数据表进行查询并将记录个数进行返回()ExSQLReDr方法该方法通过ConStr参数所传递的SQL语句对指定数据表进行查询并将查找到的数据信息以SqlDataReader对象进行返回。ClassOptionData类该类主要利用SerializeBinary和DeSerializeBinary方法在客户端发送或接收信息时将对象序列化。(SerializeBinary方法该方法是在客户端接收信息时将二进制流反序列化为对象并返回反序列化后的对象这样便于在指定的控件上显示接收的信息。(DeSerializeBinary类该类用于记录当前游戏用户的编号IP地址端口号用户名称和用户状态并对该类进行序列化。ClassUserInfo类该类用于记录当前游戏用户编号IP地址端口号用户名称和用户状态并对该类进行序列化。客户端注册模块设计注册模块主要是在客户端用户第一次使用网络五子棋程序时对当前用户进行注册并将注册的信息发送给服务器端进行记录。注册窗口运行结果如下图所示。在“用户注册”窗体中输入完注册信息后单击“确定”按钮将通过自定义组件dupSocket和send方法将注册信息以二进制流的形式发送给服务器端详细代码如下privatevoidbuttonOKClick(objectsender,EventArgse){if(textPassWordTextTrim()==textPassWordTextTrim())当密码输入相同{udpSocketLocalPort=ConvertToInt(textIPTextTrim())udpSocketActive=trueClassMsgmsg=newClassMsg()msgUserName=textNameTextmsgPassWord=textPassWordTextmsgsendKind=SendKindSendCommandmsgmsgCommand=MsgCommandRegisteringserID=textIPTextTrim()msgRIP=serIDTrim()msgRPort=textIPTextTrim()msgCPhoto=comboBoxCPhotoSelectedIndexif(comboBoxSexSelectedIndex<=)msgSex=elsemsgSex=udpSocketSend(IPAddressParse(serID),,newClassSerializers()SerializeBinary(msg)ToArray())}else{textPassWordText=""textPassWordText=""MessageBoxShow("密码与确认密码不匹配请重新输入。")}}客户端登录模块设计登录模块主要是将用户名和密码发送到服务器端当服务器端有该用户时将返回一个登录成功的消息将关闭登录窗体进入五子棋大厅。登录窗体运行结果如图所示。在登录窗体加载时首先在Windows目录中查找Gobangini文件当该文件不存在时调用注册窗体否则在INI文件中读取服务器的IP地址和端口号。代码如下:privatevoidFLogonLoad(objectsender,EventArgse){如果程序启动目录中没有Serverini文件if(SystemIOFileExists(PubClassGetwindows()"Gobangini")==false){FSerSetupFrmSerSetup=newFSerSetup()创建并引用注册窗体FrmSerSetupText="用户注册"设置注册窗体的名称if(FrmSerSetupShowDialog(this)==DialogResultOK)当注册窗体的对话框返回值为OK时{FrmSerSetupDispose()释放注册窗体的所有资源}else{FrmSerSetupDispose()DialogResult=DialogResultCancel将当前窗体的对话框返回值设为Cancel}}如果Windows目录中有Serverini文件if(SystemIOFileExists(PubClassGetwindows()"Gobangini")==true){PublecClassServerIP=""PublecClassServerPort=""读取INI文件StringBuildertemp=newStringBuilder()读取服务器的IP地址GetPrivateProfileString("MyGobang","IP","服务器地址读取错误。",temp,,PubClassGetwindows()"Gobangini")PublecClassServerIP=tempToString()读取端口号GetPrivateProfileString("MyGobang","Port","服务器端口号读取错误。",temp,,PubClassGetwindows()"Gobangini")PublecClassServerPort=tempToString()读取用户名称GetPrivateProfileString("MyGobang","Name","服务器端口号读取错误。",temp,,PubClassGetwindows()"Gobangini")PublecClassClientName=tempToString()读取用户头像GetPrivateProfileString("MyGobang","Caput","服务器端口号读取错误。",temp,,PubClassGetwindows()"Gobangini")PublecClassCaputID=ConvertToInt(tempToString())}else{DialogResult=DialogResultCancel}}privatevoidbuttonQQCloseClick(objectsender,EventArgse){DialogResult=DialogResultCanceludpSocketActive=false}privatevoidudpSocketDataArrival(byteData,IPAddressIp,intPort){DataArrivaldelegateoutdelegate=newDataArrivaldelegate(DataArrival)thisBeginInvoke(outdelegate,newobject{Data,Ip,Port})}privatedelegatevoidDataArrivaldelegate(byteData,SystemNetIPAddressIp,intPort)privatevoidDataArrival(byteData,SystemNetIPAddressIp,intPort)当有数据到达后的处理进程{PublecClassPubclass=newPublecClass()try{ClassMsgmsg=newClassSerializers()DeSerializeBinary((newSystemIOMemoryStream(Data)))asClassMsgswitch(msgmsgCommand){caseMsgCommandLogined:登录成功PublecClassUserID=msgSIDPublecClassFraction=msgFractionPublecClassUserSex=msgSexPublecClassClientIP=PubclassMyHostIP()获取当前计算机的IP地址DialogResult=DialogResultOKudpSocketActive=falsethisClose()break}}catch{}}privatevoidFLogonFormClosed(objectsender,FormClosedEventArgse){if(udpSocketActive)udpSocketActive=false}privatevoidpictureBoxMouseDown(objectsender,MouseEventArgse){frmClientCPoint=newPoint(eX,eY)}privatevoidpictureBoxMouseMove(objectsender,MouseEventArgse){frmClientFrmMove(this,e)}}}单击窗体中的“登录”按钮该按钮通过窗体加载所获取的服务器IP和端口号将用户名和密码以二进制流的形式发送给服务器端。代码如下:privatevoidbuttonQQLogonClick(objectsender,EventArgse){if(PublecClassServerPort!=""PublecClassServerIP!="")当读取到服务器的IP和端口号时{udpSocketLocalPort=ConvertToInt(PublecClassServerPort)udpSocketActive=true启动自定义的udpSocket控件ClassMsgmsg=newClassMsg()msgUserName=textNameTextmsgPassWord=textPassWordTextmsgsendKind=SendKindSendCommandmsgmsgCommand=MsgCommandLoginingstringIP=PublecClassServerIPstringPort=PublecClassServerPortudpSocketLocalPort=ConvertToInt(Port)udpSocketSend(IPAddressParse(IPTrim()),,newClassSerializers()SerializeBinary(msg)ToArray())PublecClassUserName=textNameText}}五子棋大厅的设计五子棋大厅主要是在游戏者进入指定区域的指定房间后在“用户信息”列表框中显示当前进入房间的所有用户信息当单击指定座位时将在座位上显示当前用户的头像并进入下棋窗体如果退出下棋窗体则移除座位上的头像。进入五子棋大厅后所有用户都可以在“公共聊天”中进行对话。五子棋大厅运行结果如图所示。五子棋大厅加载时首先要调用登录窗体当登录窗体验证成功后通过服务器端的IP地址和端口号打开自定义组件UdpSocket进行Socket监听。代码如下:privatevoidFormLoad(objectsender,EventArgse){frmClientImageDir()pictureBoxBackDock=DockStyleFillFLogonFrmLogon=newFLogon()创建并引用登录窗体if(FrmLogonShowDialog(this)==DialogResultOK)当登窗体的对话框的返回值为OK时{FrmLogonDispose()thisWindowState=FormWindowStateMaximizedfrmClientBrushChar(panelPublic)udpSocketLocalHost=PublecClassServerIPudpSocketLocalPort=ConvertToInt(PublecClassServerPort)udpSocketActive=true}else{FrmLogonDispose()Close()}}显示“大厅”窗体后在“五子棋导航”列表中以树形结构显示游戏的区域并使根节点“五子棋”不能进行展开和收缩的操作这一过程在窗体的显示事件中完成在“五子棋导航”列表中当展开某一区域后双击指定的房间时将进入该房间并发送消息给服务器端获取当前房间的所有在线用户信息将用户信息添加到“用户信息”列表中如果有进行游戏的用户则在指定的座位上显示用户的头像。自定义方法SetLabelModule主要是在进入房间时对当前房间所有座位上的相关信息进行初始化。部分代码如下:privatevoidtreeViewAreaNodeMouseDoubleClick(objectsender,TreeNodeMouseClickEventArgse){ClientClassCClass=newClientClass()stringTemNodeS=eNodeNameTreeNodetNode=newTreeNode()if(TemNodeSIndexOf("Room")>=){tNode=eNodePublecClassTRoomM=ConvertToInt(tNodeTagToString())TreeNodetNode=newTreeNode()tNode=(TreeNode)tNodeParentPublecClassTAreaM=ConvertToInt(tNodeTagToString())if(IAreaM==PublecClassTAreaMIRoomM==PublecClassTRoomM)如果进入的是同一个房间returnif(PublecClassTAreaM>PublecClassTRoomM>){listViewuserItemsClear()ClassMsgTeMsg=newClassMsg()TeMsgsendKind=SendKindSendCommandTeMsgmsgCommand=MsgCommandExitToAreaTeMsgAreaMark=IAreaMToString()TeMsgRoomMark=IRoomMToString()TeMsgUserName=PublecClassUserNameudpSocketSend(IPAddressParse(PublecClassServerIP),,newClassSerializers()SerializeBinary(TeMsg)ToArray())}if(pictureBoxBackVisible==true){pictureBoxBackVisible=falseflowPanelOpposeVisible=truefrmClientBrushChar(panelPublic)}设置要传递的信息ClassMsgmsg=newClassMsg()msgAreaMark=PublecClassTAreaMToString()msgRoomMark=PublecClassTRoomMToString()msgRIP=PubClassMyHostIP()msgRPort=PublecClassServerPortmsgSIP=PublecClassServerIPmsgSPort=""msgsendKind=SendKindSendCommandmsgmsgCommand=MsgCommandComeToHallmsgCPhoto=PublecClassCaputID发送消息udpSocketSend(IPAddressParse(PublecClassServerIP),,newClassSerializers()SerializeBinary(msg)ToArray())CClassSetLabelModule(flowPanelOppose,imageList)IAreaM=PublecClassTAreaMIRoomM=PublecClassTRoomM}}privatevoidtreeViewAreaBeforeCollapse(objectsender,TreeViewCancelEventArgse){if(ConvertToInt(eNodeTagToString())==){eCancel=true}}对决窗体的设计对决窗体是双方用户进行下棋的窗口它的主要功能是在单用户进入窗体时只显示当前用户信息在用户进入窗体前如果有玩家进入则在当前窗体中显示双方的信息并将当前用户的信息发送给对方用户。运行结果如图所示在介绍对决窗体前首先要介绍ChessClass文件夹下自定义的ClientClientObjectClientObjectEventArgs类它们主要用于Socket的监听以及自定义事件的设置。自定义类Client的主要功能是建立对决用户的连接关闭连接以及信息得传递。自定义类CientObject的主要功能是创建自定义事件并通过接收消息的标识来判断执行哪个事件。在对决窗体第一次显示时首先要判断对方座位是否有玩家如果没有玩家则在对决窗体中添加当前用户的信息如果有玩家则在当前窗体中添加对决双方的信息将“开始”按钮设置为可用。最后对棋子的相关数组进行初始化。部分主要代码如下:publicvoidAddChess(objectsender,ClientGobangChessClassAddChessEventArgse){if(thisInvokeRequired){thisInvoke(newEventHandler<ClientGobangChessClassAddChessEventArgs>(thisAddChess),newobject{sender,e})}else{stringCplace=eNumberstringCcolumn=CplaceSubstring(,CplaceIndexOf("*"))stringCrow=CplaceSubstring(CplaceIndexOf("*"),CplaceLength(CplaceIndexOf("*")))PictureBoxpictureBoxTem=newPictureBox()pictureBoxTemParent=panelCheckpictureBoxTemLocation=newSystemDrawingPoint(ConvertToInt(Crow)*,ConvertToInt(Ccolumn)*)pictureBoxTemName="pictureBox"eNumberpictureBoxTemSize=newSystemDrawingSize(,)pictureBoxTemSizeMode=PictureBoxSizeModeStretchImagenoteConvertToInt(Ccolumn),ConvertToInt(Crow)=ConvertToInt(eIm)intnum=IntParse(eIm)BBow=IntParse(eBow)pictureBoxTemImage=imageListImagesnumpBoxSignVisible=truepBoxSignLocation=newSystemDrawingPoint(ConvertToInt(Crow)*,ConvertToInt(Ccolumn)*)pBoxSignBringToFront()ifUPdata=Arithmetic(num,ConvertToInt(Ccolumn),ConvertToInt(Crow))ifUPdata=if(ChildSgin==true){if(BBow==){if(labelLeftTextTrim()==PublecClassUserName){pictureBoxQLeftImage=pictureBoxQLeftImage=ImageFromFile(ClientClassImaDir"Image黑棋png")}else{pictureBoxQRightImage=pictureBoxQRightImage=ImageFromFile(ClientClassImaDir"Image白棋png")}}else{if(labelLeftTextTrim()==PublecClassUserName){pictureBoxQLeftImage=pictureBoxQLeftImage=ImageFromFile(ClientClassImaDir"Image白棋png")}else{pictureBoxQRightImage=pictureBoxQRightImage=ImageFromFile(ClientClassImaDir"Image黑棋png")}}ChildSgin=false}}WhoFisrtDown=truedropchild=true}判断黑棋是否赢publicvoidBwin(){MessageBoxShow("黑子赢了!!请重新开始游戏!")ClassMsgtemMsg=newClassMsg()if(labelGenreText=="黑棋"){for(inti=i<listViewBattleItemsCounti){if(listViewBattleItemsiSubItemsTextTrim()==PublecClassUserNameTrim()){PublecClassFraction=PublecClassFractionlistViewBattleItemsiSubItemsText=PublecClassFractionToString()labelFText=PublecClassFractionToString()}if(listViewBattleItemsiSubItemsTextTrim()==GemN){GemF=GemFlistViewBattleItemsiSubItemsText=GemFToString()}}}else{for(inti=i<listViewBattleItemsCounti){if(listViewBattleItemsiSubItemsTextTrim()==PublecClassUserNameTrim()){PublecClassFraction=PublecClassFractionlistViewBattleItemsiSubItemsText=PublecClassFractionToString()labelFText=PublecClassFractionToString()}if(listViewBattleItemsiSubItemsTextTrim()==GemN){GemF=GemFlistViewBattleItemsiSubItemsText=GemFToString()}}}if(ifUPdata==){temMsgRIP=PublecClassClientIP记录用户的IP地址temMsgRPort=PublecClassServerPort记录端口号temMsgFraction=PublecClassFraction当前分数temMsgsendKind=SendKindSendCommandtemMsgmsgCommand=MsgCommandUPDataFractudpSocketSend(IPAddressParse(PublecClassServerIP),,newClassSerializers()SerializeBinary(temMsg)ToArray())temMsgRIP=GIP记录用户的IP地址temMsgRPort=GPort记录端口号temMsgFraction=GemF当前分数temMsgsendKind=SendKindSendCommandtemMsgmsgCommand=MsgCommandUPDataFractudpSocketSend(IPAddressParse(PublecClassServerIP),,newClassSerializers()SerializeBinary(temMsg)ToArray())}BwinCountCanAgins=falseConqueror=trueCKind=CanAgin=falseWhoFisrtDown=falsedropchild=truethispictureBoxImage=thispictureBoxEnabled=truethispictureBoxImage=ImageFromFile(ClientClassImaDir"Image开始按钮png")}判断白棋是否赢publicvoidWwin(){MessageBoxShow("白子赢了!!请重新开始游戏!")ClassMsgtemMsg=newClassMsg()if(labelGenreText=="白棋"){for(inti=i<listViewBattleItemsCounti){if(listViewBattleItemsiSubItemsTextTrim()==PublecClassUserNameTrim()){PublecClassFraction=PublecClassFractionlistViewBattleItemsiSubItemsText=PublecClassFractionToString()labelFText=PublecClassFractionToString()}if(listViewBattleItemsiSubItemsTextTrim()==GemN){GemF=GemFlistViewBattleItemsiSubItemsText=GemFToString()}}}else{for(inti=i<listViewBattleItemsCounti){if(listViewBattleItemsiSubItemsTextTrim()==PublecClassUserNameTrim()){PublecClassFraction=PublecClassFractionlistViewBattleItemsiSubItemsText=PublecClassFractionToString()labelFText=PublecClassFractionToString()}if(listViewBattleItemsiSubItemsTextTrim()==GemN){GemF=GemFlistViewBattleItemsiSubItemsText=GemFToString()}}}if(ifUPdata==){temMsgRIP=PublecClassClientIP记录用户的IP地址temMsgRPort=PublecClassServerPort记录端口号temMsgFraction=PublecClassFraction当前分数temMsgsendKind=SendKindSendCommandtemMsgmsgCommand=MsgCommandUPDataFractudpSocketSend(IPAddressParse(PublecClassServerIP),,new网络五子棋服务器窗体的设计该窗体是客户端与远程客端相互通信的一个中转站当开启服务后将在该窗台上显示已注册的所有用户的信息。例如。用户IP端口号用户名用户分数以及在线状态也可以通过“控制台”下拉列表中的“分数排行”项对当前用户的分数进行排序。网络五子棋服务器窗体运行结果如图所示。在网络五子棋服务器窗体的菜单栏中选择“控制台”“开始服务”项打开UDP协议的监听并将该项设置成“结束服务”代码如下:privatevoidToolOpenClick(objectsender,EventArgse){if(((ToolStripMenuItem)sender)Text=="开始服务"){((ToolStripMenuItem)sender)Text="结束服务"udpSocketActive=true}else{((ToolStripMenuItem)sender)Text="开始服务"ClassOptionDataOptionData=newClassOptionData()OptionDataExSQL("UpdatetbGobangSetState="ConvertToInt(MsgCommandClose)",Borough=,RoomMark=,DeskMark='',SeatMark=''WhereID>")udpSocketActive=falseUpdateUser()}}在自定义组件UDPSocket的DataArrival事件中对客户端发送的消息进行监听并根据发送的消息对数据库进行相应的操作然后将信息返回给发送用户或群发。代码如下:privatevoidDataArrival(byteData,SystemNetIPAddressIp,intPort)当有数据到达后的处理进程{try{ClassMsgmsg=newClassSerializers()DeSerializeBinary((newSystemIOMemoryStream(Data)))asClassMsgswitch(msgsendKind){caseSendKindSendCommand:命令{switch(msgmsgCommand){caseMsgCommandRegistering:注册用户RegisterUser(msg,Ip,Port)breakcaseMsgCommandLogining:登录用户UserLogin(msg,Ip,Port,)breakcaseMsgCommandSendToOne:发送消息给单用户SendUserMsg(msg,Ip,Port)breakcaseMsgCommandComeToHall:UpdateUser(msg,Ip,Port,msgmsgCommand)更新用户在线状态FurbishMsg(msg)UpdateUserList(msg,Ip,Port)返回所有进入大厅的用户breakcaseMsgCommandExitToHall:退出游戏大厅UpdateUser(msg,Ip,Port,msgmsgCommand)更新用户在线状态breakcaseMsgCommandBeginToGame:UpdateUser(msg,Ip,Port,msgmsgCommand)更新用户在线状态breakcaseMsgCommandExitToArea:MessColley(msg,Ip,Port,msgmsgCommand)breakcaseMsgCommandEndToGame:UpdateUser(msg,Ip,Port,msgmsgCommand)更新用户在线状态breakcaseMsgCommandBegingRival:UserGame(msg,Ip,Port,msgmsgCommand)获取用户玩家的信息breakcaseMsgCommandComeToSay:UserText(msg,Ip,Port,msgmsgCommand)breakcaseMsgCommandUPDataFract:UpdatePlayChess(msg,Ip,Port,msgmsgCommand)更改下棋后的分数breakcaseMsgCommandGetGameF:GameF(msg,Ip,Port,msgmsgCommand)更改下棋后的分数break}break}caseSendKindSendMsg:消息{switch(msgmsgComm

用户评价(1)

  • cf5236 很好,报告写的很详细

    2011-06-23 00:38:43

关闭

新课改视野下建构高中语文教学实验成果报告(32KB)

抱歉,积分不足下载失败,请稍后再试!

提示

试读已结束,如需要继续阅读或者下载,敬请购买!

文档小程序码

使用微信“扫一扫”扫码寻找文档

1

打开微信

2

扫描小程序码

3

发布寻找信息

4

等待寻找结果

我知道了
评分:

/25

网络五子棋系统(c#实现)

VIP

在线
客服

免费
邮箱

爱问共享资料服务号

扫描关注领取更多福利