首页 > 编程开发 > Objective-C编程 >
-
c#网络版斗地主之网络部分实现
本文是对C#网络版斗地主的总结,之后还有两篇,分别介绍地主权限的传递和出牌权限的传递,还有出牌算法和规则。
服务器使用server类与客户端通讯,客户端使用client类与服务器通讯。
当创建游戏时,new出一个server对象,并且开始监听默认端口“1991”。
然后创建一个线程,用死循环while(true)检测是否有客户端连接,如果有的话获取Client对象,当获取了两个Clinet对象后,停止监听,中断循环。
服务器获取了两个客户端后,启动两个线程“AccpetClient1Data”、“AccpetClient2Data”,使用server中同名方法,分别监听客户端1和客户端2发送的数据。
当加入游戏时,new出一个client对象,并且连接玩家指定的IP,端口默认为1991。
连接上后,启动线程“AcceptServerData”,使用client中同名方法。
这样,server端使用方法SendDataForClient向客户端发送信息,client能够收到,client端使用SendDataForServer向server端发送信息,Server端也能收到。
值得一提的是,两个客户端之间是没有连接的,他们之间通讯需要通过server端来“代理”。
连接建立好后,客户端的准备按钮显示出来,点击准备按钮向服务端发送“OK”字符串,服务器收到后会通过“AccpetClient1Data”、“AccpetClient2Data”这两个方法识别出来,然后显示服务器端的开始按钮。
点击开始按钮后,服务器端像客户端“发送StartPokers+牌组”,发给自己的牌组不需要在网络中传输,所以直接添加到相关的牌组对象中即可。这里的牌组类要自己写序列化和反序列化的方法,需要把牌组序列化为byte[]才能在网络中传送。
客户端通过“AcceptServerData”方法读取并处理“StartPokers+牌组”。处理后的结果是一个PokerGroup对象,把引用传递给相应对象就完成发牌了。
后面就是确定地主,出牌权限的传递,出出去的牌组的传递等等了,也都是使用server和client中的SendDataForServer 和SendDataForClient方法发送byte流,然后使用“AccpetClient1Data”、“AccpetClient2Data”,“AcceptServerData”,完成接受并处理数据。