:)
各位:)
我想做一个网络小游戏但遇到了实时数据通信的问题??要求timer 每1毫秒发送数据(当然理论上了)但要求越快越好:)还请大家指教:)
另外,我想了解一下CS的原理:)
请知道的一并搞之:0
谢!!:)

解决方案 »

  1.   

    虽然说网络游戏的确是每秒种都在传送数据,但是并不等于
    精确到1毫秒(除非他是几亿$的服务器)使用事件触发就行了
    再现RPG
    http://www.dapha.net/down/list.asp?id=817
      

  2.   

    谢谢各位
    :)
    我要做的是一个http://huascar.vicp.net/vbbbs/viewfile.asp?ID=12要求实时传数据??
    请大家帮忙:)谢谢:)
      

  3.   

    到这里下载 :
    http://61.33.109.69:81/samvicky/shell/101.rar我要做的是两个人“联网”一起玩但,因为程序本身就要求数据通信
    所以“使用事件触发就行了”感到很~~~~~~请大家试过后给我一些建议,由于还没有解决“实时通信”的问题
    所以有时候可能出错,
    望大家给我好的方法:)谢!!!
      

  4.   

    多开几个winsock,轮流发。其实TCP/IP是保持连接的,不用1ms发送一次吧?
      

  5.   

    原来是个积木的程序
    网络不存在实时的概念,你说1ms限制, 要是实时,远远不够,可以无限小,数据包无限大,
    无限多的无用数据
    任何网络游戏都是基于事件触发, 积木要用事件触发, 实在是太简单!
    以这个程序为例:
    1: 任何玩的人都属于client,需要登录服务器,由服务器转给你数据
       联众,中国在线游戏中心就是这个样子
    2: 一方做server,另外一方做client, 然后client连接server,握手后,开始玩,属于
      点点式的,从你做的这个程序来看,以及目前的进展来看,你是准备做成这样的模式3: 还是回到实时通信这个问题来。 如果网络游戏说它是实时的, 只是说,任何一方的动作
        都让另外一方知道。 一般积木的动作只有5个, 左移一格,右移一格, 下移一格,
        旋转一次,出现新方快,   其中1,2,4动作是用户产生的,
        3是系统(定时器)以及用户按下落加速下落产生的。 5是程序一次降落到底产生的
        当然你的程序目前没有实现4这个动作(没有旋转), 
        还有,有些积木还有6这个动作,即:急落,
        有些积木的旋转分2中, 顺时针,逆时针, 也可以分别定义2中动作4: 开始等待网络事件编程:  从你这个程序来说
        1: server监视
        2: client连接
        3: tcp上连接成立
        4: client发送数据: 我要开始游戏
        5: server收到这个数据。让用户选择,ip地址xx的用户请求开始积木,是否开始
            , 否退出,  是进入6
        6: server发送,我接受了请求, 我的randomize_seek是xxx
           (注:我想你实现积木的7种方快随机出现,肯定是用了rnd函数吧, 
            为了公平起见,即:client, server出现的方格次序一致,
            则randomize 一个相同数:  randomize_seek)
        7: server发送了以后,开始游戏,winsock继续等待事件
        8: client收到了“server接收请求”后,开始游戏,winsock继续等待事件
        '----以下属于client ,server 2方处理的事情
        9:  开始游戏后,出现了一个新方快, 产生事件5 ,发送包给对方:
           5号事件:方快样式(1--7)
            用户按了旋转产生4号事件,发送包给对方:
           4号事件:用户旋转了
            用户按了左键,用户按了右键,计时器产生了下落...
            分别发送不同的包:
           ......包格式自己定义
        10: winsock的dataarrvail事件中,解释相应的包,在另外个小窗体中,根据命令,解码出
           对方的当前样子
        11: 可以设定格式, 用户按了2下左键,,减少数据包,但是会产生丢帧
        12: 可以看看联众, 如果网速慢, 他会这样: 先看到几个动作,后来不动了,后来狂动.
            其实我想这样.如果速度慢, 可能跟不上传送速度,(虽然这个包太小), 他反正这样:
            发送一个包(一定要确认对方收到!!),如果对放少收了一个包,就出问题了!解码不出了!
            如果对方没有响应了... 说明速度慢了! 可以减少无用数据(tcp,ip头部)即一个包
            发送多个命令! 可以在命令头部识别,这是几个命令! ,这样造成  [对方接收窗体]
            中不动了, 突然一下动的好快!
         发现速度慢了!也可以这样,直接把当前状态发送出去,积木这个游戏中 可以用2维
         数组表示, 这样不动了,突然一下就变了状态! 联众好象2中都用了关于你那个程序: 一,按键判断不好,按一下走好多格! 没有旋转,没有设定速度等,改进祝早日成功
          
      

  6.   

    谢谢:pigsanddogs(我爱吃猪肉,但是长不胖,为什么??) 给我的详细解答:)“<1>按键判断不好,按一下走好多格! <2>没有旋转,没有设定速度等”
    我还没有完全做好,只是让大家试试:)
    对于<1>的确有问题:)但我没有解决的方法,我怕有时要求“连续按时”却有很慢:(
    对于<2>我已经做了“方向键上”是变,也就是旋转:)对于这个“问题”我是这样想的,希望交流:) 首先,1。我建立连接后
           2。程序分别运行(连接后不分客户端与服务端,就是说,他们两者的“块图形”数据是互相独立的),传输的只是自己“位置”四个“点”的坐标。
           3。当产生“着落”后另传一组数据:)
           
           我考虑这样的方法是因为这样传输的“数据类”比较少,只有两种
    而且,由于两端独立运行,速度比较快,但如果按照你说的用“客户-服务”模式,如果速度快的时候我想客户端会不适应,(比如当客户端按向下时,首先要发送数据给服务端,然后服务端)再发送数据给客户端,客户端接受,转换。)经过这样,当客户端按下时,就会产生一种“顿”的感觉:(      你有没有发现,我的程序中,速度快双方是还是很感觉很快的,因为自己控制自己的方块,所以不会“顿”:)
    但,由于数据传的太快,有些数据会 “粘”在一起比如:123456789
    123456789
    123456789
    123456789123456789   ‘数据能收到,但就是这种现象,给我造成很大的麻烦:(
    123456799
    123456789
      

  7.   

    123456789
    123456789
    123456789
    123456789123456789   ‘数据能收到,但就是这种现象,给我造成很大的麻烦:(
    123456799
    123456789所以需要自己定义包格式, 给你一个参考。 我的一个实现' 下面包发送格式
    '--------------
    ' cmd的第一个包
    'packet_len as long
    'randomize_seek as long
    'send as long = 0               '发送是0
    'msgNo as long
    'tick_count                     'getDataMsgNo的时候生成
    'firstPacket as long  = 1       '1
    'packetTotal as long
    'version as long = g_version    'g_version
    'cmd_1 as long
    'cmd_2 as long
    'data() as byte'---------------
    ' 其他包
    'packet_len as long
    'randomize_seek as long
    'send or response as long        '发送是0, 应答是1
    'msgNo as long
    'tick_count                      '发送读datamessage, 响应用cmdmessage
    'firstpacket as long             '
    'packetNo as long
    'data() as byte
      

  8.   

    这个, 最好找本协议原理的书看
    看看tcp ,ip头是怎么定义的  可以到 www.rfc.net 看看rfc文档
    不过我们需要定义的是应用层的,保证包不丢失,并且含有确认机制等
     
    以我上面定义的包为例子:
    认为请求方发送的第一个包叫做cmd包,其他的包统统叫做第2中包
    多个包的组合叫做消息, 消息代表一次所要表白的完整信息
    如下:
    packet_len  包的长度 4 个字节       解包的时候先读这个字段,盘bytetotal是否有这么多
    randomize_seek 4个字节, 随机种子,用来加密数据
    send for response?  4个字节, 发送的为0 ,响应的为1  根据这个字段判断是入哪个本地缓冲?
    msgNo            4  字节, 消息号
    tick_count       4  字节, 消息标识 ,唯一性
    packet_total    4   字节,该消息中有几个包
    cmd_1             4  字节,  命令1
    cmd_2              4 字节, 命令2   参考windows消息的2个参数定义的
    data()             具体数据
    也就是说发送方发送的包按上述格式发送,然后数据用里面的randomize_seek && randomie & rnd
    加密, 解密的过程为逆运算
    然后到 winsock数据到达的时候,来解包, 判断属于第几个包.
    当然, 你还需要到程序中定义结构体数组表示当前发送消息缓冲区, 接收消息缓冲区的,
    主要还是在理解,  不太好讲, 要打出来的话好长, 这是我定义的一个应用层的协议, 模块大概有
    1000多行, 还需要考虑到 超时自动断开(比如网线断了等), 这个模块不可以给你的.因为是公司的关于数据拈贴的原因 可以看这个帖子
    http://expert.csdn.net/Expert/topic/1857/1857336.xml?temp=.5424616好运