你是用TCP/IP协议的吗?我以前也是这样哦。不知道为什么……

解决方案 »

  1.   

    因为winsock 控件在收到一定数据后才发生一次DataArrival事件,所以有这样的结果了
      

  2.   

    最好在每接收完一次数据后把winsock重新load一次,这样应该可以清掉上次接收的数据。
      

  3.   

    但我不是用load做的,还有其他的办法吗?
      

  4.   

    你在局域网上试过吗?我以前写过很多Winsock程序,不过都是局域网的,没出现过这些情况啊。如果局域网没问题,那就是网络问题,在接收到信息时将数据置空即可。
      

  5.   

    to  DaNivava(大泥娃娃) :
                    我在局域网没什么问题,但是连在公网这种情况会阶段性的出现,我觉得可能是置后的问题,你认为呢?
      

  6.   

    在winsock进行通讯的时候,客户端发送一个sendata str_1,那么服务器端则收到一个SockTcpServer_DataArrival事件。
      如果客户端两次发送的时间过短,那么服务器端则认为是一次发送。
      一般来说,我们都在通讯的字符串的两都加有标志位,在服务器端再拨取有用的数据,如果出现这种情况,那么就会很麻烦。比如对话的通讯模式是 pd{+对话的内容+}pde,那么拨取后的结果 对话的内容。
      但如果发生上面的情况 则出现  pd{+对话的内容1+}pdepd{+对话的内容2+}pde,拨取后得到对话的内容1+}pdepd{+对话的内容2,有一部分标志就被留在了有用的内容里面,如果传送的是一些纯数字的信息,那么问题可能就会更大。我的解决办法:
      getdata str_1后,我调用一个函数 dostr(str_1)来处理这个函数。Private Sub dostr(str_1 As String)
    ''''''.....变量声明略  int_End_1 = InStr(1, str_Subjs, "+}PDE")           '得到 +}PDE 的位置                          
      If int_End_1 + 4 = Len(str_Subjs) Then            '如果这是字符串的结束,那么什么都不做                    
        'Do Nothing
      Else
        str_2 = Right(str_1, Len(str_1) - (int_End_1 + 4))   '如果不是,那么得到从开始到一个结束位的字符串,赋给str_2
        Call dostr(str_2, Numj)                '递归调用dostr
      End If''''''''''''''''''''你的处理语句,这样就可以分开像上面的问题了
    End Sub
      

  7.   

    to : iambluebird(胡搅蛮缠) 
         请问“str_Subjs”这个变量代表什么?
      

  8.   

    我也遇过你的问题,我用两个winsock来轮流发送,问题就解决了。
      

  9.   

    其实这个问题是解决不了的.你试试连续执行两次Winsock1.SendDate "A"
    那一定会一次性收到"AA"
      

  10.   

    to hyryxgs(菜鸟) :
          解决不了,不会吧,为什么我在同一个局域网内一直是能够按我的意图工作的呢?
          只是通过公网就不可以,我觉得是延时的问题
          不过很奇怪:我今天在局域网内也发生了这样的问题
          不知你能解答一下这方面的问题吗?
      

  11.   

    如果客户端两次发送的时间过短,那么服务器端则认为是一次发送。要解决这个问题,可以在两次发送之间插入一条命令:doevents
    包你管用!