我写了一个一对一的通信程序,现在想改成一对多通信,碰到不少问题,如winsock数组使用问题,端口的load和close问题,网上查了不少资料,都是什么主要程序代码,根本不管用,连MSDN的例子也走不通,谁能帮我改成一对多的程序,就给谁分,要求用TCP的。我的程序如下:客户端界面:两个text窗口,一个winsock控件,三个按钮:连接、发送、退出
 
  Private Sub Cmdexit_Click()
    End
  End Sub
  Private Sub Cmdconnect_Click()
    Winsockclient.Connect
  End Sub Private Sub Cmdsend_Click()
    Winsockclient.SendData textsend.Text
 End Sub    Private Sub Form_Load()
        Dim IP As String
        IP = InputBox("请输入要连接的IP", "输入的IP", "127.0.0.1")       '连接的IP默认为本机
        Winsockclient.RemoteHost = IP      '1、设置RemoteHost,即你要连接IP    textsend.Visible = False
    textget.Visible = False
     Winsockclient.RemotePort = 1001
    End Sub
    Private Sub Text1_Change()
     Winsockclient.RemoteHost = Text1.Text
    End Sub
    Private Sub Winsockclient_Close()
     Winsockclient.Close
     End
    End Sub
    Private Sub winsockclient_Connect()
     textsend.Visible = True
     textget.Visible = True
    End Sub
  Private Sub winsockclient_DataArrival(ByVal bytesTotal As Long)
    Dim tmpstr As String
    Winsockclient.GetData tmpstr
    textget.Text = tmpstr
 End Sub服务器端界面:两个text窗口,一个winsock控件,一个退出按钮
 
   Private Sub Cmdexit_Click()
    End
   End Sub
   Private Sub Form_Load()
     textsend.Visible = False
     textget.Visible = False
     Winsockserver.LocalPort = 1001
     Winsockserver.Listen
    End Sub    Private Sub textsend_Change()
     Winsockserver.SendData textsend.Text
    End Sub
    Private Sub Winsockserver_Close()
     Winsockserver.Close
    End
    End Sub
   
   Private Sub Winsockserver_ConnectionRequest(ByVal requestID As Long)
    textsend.Visible = True
    textget.Visible = True
    If Winsockserver.State <> sckClosed Then Winsockserver.Close
    Winsockserver.Accept requestID
   End Sub
   
   Private Sub Winsockserver_DataArrival(ByVal bytesTotal As Long)
    Dim tmpstr As String    Winsockserver.GetData tmpstr
    textget.Text = tmpstr
   End Sub

解决方案 »

  1.   

    服务器端用winsock控件+winsock控件数组好了。一个用于监听,控件数组用于会话。
      

  2.   

    姚明么.....................-_-b我认识一个电子工程师,也叫姚明的...PS:收邮件.
      

  3.   


    'msdn上写得比较清楚:
    '接受多个连接请求
    '上面设计的基本服务器只能接受一个连接请求。通过创建控件数组,使用一个控件也可以同时接受多个连接请
    '求。利用这种方法,不需要关闭连接,而只需创建新的控件实例(通过设置其索引属性),然后在新的实例上
    '调用 Accept 方法。'下面的代码假定名为 sckServer 的窗体上有一个 Winsock 控件,它的 Index 属性被设置为 0;因此控
    '件是控件数组的一部分。在声明部分,声明了一个模块级的变量 intMax。在窗体的 Load 事件中,
    'intMax 被设置为 0,数组中第一个控件的 LocalPort 属性被设置为 1001。然后调用控件的 Listen 方
    '法,使之成为“监听”控件。在连接请求到达时,代码将检测 Index 是否为 0(“监听”控件的值)。如果
    '为 0,监听控件将增加 intMax 的值,并使用该号码来创建新的控件实例。然后,使用新的控件实例接受连
    '接请求。Private intMax As LongPrivate 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
          Load sckServer(intMax)
          sckServer(intMax).LocalPort = 0
          sckServer(intMax).Accept requestID
          Load txtData(intMax)
       End If
    End SubPrivate Sub sckserver_Close(Index As Integer)
        sckserver(Index).Close
        unload sckserver(Index)
    End Sub
      

  4.   

    我就是那个电子工程师啊,现在老板要我做开发啊,郁闷ing,还有你的程序可以一对多传文件,但我要的是可以即时传送数据的,即从客户端输入,服务队能收到,你的客户端上没有输入的地方啊。
    你有QQ的话,加一下,我好和你聊聊
      

  5.   

    我早试过了,走不通的。
    Private Sub sckServer_ConnectionRequest _
    (Index As Integer, ByVal requestID As Long)
       If Index = 0 Then
          intMax = intMax + 1
          Load sckServer(intMax)
          sckServer(intMax).LocalPort = 0
          sckServer(intMax).Accept requestID
          Load txtData(intMax)
       End If
    End Sub当打开第二个客户端时,报错:控件数组元素“2” 不存在,郁闷吧
      

  6.   

    你是否已经建立的你的winsock控件数组?比如winsock控件已经改名为sckServer并在它的属性栏里将它的index置0
      

  7.   

    那还用说啊,建了两个,一个是wsck(0),用于监听,一个是wsck(1),用于传输
      

  8.   

    ??
    不知道是你晕,还是我晕……这里按以上结构你只能有一个wsck(0),wsck(0)以外都是自动建立的,根本用不着你去人工建立用于传输的wsck(1)!话又说回来了,MSDN上的这个例子,只给了个概貌,这里没有给你如何处理断开以后如何销毁控件,以后如何再添加控件,我给你加销毁部分,并没给你加以后再添加的程序,这是你自己要解决的。如果你根本看不懂以上程序,建议你服务器端程序,直接开多个winsock与你的客户端一一对应,也未尝不可。
      

  9.   


    按你说的做了,结果第一个客户端就就打不开,报错:控件数组元素“1” 不存在
    当然我的客户端也有一个winsock,不会连这个也不要吧,还有你说给我加销毁部分程序,没贴出来啊
      

  10.   


    说一千道一万都没用,连基本的协议都不懂说什么,LZ还是先看看书,再看程序!你要用Winsock实施通信,在握手之前必须有发出端口和接收端口,看不懂自动生成的,就用最原始的方法一个一个手工加载控件,再在程序运行前手工设置好或者运行时代码中设定参数。
    通信前确保有接收的和发送的!先别管是控件数组还是单纯控件!
      

  11.   

    我就是那个电子工程师啊,现在老板要我做开发啊,郁闷ing,还有你的程序可以一对多传文件,但我要的是可以即时传送数据的,即从客户端输入,服务队能收到,你的客户端上没有输入的地方啊。
    你有QQ的话,加一下,我好和你聊聊
    //我晕死.......不可能是你吧,只是同名同职而已吧.05年我与姚工在一个公司呢!我的代码只是传送文件的示例,演示的是多客户端的例子,你的应用需要再写别的代码.
      

  12.   


    呵呵,是newtone吗?我05年在那里
      

  13.   

    啊哈......那肯定不是同一个人呀!话说你这问题,搜索一下局域网聊天程序吧,比如:http://www.mndsoft.com/blog/article.asp?id=560
      

  14.   

    接贴感言:
        首先感谢各位大虾的指点。
        本人原来是电子工程师,后改做软件调试,最近被老板逼着做系统开发,而且时间有限,没空去研究TCP是四层协议或是7层协议中详细描述,所以想求一段现成的程序,再进行加工改编,热心人不少,可是也有不少淘江湖的朋友,浪费彼此时间。
        在这里尤其感谢myjian和xiwei,对我帮助很大,其中xiwei的程序之精练,让人叹为观止,客户端和服务端加起来都没有超过50句,真是高手啊,读他的程序,不仅收益很大,而且是一种享受。