socket编程.
可以做成很多client端来对server进行文件传送和取回么?
我做了一个程序,害怕多client操作时,server会造成混乱.
能否给个server的例子?或者有哪些注意?谢谢!我清楚了就结贴!!!1

解决方案 »

  1.   

    例如从client端传文件到server端,那么client端需要知道server的ip和端口,server启动时要监听端口(如果要从server取文件,那么就是server知道client的ip和端口,client监听端口,对么?).那么如果我现在必须保证server只启动一次(除非万不得已时,再重新启动),然后也是开始监听,当用户下载文件时,server就把文件传送给下载的用户(这个阶段,server端怎样把文件传给用户?server端的socket会不会混乱???).请高手指点,谢谢!!!!清楚之后马上结贴!!
      

  2.   

    对,我就是用控件数组做的,不过就怕会出问题.Private Sub sckMain_ConnectionRequest(index As Integer, ByVal requestID As Long)If index = 0 Then
        For i = 1 To 300
            If MArr(i, 0) = "" Then
                pi = i
                bi = True
                Exit For
            End If
        Next i    If bi = True Then
            MArr(pi, 0) = sckMain(0).RemoteHostIP
            Load sckMain(pi)
            sckMain(pi).LocalPort = 10000 + pi
            sckMain(pi).Accept requestID
        Else
            'Debug.Print "客户端连接已满"
            sckMain(pi).SendData "mainf"
        End If
    End IfEnd Sub这个就是,虽然我说的第一种情况可以运行,并没问题.但是我查看每次有新的client连接时,pi的值都是取得最后一次计算过的.
    如果send数据过来,sckMain的数租的值是一个,我怕会混乱.
      

  3.   

    If bi = True Then
            MArr(pi, 0) = sckMain(0).RemoteHostIP
            Load sckMain(pi)
            sckMain(pi).LocalPort = 10000 + pi
            sckMain(pi).Accept requestID
        Else怎么回事,在加载sckMain(pi)前设置MArr(pi, 0) = sckMain(0).RemoteHostIP是干什么
    记录S的地址到数组的第一维吗?好象没这个必要如果应该是
    MArr(pi, 0) = sckMain(pi).RemoteHostIP
    那么就应该放在
    Load sckMain(pi)
    后面。
    没大看明白楼主的代码,商用啊?
      

  4.   

    这个是影子写的,多客户端的代码.我也不太明白.上边好像有问题,我也感觉到了.请大家给我个多客户端socket的服务端代码,谢谢了.
      

  5.   

    Private Sub SockTcpServer_ConnectionRequest(index As Integer, ByVal requestID As Long)
    Dim i As Byte
    i = getfreesock()'取得可以用的WINSOCK下标。
    If i > 0 Then socktcpserver(i).Accept requestID
    End Sub这是很久前写的一个联系程序,用一个WINSOCK监听,其他动态WINSOCK负责连接,不需要其他操作。
      

  6.   

    请各位帮忙看看,我这样写行么??谢谢了.server用一个winsock控件监听,然后在他的ConnectionRequest内将得到连接到的socket属性付给另外一个winsock的各个数组socket.getid = requestID'定义一个全局变量,取得requestID
    Load ssck2(requestID)'load一个winsck数组,以这个requestID为参数ssck2(requestID).RemoteHost = ssck1(0).RemoteHostIP'然后远程主机=第一个监听控件取得的ip
    ssck2(requestID).remoteport = ssck1(0).remoteport'同理
    ssck2(requestID).Accept requestID'然后连接在这个ssck2的DataArrival中,我改了一下Private Sub ssck2_DataArrival(getid As Integer, ByVal bytesTotal As Long)
    Dim a As String, b As String
    ssck2(getid).GetData a
    Text1.Text = a
    End Sub这样可以么?这样服务器端的socket就相应地接收每个客户端发送过来的信息.可以么?如果做其它复杂的动作,也一样可以么?肯定各位高手鉴定!!!!!!!!!!!!!!!!!!!!!!!!!!!明天继续讨论,谢谢大家
      

  7.   

    不知道你的requestid是哪来的,不过这个ID最好是能从以断开的ID中找,没有才新增一个,要不然断多几次,下标就溢出了;另外数据接收时最好判断一下类型,最好用二进制传
      

  8.   

    哦,是的.我就是用binary传的,呵呵.谢谢fishmans(金脚指)
    这个requestID是ConnectionRequest的来的参数.当时我的想法也挺奇怪,把index换成requestID后,我都不知道当时是怎么想的.但是这样,在DataArrival当中,每次接到client的socket发送的数据,server端的socket数组都是正确的进行操作.'///////////////////////////////////client的代码
    Private Sub Form_Load()
    csck1.RemoteHost = "127.0.0.1"
    csck1.RemotePort = 7000
    csck1.Connect
    End SubPrivate Sub Text1_Change()
    csck1.SendData Text1.Text
    End Sub'server端的代码///////////////////////////////////
    Dim getid As LongPrivate Sub Form_Load()ssck1.LocalPort = 7000
    ssck1.ListenEnd SubPrivate Sub ssck1_ConnectionRequest(ByVal requestId As Long)
    getid = requestIdLoad ssck2(requestId)ssck2(requestId).RemoteHost = ssck1.RemoteHostIP '然后远程主机=第一个监听控件取得的ip
    ssck2(requestId).RemotePort = ssck1.RemotePort '同理
    ssck2(requestId).Accept requestId '然后连接End SubPrivate Sub ssck2_Close(getid As Integer)
    ssck2(getid).Close
    End SubPrivate Sub ssck2_DataArrival(getid As Integer, ByVal bytesTotal As Long)
    Dim a As Stringssck2(getid).GetData a
    Text1.Text = a
    End Sub
      

  9.   

    熟悉socket的高手,有没有兴趣看看?我感觉这样的写法,没有问题.不知道实际当中可不可以~`
      

  10.   

    感谢leongwong(leong),of123() 
    请问of123(),为什么无法同时处理多个客户的请求呢?那怎样编才可以?服务器端我做的功能是保存接收到的文件,还有发送给客户端文件.客户端大概有1~200人访问,也许有很多人同时访问?如果要解决你说的问题,应该怎样解决呢?
      

  11.   

    请参考  http://www.mndsoft.com/blog/article.asp?id=185 的例子
      

  12.   

    我想知道,在dataarrvial内,我得写法,每次都会根据客户端连接的不同,得到不同的socket数组的.那么就可以根据不同的客户端的要求,进行程序的运行.这样也还是不能同时接收客户端的信息么?这样算不算迸发?不过我想,没有什么真正意义上的同时吧?程序肯定要一个一个来处理,应该会排队的吧?
      

  13.   

    控件数组最大下标好像是32767,少量连接的测试,问题还不明显,用户连接一多,溢出的可能性就大了用数组也只能一次处理一个请求,如果服务端处理较复杂、连接又多的话,其他请求就得等,所以这不能算并发,用到并发一般都是用多线程,可VB里用多线程又不太安全,所以一般连接多,处理复杂的都用C写的