我这里遇到一个比较严重的问题。
我这里使用的是TCP协议。当客户端多次向服务器发送信息后。此信息会自动连接成一个字符串。当服务器接收时,仅接收一串客户端发送的信息,该问题如何解决。如:
A客户端发送的信息:
ClientA.SendData "a"
Doevents
ClientA.SendData "b"
Doevents
ClientA.SendData "c"
Doevents服务器接收信息
Server.GetData temp
这里的 Temp 就等于 abc有人说加了Doevents就没事了。
但我的程序里居然没什么效果。请问怎么会这样呢?

解决方案 »

  1.   

    加了DOEVENTS的确可以解决这个问题,你还有这个问题的话估计你代码其他地方有问题
    实在不行,就自己给发送的包做个结尾标志,判断有结尾标志就将该代码分开提出来作为一条消息,避免连接
      

  2.   

    在实际的数据发出前,会将需要发送的数据尽可能的一次发送,
    doevents并不可靠。
    在SendComplete事件中才确实可以确认前1个已经进行发送,
    客户端将肯定分段接收,因此请效仿文件发送形式来进行分段的信息传送,
    要不然就用发送1个长字符串给客户端分解。
      

  3.   


    senddate 后+
    doevents
    或者
    senddate 数据 & "@#$@#$@#%$@#%"
     接受时候用
    split(数据,"@#$@#$@#%$@#%")进行手动分割
      

  4.   

    假如这样:
    for i = 0 to 3
        ClientA.SendData i
        Doevents
    next i这时服务器收到的是两次信息。分别是
    0 和 123也就是说,如果放在循环中 Doevents 仅一次效果。
    大侠们,帮帮忙。
      

  5.   

    在每条信息后加一个结尾标记字符串,再将接收到的串用split分割,就如楼上 zyg0所说的
      

  6.   

    在SendComplete事件中才确实可以确认前1个已经进行发送,这个方法还是不行,还是会被服务器连接起来,我刚试的。只能用 split 了吗?
      

  7.   

    这个是由于服务器接收反应不过来,都放在缓冲区里,当处理完第一条消息后扫描缓冲区,因为WINSOCK在一个单独线程里,在处理第一条消息的时候并没有阻塞,所以后续消息都在缓冲区里连接上了,你扫描缓冲区实际是扫描缓冲区是否有值,有值就触发datavarrival事件,这个时候得到的数据就是连接上的了。所以还是要加分段标志,最好自己制定一套程序通讯协议,这样用split,left, mid ,right函数就可以对这个协议进行处理而避免消息连接了。
    .net下我自己写了一套网络开发平台,分为几层:
    一层是封装socket类NetWork.dll,主要从事网络连接和网络通讯,并且将服务器封装成了支持多客户的模式。支持TCP和UDP两种
    第二层是域控制类Domain.dll,主要功能是可以将几台服务器形成一个协同处理域,提供更多的客户端同时在一个网络环境下操作数据。并提供域内服务器间消息转发功能和服务器负载平衡计算。
    第三层就是这里所需要的自定义网络协议层了,在不同的程序下可以自己定义为不同的网络协议格式。不过一般写了一套就不需要重写了,其他程序都可以遵循该协议的。
    第四层是逻辑处理层,也就是将接受到的信息经过第三层处理后得到的结果进行不同的处理。
    第五层是数据操作层,增加这一层的话可以让服务器对数据库进行操作访问。
    并且准备增加消息处理层,将各客户端之间的Message类信息单独用一个层来处理,这样今后写其他程序就不需要在逻辑处理层里增加对Message类的处理了。
    以上各层可以任意组合使用形成不同的功能服务器。不同的程序服务器只需要替换逻辑处理层就可以了。
    你可以参考一下这样的处理方式,其实自己定制一套网络协议不难,主要就是对字符串或各种进制代码的处理,写一套的话今后就可以在其他地方都用这一套了,属于基础设施,所以不要嫌麻烦:)