首发:个人博客,更新&纠错&回复

客户端采用C#开发,服务器使用java开发,通信方式为socket。

1.首先决定交互协议

客户端指令协议:

getgames:要求服务端发送games指令

creategame:name=xx:新建一个游戏,并指定当前玩家名称,该名称也被用作游戏名称

joingame:game=xx,name=yy:加入一个已有的游戏,指定游戏名称和当前玩家名称

bp:hero=vs:进行BP,表示禁用英雄复仇之魂或选择英雄复仇之魂

服务端指令协议:

games:games=xx|nn:告之客户端“在服务端有多少个可以加入的游戏”,即已有人建主且房间未满的游戏

game:turn=1,p1=xx,p2=yy:告之客户端“你当前加入的游戏的信息”,p1和p2分别是两个玩家的名称,turn是进行到bp的哪个阶段

bp:hero=vs:告之客户端“正在进行的游戏的新进度”,如对方刚刚下了禁用了vs的命令

gameover:msg=对方退出游戏:告之客户端“当前游戏结束”的信息,让客户端返回空闲状态

2.决定协议之后,根据协议完成服务端的实现——

服务端模型:

serverservice一对多,每个service是个线程,负责管理一个客户端连接的工作

servergame一对多,每个game表示一个游戏

gameplayer一对(1..2),每个game有两个玩家,即现实中的两个BP手,也存在已新建游戏,并没人加入游戏的状态,这时只有一个玩家

serviceplayer一对(0..1),如果玩家未创建游戏,也未加入游戏,为1对0,如果在游戏中,为1对1

当服务端接收到客户端命令,总体上进行两个动作,一是改变服务端状态,即修改以上模型的属性,二是(改变完状态之后)由服务端向客户端发送命令,分为响应/向当前游戏玩家广播/向所有玩家广播三种发送方式(见Service类中的response/game/all分支)。具体的响应命令的策略见RequestDealer类

服务端的调试简单的写个java控制台客户端来交互,用之前的这个就可以,确定服务端对命令处理的业务逻辑以及响应的命令正确。

3.服务端完成之后进行客户端的开发——

客户端界面(xaml文件在这里):

客户端的工作包括:

1)有服务端命令到来的时候,根据命令改变客户端状态,再根据客户端状态改变界面显示。

2)玩家在界面上进行操作时,发送客户端命令到服务器。

其中第一步的先改状态再改显示,就是典型的将命令改变到model,再将model渲染到view。

第二步则仅仅做发送命令的操作,不做客户端状态的改变。只有服务器命令能让客户端的状态和显示变化,这样让职责更清晰。

代码在这里,其中dealRequest方法是完成上面1)的工作,方法体内调用setStateMsg方法进行根据状态改变界面的工作;而createGame_Click等响应按钮事件的方法完成上面2)的工作。

总结一下——

1)研究问题领域,进行总体设计(在纸上进行的工作,包括服务器、客户端状态、客户端界面)

2)决定交互协议,服务器、客户端的命令格式,本质为方法名、参数列表的定义。

3)服务端开发,使用模拟客户端进行测试和调试。

4)客户端开发

服务器在182.92.10.238服务器的42769接口,欢迎用socket连接实验,其源码在这里

客户端在这里,360会报木马,最好关闭360再下载。如果不放心可以自行使用源码编译。

最后给自己记的:

1)跑jar包的方法:eclipse导出可执行jar,然后写个bat脚本,内容为call java -jar bpServer.jar。

2)本地项目上传github:先在github上建项目,然后本地新建个文件夹,然后git clone,然后将项目拷贝到出现的子文件夹里,cd进去,git add .,git -commit -m "init",最后git push即可。我的脑子最不擅长记这种机械的东西了……

长期欢迎项目合作机会介绍,项目收入10%用于酬谢介绍人。新浪微博:@冷镜,QQ:908789432

dota BP练习工具开发:一个C/S多用户程序的更多相关文章

  1. Android | 教你如何用代码开发一个拍照翻译小程序

    引子   想必有很多小伙伴喜欢外出旅游,能去海外玩一圈那是更好不过了,旅游前大家一定会对吃.穿.住.行.游玩路线做各种攻略,然后满怀期待的出发- 想象中的旅游   出发前,想象中的旅游目的地可能有漂亮 ...

  2. 使用 WPF 开发一个 Windows 屏幕保护程序

    最近有小伙伴问我如何可以让 Windows 静置一段时间不操作之后,显示一个特殊的界面.我想了想,屏幕保护程序可以做到这一点,而且,屏幕保护程序的开发也是非常简单的. 本文将介绍如何为 Windows ...

  3. Android | 教你如何用华为HMS MLKit 图像分割 SDK开发一个证件照DIY小程序

    Android | 教你如何用华为HMS MLKit 图像分割 SDK开发一个证件照DIY小程序 引子   上期给大家介绍了如何使用如何用华为HMS MLKit SDK 三十分钟在安卓上开发一个微笑抓 ...

  4. 使用Go开发一个简单的服务器程序

    最近有个小项目,需要一个简单的后台程序来支撑,本来想用Nodejs来做,但是由于本人js一直很菜,并且很讨厌callback,虽然我也很喜欢异步模型,但我一直都觉得JS是反人类的.后台就用了go处理, ...

  5. 「1.0」一个人开发一个App,小程序从0到1,起航了

    古有,秦.齐.楚.赵.魏.韩.燕七国争雄:今有,微信.QQ.百度.支付宝.钉钉.头条.抖音七台争霸.古有,白起.李牧.王翦.孙膑.庞涓.赵奢.廉颇驰骋疆场:今有程序员1,程序员2,程序员3…编写代码. ...

  6. 「2.0」一个人开发一个App,小程序从0到1,文件剖析

    不知你是不是见到“文件剖析”这4个大字,才点进来看一看的?如果真是的话,那我可以坦诚.真心.负责任地告诉你:你上当了,你上了贼船啦,如果你现在想跳的话,还来得及,反正茫茫大海中,鲨鱼正缺搞程序的人.说 ...

  7. [3.0] 一个人开发一个App,小程序从0到1,删减添加

    在这个黄道吉日,咱们将要干一件,惊天地泣鬼神,妇孺皆知的大事,那就是删掉微信开发工具自动生成的源代码. 删掉pages下的index.logs目录,啥都不留: 删掉utils下的util.js,只流空 ...

  8. 开发一个渐进式Web应用程序(PWA)前都需要了解什么?

    转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. 原文出处:https://dzone.com/articles/how-to-build-a-progres ...

  9. Android项目实战之(1)-- 开发一个"快速冲浪"的程序

    概述:这个小程序,你讲学习到基本控件(Button,Listview,Gridview,TextView等)的使用技巧,AssetManager类的使用,XML数据的解析方式,BaseAdapter, ...

随机推荐

  1. 转载:如何运用VI编辑器进行查找替换

    使用vi编辑器编辑长文件时,常常是头昏眼花,也找不到需要更改的内容. 这时,使用查找功能尤为重要. 方法如下: 1.命令模式下输入“/字符串”,例如“/Section 3”. 2.如果查找下一个,按“ ...

  2. 在Fedora8上配置Apache Httpd

    原以为Fedora8我安装的是最简版本,于是去Apache Httpd官网下一个httpd,但是速度很成问题,现在还没有下完. 打开Fedora8的光盘,里面有httpd-2.2.6.3-3.i386 ...

  3. 深入css中的margin

    深入css中的margin 第一:margin-top css代码(元素没有任何定位的情况下,并且元素默认为block) <style type="text/css"> ...

  4. 腾讯企鹅智酷100多张PPT:移动时代创业黄金法则

    移动时代创业黄金法则 http://tech.qq.com/a/20141223/008325.htm#p=8

  5. 关闭不安全的HTTP方法

    关闭不安全的HTTP方法 在项目或tomcat下的web.xml中,添加如下配置: <!-- 关闭不安全的HTTP方法 --> <security-constraint> &l ...

  6. Qt4过渡至Qt5

    技术在不断进步,新知识也理应不断学习!Qt5的发布带给我无尽的好奇心,然而,受项目影响,一直使用VS2008 + Qt4.8也未曾及时更新.这几天,果断装上VS2010 + Qt5.1,开始研究.Qt ...

  7. 6、JavaScript进阶篇③——浏览器对象、Dom对象

    一.浏览器对象 1. window对象 window对象是BOM的核心,window对象指当前的浏览器窗口. window对象方法: 注意:在JavaScript基础篇中,已讲解了部分属性,windo ...

  8. ORACLE数据库用户账号处于expired状态如何处理

    账户过期,必须要用户更改密码, 账户才能重新使用. 但有些时候, 因为各种原因, 我们并不知道原密码的明文是什么,但很多时候又不能修改已有密码,好在可以用原密码来更改密码. 在11G中,dba_use ...

  9. php:mysqli扩展

    mysqli功能概述:http://php.net/manual/zh/mysqli.summary.php 代码(基本的用法):貌似可以防止sql注入 $root = "root" ...

  10. wampserver环境下,安装ucenter1.6.0

    1,)从官网下载UCenter_1.6.0_SC_UTF8.zip,解压拷贝upload到www下,重命名upload->ucenter; 2,)D:\wamp\bin\apache\Apach ...