文档章节

拉登游戏开发--分布式计算服务机客户机程序设计

secondriver
 secondriver
发布于 2015/09/17 09:23
字数 1154
阅读 7
收藏 0

    关于拉登游戏的开发本身并没有太大难度,主要还是要解决计算结果需要很长时间的问题。要在时间上缩短就有两种方式:算法效率足够好,计算机运算能力足够强。对于这个问题而言,算法的改进没有太大可能性,而且问题本身就是一个大量遍历的过程,只有通过遍历才能在其中找到更多的信息,更多的美妙的发现。

   下面的图是设计的基本思路:

   游戏本身的研究价值似乎倒不是太多,而其中的趣味性还是蛮高的。

   程序的设计思路如下:

   服务计算机端运行程序为服务程序;个人PC端运行的程序为计算程序;存储数据主要记录计算的结果,计算过程日志记录。

   计算程序和服务程序的交互信息传递:

   1.服务程序启动监听计算程序

   2.计算程序发送计算请求

   3.服务程序响应请求

   4.服务程序划分,协调,分配计算任务

   5.服务程序发送计算任务消息

   6.计算程序接收计算任务信息

   7.计算程序计算(最为耗时,耗计算机资源)

   8.计算程序发送计算结果信息

   9.服务程序接收计算结果信息

   10.服务程序处理计算结果信息,存储记录

   一个计算周期1-10完成,继续进行2-10操作。  

   下面是服务程序部分代码:


  
  1. public class ServerDisCompute { 
  2.  
  3.     private Map<String, Task> serverMap; 
  4.     private ServerSocket serverSocket; 
  5.     private int clientId=0
  6.  
  7.     /** 
  8.      * 
  9.      * 构造服务器程序 
  10.      */ 
  11.     public ServerDisCompute() { 
  12.         try { 
  13.             serverSocket = new ServerSocket(51401, InetAddress.getLocalHost()); 
  14.             serverMap=new HashMap(); 
  15.         } catch (UnknownHostException ex) { 
  16.             Logger.getLogger(ServerDisCompute.class.getName()).log(Level.SEVERE, null, ex); 
  17.         } catch (IOException ex) { 
  18.             Logger.getLogger(ServerDisCompute.class.getName()).log(Level.SEVERE, null, ex); 
  19.         } 
  20.     } 
  21.  
  22.     public void serverStart() { 
  23.         try { 
  24.             System.out.println("服务器已经启动"); 
  25.             while (true) { 
  26.                 Socket socket = serverSocket.accept(); 
  27.                 ServerHandlerDisCompute runable = new ServerHandlerDisCompute(socket, this); 
  28.                 Thread thread = new Thread(runable); 
  29.                 thread.start(); 
  30.             } 
  31.         } catch (IOException ex) { 
  32.             Logger.getLogger(ServerDisCompute.class.getName()).log(Level.SEVERE, null, ex); 
  33.         } 
  34.     } 

   服务程序以多线程来与每一个计算程序进行通信。对与使用C/S模式设计,这部分可以继续改进。在这里可以将通信的连接变为请求---应答---断开---请求---应答方式。

   下面是服务程序部分代码:


  
  1. class ServerHandlerDisCompute implements Runnable { 
  2.  
  3.     private Socket socket; 
  4.     private final ServerDisCompute outer; 
  5.     private byte[] clientMsg; 
  6.     private byte[] serverMsg; 
  7.     private Task task; 
  8.  
  9.     public ServerHandlerDisCompute(Socket socket, final ServerDisCompute outer) { 
  10.         this.outer = outer; 
  11.         this.socket = socket; 
  12.     } 
  13.  
  14.     @Override 
  15.     public void run() { 
  16.         try {  
  17.             //获取请求信息 
  18.             clientMsg = readRequestMsg(); 
  19.             //发送任务信息 
  20.             //任务编号 
  21.             String taskSignStamp = initSignStamp(clientMsg); 
  22.             //分配任务 
  23.             sendTaskMsg(taskSignStamp); 
  24.             Map<String, String> resultMap = readResultMsg(); 
  25.             //更新任务信息 
  26.             updateTaskMsg(resultMap); 
  27.         } catch (IOException ex) { 
  28.             Logger.getLogger(ServerHandlerDisCompute.class.getName()).log(Level.SEVERE, null, ex); 
  29.         } 
  30.     } 

    服务程序运行主要监听计算机程序发回的信息。

    下面是计算程序部分代码:


  
  1. /** 
  2.     * 客户端计算程序启动方法 
  3.     */ 
  4.    public void clientStart() { 
  5.        System.out.println("客户端已经启动......"); 
  6.        try { 
  7.            //发送请求信息 
  8.            sendRequestMsg(); 
  9.        } catch (IOException ex) { 
  10.            Logger.getLogger(ClientDisCompute.class.getName()).log(Level.SEVERE, null, ex); 
  11.        } 
  12.        try { 
  13.            //读取响应信息 
  14.            readResponseMsg(); 
  15.        } catch (IOException ex) { 
  16.            Logger.getLogger(ClientDisCompute.class.getName()).log(Level.SEVERE, null, ex); 
  17.        } 
  18.        //执行计算 
  19.        executeCompute(); 
  20.        try { 
  21.            //发送结果信息 
  22.            sendResultMsg(); 
  23.        } catch (IOException ex) { 
  24.            Logger.getLogger(ClientDisCompute.class.getName()).log(Level.SEVERE, null, ex); 
  25.        } 
  26.  
  27.    } 

    程序的计算部分代码在拉登游戏开发--在时间积累中寻找美丽的图案文章中。

    有关分布式计算的整体设计基本完成,通过多个计算程序与服务程序同时运行,对同一个N元格子的进行计算寻求最终的计算结果值可以实现。

     对于一个N的值,寻找所以可能的计算结果将不用考虑计算结果被其中一个计算程序获取到,服务程序需要向其他正在进行N元格子的计算程序发出中断消息。计算程序可以灵活的向服务程序发送计算能力的相关消息,服务程序可以协调性的分配任务。

    下面是N=35,一共有1225中可能,在其中寻找最终的结果,目前运算的情况截图如下:

    目前这个运算不存在分布式,一个计算程序在进行处理,出现上面VM摘要图,并且此时此刻计算程序还在运行当中。如果对于一个N仅仅找出一个符合的结果就结束本次N的计算,则对已经获取的数据结果进行分析是非常重要和有价值的。这对于服务程序分配任务有很大的参考价值。

本文出自 “野马红尘” 博客,谢绝转载!

© 著作权归作者所有

共有 人打赏支持
secondriver
粉丝 10
博文 229
码字总数 233821
作品 0
广州
程序员
私信 提问
浙大的游戏设计教程

第一部分 游戏程序设计概览 计算机游戏简介:什么是游戏、游戏的分类等 游戏的基本开发流程? 游戏开发的基本理念及方法 游戏软件的体系结构:包括三维游戏引擎的架构分析 游戏的调试与测试 ...

Matrix4X4
2012/08/19
361
2
使用c实现简单的rpc

RPC简介 RPC(Remote Procedure Call)——远程过程调用,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的细节的技术。 通过RPC我们可以充分利用非共享内存的多处理...

摩云菜
2016/01/22
314
1
浅谈python基础与初学者

     Python是一种面向对象的解释型计算机程序设计语言,由荷兰人Guido van Rossum于1989年发明,第一个公开发行版发行于1991年。   Python是纯粹的自由软件,源代码和解释器CPython遵...

Python爱好者
2017/01/12
0
0
【北京】无线新天地高薪诚聘Android程序员/J2ME程序员/游戏策划

北京无线新天地信息技术有限公司注册资金1000万元,是一家专门从事软件开发、互联网和无线增值业务的创新型高科技公司,公司拥有工信部颁发的全网跨地区电信增值业务运营许可证(B2-20070024...

天地无限
2011/02/15
313
0
纯javascript网页莱特币矿机的实践

用网页挖什么币? 目前的浏览器的Javascript大多使用CPU处理,因此适合以Scrypt算法为主的币种,本文选择的是莱特币(Litecoin)。还有Dogcoin... 都适合网页挖矿。 网页挖矿速度如何? 在三年...

MartinKing
2015/12/21
151
0

没有更多内容

加载失败,请刷新页面

加载更多

Coding and Paper Letter(六十四)

资源整理。 1 Coding: 1.交互式瓦片编辑器。 tile playground 2.R语言包autokeras,autokeras的R接口。autokeras是一个开源的自动机器学习的软件。 autokeras 3.斯坦福网络分析平台,用于网络...

胖胖雕
34分钟前
0
0
最简单的cd命令是个大坑!

BASH Shell 是大多 Linux 发行版的默认 shell,BASH 有一些自己的内置命令,cd 就是其中的一个。 在centos6里面,系统中不存在 cd 的二进制文件。但是你仍然可以运行该命令,这是因为 cd 是 ...

gaolongquan
44分钟前
1
0
spring获取bean的几种方式

使用jdk:1.8、maven:3.3.3 spring获取Bean的方式 pom.xml文件内容: <?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="......

Vincent-Duan
51分钟前
2
0
一段话系列-Linux中IO的同步、异步、阻塞、非阻塞

首先我们框定一下背景,我们探讨的是Linux系统下的IO模型。 同步和异步是针对内核操作数据而言的,同步是指内核串行顺序操作数据,异步是指内核并行(或并发)操作数据,然后通过回调的方式通...

EasyProgramming
55分钟前
4
0
好程序员web前端分享主流CSS image比较

好程序员web前端分享主流CSS image比较在还原设计图的时候,难免会碰到一些样式图片的引用。如何来对这些图片做优化呢?本文简单的梳理了一下目前几种比较常用的使用方式。   注: 1. 有更好...

好程序员IT
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部