最近做一个聊天程序.多客户端连接到服务器.
如何将Winsock(index)接收到的数据添加到相应的数组?
StringTeam(index) 和 winsock(index) 相一致.这样方便其他控件随时根据winsock的index调用相关的数据.接收的是字符串.
如果某个客户端断开了连接.则清空其相对应的数组内容...
其实要求实现的就是  第N个客户发送来数据,将数据保存在数组(N)中. 
可以随时查询数组(N)中所包含的数据.
觉得数组很神秘.很迷茫.求段代码看看.谢谢!

解决方案 »

  1.   

    数组
    如果有过用其它语言编程的经历,那么想必会熟悉数组的概念。由于有了数组,可以用相同名字引用一系列变量,并用数字(索引)来识别它们。在许多场合,使用数组可以缩短和简化程序,因为可以利用索引值设计一个循环,高效处理多种情况。数组有上界和下界,数组的元素在上下界内是连续的。因为 Visual Basic对每一个索引值都分配空间,所以不要不切实际声明一个太大的数组。注意 这一部分讨论的数组是程序中声明的变量数组。它们不同于控件数组,控件数组是在设计时通过设置控件的 Index 属性规定的。变量数组总是连续的;与控件数组不同的是,不能从一个数组的中部加载或卸载数组元素。一个数组中的所有元素具有相同的数据类型。当然,当数据类型为 Variant 时,各个元素能够包含不同种类的数据(对象、 字符串 、数值等等)。 可以声明任何基本数据类型的数组,包括用户自定义类型(请参阅 “再论编程”中的“创建自己的数据类型”)和对象变量(请参阅“用对象编程”)。在 Visual Basic 中有两种类型的数组:固定大小的数组— 它总是保持同样的大小,以及在运行时大小可以改变的动态数组。在本章后面的“动态数组”中将要详细讨论动态数组。声明固定大小的数组
    有三种方法声明固定大小的数组,用哪一种方法取决于数组应有的有效范围: 建立公用数组,在模块的声明段用 Public 语句声明数组。
    建立模块级数组,在模块的声明段用 Private 语句声明数组。
    建立局部数组,在过程中用 Private 语句声明数组。 
    设定上下界
    声明数组时,在数组名之后跟一个用括号括起来的上界。上界不得超过 Long 数据类型的范围(-2,147,483,648 到 2,147,483,647)。例如,下列数组声明可出现在模块的声明段:Dim Counters (14) As Integer         '15 个元素。
    Dim Sums (20) As Double            '21 个元素。为建立公用数组,直接用 Public 取代 Dim。Public Counters (14) As Integer
    Public Sums (20) As Double在过程之中同样的声明使用 Dim:Dim Counters (14) As Integer
    Dim Sums (20) As Double第一个声明建立了一个有 15 个元素的数组,其索引号从 0 到 14 。第二个声明建立了一个有 21 个元素的数组,其索引号从 0 到 20 。缺省的下界为 0。为了规定下界,用关键字 To 显式提供下界(为 Long 数据类型):Dim Counters (1 To 15) As Integer
    Dim Sums (100 To 120) As String在前述声明中,Counters 的索引值范围从 1 到 15,而 Sums 的索引值范围从 100 到 200。包含其它数组的数组
    有可能建立 Variant 数据类型数组,并与不同数据类型的数组共居一处。以下代码建立两个数组,一个包含整数,而另一个包含 字符串。然后声明第三个 Variant 数组,并将整数和字符串数组放置其中:Private Sub Command1_Click ()
       Dim intX As Integer   '声明计数器变量。
       '声明并放置整数数组。
       Dim countersA (5) As Integer
          For intX = 0 To 4
             countersA (intX) = 5
          Next intX
       '声明并放置字符串数组。
          Dim countersB (5) As String
             For intX = 0 To 4
                countersB (intX) = "hello"
             Next intX
       Dim arrX (2) As Variant         '声明拥有两个成员的新数组。
          arrX (1) = countersA ()      '将其它数组移居到数组。
          arrX (2) = countersB ()
          MsgBox arrX (1) (2)         '显示每一个数组的成员。
          MsgBox arrX (2) (3)
    End Sub多维数组
    有时需要追踪记录数组中的相关信息。例如,为了追踪记录计算机屏幕上的每一个像素,需要引用它的 X、Y 坐标。这时应该用多维数组存储值。可用 Visual Basic 声明多维数组。例如,下面的语句声明了一个过程内的 10 × 10 的二维数组。Static MatrixA (9, 9) As Double可用显式下界来声明两个维数或两个维数中的任何一个:Static MatrixA (1 To 10, 1 To 10) As Double可以将所有这些推广到二维以上的数组。例如:Dim MultiD (3, 1 To 10, 1 To 15)这个声明建立了三维数组,大小为 4 × 10 × 15。元素总数为三个维数的乘积,为 600。注意 在增加数组的维数时,数组所占的存储空间会大幅度增加,所以要慎用多维数组。使用 Variant 数组时更要格外小心,因为他们需要更大的存储空间。 
    用循环操作数组
    可以用 For 循环嵌套有效的处理多维数组。例如,在 MatrixA 中基于每个元素在数组中的位置为其赋值:Dim I As Integer, J As Integer
    Static MatrixA(1 To 10, 1 To 10) As Double
    For I = 1 To 10
       For J = 1 To 10
          MatrixA (I, J) = I * 10 + J
       Next J
    Next I详细信息 关于循环的详细信息,请参阅本章后面的“循环结构”部分。
    动态数组
    数组到底应该有多大才合适,有时可能不得而知。所以希望能够在运行时具有改变数组大小的能力。动态数组就可以在任何时候改变大小。在 Visual Basic 中,动态数组最灵活、最方便,有助于有效管理内存。例如,可短时间使用一个大数组,然后,在不使用这个数组时,将内存空间释放给系统。如果不用动态数组,就要声明一个数组,它的大小尽可能达到最大,然后再抹去那些不必要的元素。但是,如果过度使用这种方法,会导致内存的操作环境变慢。要创建动态数组,请按照以下步骤执行: (如果希望数组为公用数组,则)用 Public 语句声明数组,或者,(如果希望数组为模块级,则)在模块级用 Dim 语句声明数组,或者(如果希望数组为局部数组,则)在过程中用 Static 或 Dim 语句声明数组。给数组附以一个空维数表,这样就将数组声明为动态数组。 
    Dim DynArray ()用 ReDim 语句分配实际的元素个数。 
    ReDim DynArray (X + 1)ReDim 语句只能出现在过程中。与 Dim 语句、Static 语句不同,ReDim 语句是一个可执行语句,由于这一语句,应用程序在运行时执行一个操作。ReDim 语句支持这样的语法,它与固定数组中使用的语法相同。对于每一维数,每个 ReDim 语句都能改变元素数目以及上下界。但是,数组的维数不能改变。ReDim DynArray (4 to 12)例如,用第一次声明在模块级所建立的动态数组 Matrix1:Dim Matrix1 () As Integer然后,在过程中给数组分配空间:Sub CalcValuesNow ()
       .
       .
       .
       ReDim Matrix1 (19, 29)
    End Sub这里的 ReDim 语句给 Matrix 分配一个 20 × 30 的整数矩阵(元素总大小为 600)。还有一个办法,用变量设置动态数组的边界:ReDim Matrix1 (X, Y)注意 您可以将字符串赋值给大小可变的字节数组。一个字节数组也可以被赋值给一个可变长的字符串。一定要注意字符串中的字节数会随平台而变化。同一个字符串在 Unicode 平台上的字节数是它在非 Unicode 平台上的两倍。保留动态数组的内容
    每次执行 ReDim 语句时,当前存储在数组中的值都会全部丢失。Visual Basi 重新将数组元素的值置为 Empty(对 Variant 数组)、置为 0(对 Numeric 数组)、置为 零长度字符串(对 String 数组)或者置为 Nothing(对于对象的数组)。在为新数据准备数组,或者要缩减数组大小以节省内存时,这样做是非常有用的。有时希望改变数组大小又不丢失数组中的数据。使用具有 Preserve 关键字的 ReDim 语句就可做到这点。例如,使用 UBound 函数引用上界,使数组扩大、增加一个元素,而现有元素的值并未丢失:ReDim Preserve DynArray (UBound (DynArray) + 1)在用 Preserve 关键字时,只能改变多维数组中最后一维的上界;如果改变了其它维或最后一维的下界,那么运行时就会出错。所以可这样编程:ReDim Preserve Matrix (10, UBound (Matrix, 2) + 1)而不可这样编程:ReDim Preserve Matrix (UBound (Matrix, 1) + 1, 10)详细信息 关于动态数组的更详细信息,请参阅语言参考中的“ReDim 函数”。关于对象数组,请参阅“用对象编程”。
      

  2.   

    Private intMax As Long
    Dim StringTeam() As StringPrivate Sub Form_Load()
       intMax = 0
       sckServer(0).LocalPort = 1001
       sckServer(0).Listen
    End SubPrivate Sub sckServer_ConnectionRequest _
    (Index As Integer, ByVal requestID As Long)
       If Index = 0 Then
          intMax = intMax + 1
          Redim Preserve StringTeam(intMax) 
          Load sckServer(intMax)
          sckServer(intMax).LocalPort = 0
          sckServer(intMax).Accept requestID
       End If
    End SubPrivate Sub tcpServer_DataArrival _
    (Index As Integer, ByVal bytesTotal As Long)
       Dim strData As String
       tcpServer.GetData strData
       StringTeam(Index) = StringTeam(Index) & IIf(StringTeam(Index) ="","",vbTab) & strData
    End Sub
      

  3.   

    接收的时候。WINSOCK是会自己调用相应的WINSOCK(INDEX)数组对象的。所以,你只要把接收来的GetData数据放到数组SUM(INDEX)中就可以了。这个数组的INDEX和WINSOCK(INDEX)中的是一样的
      

  4.   

    Thanks ! 问题解决.结贴~~