zoukankan      html  css  js  c++  java
  • dota BP练习工具开发:一个C/S多用户程序

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

    客户端采用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
  • 相关阅读:
    Java线程:新特征-阻塞栈
    Java线程:新特征-阻塞队列
    Java线程:新特征-信号量
    Java线程:新特征-锁(下)
    Java线程:新特征-锁(上)
    Java线程:新特征-有返回值的线程
    Java线程:新特征-线程池
    Java线程:volatile关键字
    Java线程:并发协作-死锁
    通过Roslyn动态生成程序集
  • 原文地址:https://www.cnblogs.com/zidafone/p/4975856.html
Copyright © 2011-2022 走看看