客户端和服务端在本机进行数据通信已经测通,可是当我把服务端放到另外一台机器上时发送一长串字符串过去(有3K)我让服务端返回发送过去的字符串,客户端接收保存字符串却被裁断了文件大小显示只有(2K),请问各位这是怎么回事,在本机却不会这样的情况

解决方案 »

  1.   

    怎么没有人知道是怎么回事吗?Winsock是不是一次只能发送2K的数据,(想想好像也不对客户端一次都能发送3K的数据,而且接收也完全正确)哪位高手有这方面的经验的帮忙解决一下,(急呀,今儿最后一天还要交不出来我得闪人了)在线等待中。。
      

  2.   

    Private Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" (ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long '调用执行API
    Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) '休眠API
    Public strTxt As String '接收的字符串
    Public socstate As Boolean '端口帧听状态Private Sub Form_Load()
        LicSocket1.Close
        LicSocket1.LocalPort = 3016
        LicSocket1.Listen
    End Sub''每隔一秒帧听一次客户端的连接
    'Private Sub LicTime_Timer()
    '    If socstate = True Then
    '        Call Form_Load
    '    End If
    '    socstate = False
    'End Sub'接收到客户端连接时产生
    Private Sub LicSocket1_ConnectionRequest(ByVal requestID As Long)
        LicSocket1.Close
        LicSocket1.Accept requestID
        LicSocket1.SendData "ConSucc"  '返回客户端连接成功
    End SubPrivate Sub LicSocket1_DataArrival(ByVal bytesTotal As Long)
       Dim LicStream As TextStream '创建文件对象
       Dim FSO As FileSystemObject '创建FSO对象它名括Drive、Folder、File、FileSystemObject和TextStream五个对象
       Dim StrPath As String
       Dim Fold As String
       Dim arr
       Dim hostidArray
       Dim licfileArray
       Set FSO = CreateObject("Scripting.FileSystemObject")
       
       Fold = App.Path
       
       LicSocket1.GetData strTxt
       arr = Split(strTxt, "****")
       hostidArray = Split(arr(2), "$$$$")
       licfileArray = Split(arr(3), "$$$$")   Select Case arr(0)
           Case "CreatFile"
                 '这里接收客户端传过来的三个参数,一个为LIC文件名一个为以LIC文件名加日期的文件名和要生成的LIC模块关键字
                 '(file1,file2,files)调用LIC执行文件生成LIC最后再读出LIC信信返回给客户端
                 On Error GoTo ErrMsg
                 For i = 0 To UBound(hostidArray)
                     Set LicStream = FSO.CreateTextFile(Fold + "\" + CStr(hostidArray(i)) + "_" + CStr(Date) + ".txt", True) '创建文件
                     LicStream.Close
                     Set LicStream = FSO.CreateTextFile(Fold + "\" + CStr(hostidArray(i)) + "_" + ".lic", True) '创建文件
                     LicStream.Close
                     
                     Set LicStream = FSO.OpenTextFile(Fold + "\" + CStr(hostidArray(i)) + "_" + CStr(Date) + ".txt", ForWriting) '写入数据
                     LicStream.Write licfileArray(i)
                     LicStream.Close
                     
                     ShellExecute Me.hwnd, "Open", CStr(arr(1)), CStr(hostidArray(i)) + "_" + CStr(Date) + ".txt" + " " + CStr(hostidArray(i)) + "_" + ".lic", App.Path, 0
                     
                     Sleep 1000 '这里休眠是为了使LIC线程执行完毕后再打开生成的LIC文件否则为先打开再往LIC文件里面写内容,这样会写不进去
                 Next i
                 
                 Dim licfile() As String
                 ReDim licfile(UBound(hostidArray))
                 For j = 0 To UBound(hostidArray)
                    '读出数据
                    Set LicStream = FSO.OpenTextFile(Fold + "\" + CStr(hostidArray(j)) + "_" + CStr(Date) + ".txt", ForReading)
                    licread = LicStream.ReadAll
                    LicStream.Close
                    licfile(j) = licread
                 Next j
                 
                 For m = 0 To UBound(hostidArray)
                    If (m <> UBound(hostidArray)) Then
                        licens = licens + licfile(m) + "$$$$"
                    Else
                        licens = licens + licfile(m)
                    End If
                 Next m             LicSocket1.SendData "CreatOk" + "$$$$" + licens
    'licens为发送的数据一次只能有2K
                 
    '             For n = 0 To UBound(hostidArray)
    '                FSO.DeleteFile (Fold + "\" + CStr(hostidArray(n)) + "_" + CStr(Date) + ".txt")
    '                FSO.DeleteFile (Fold + "\" + CStr(hostidArray(n)) + "_" + ".lic")
    '             Next n
           Case "NewCon"
                 Call Form_Load
                 
       End Select
       socstate = True
       
       Exit Sub
    ErrMsg:
       socstate = True
       LicSocket1.SendData "CreatError"
    End Sub
      

  3.   

    我贴啦代码出来怎么没有人回答呀。有没有谁有Winsock控件的详细资料啊,我想看看它的具体用法和一些属性情况,对发送数据的要求,拜托啦各位(以上代码在本机进行数据传送时可以接收到完整数据,可是放到另一台机器上运行同样的数据每次从服务器返回时都只能接收到2K的数据)
    前天我在CSDN上面也找到过一个人提出过这样的问题今天再也找不到了,该怎样解决呀
      

  4.   

    LicSocket1.SendData "CreatError"后面+
    doevents
      

  5.   

    Exit Sub
       DoEvents
       
    ErrMsg:
       socstate = True
       LicSocket1.SendData "CreatError"
       DoEventsEnd Sub没天理呀,我把后面加了DoEvents可是返回的结果还是跟之前一样字符串被裁断了。我想知道DoEvents是起什么作用的
      

  6.   

    去掉sleep +上sleep服务器不会响应任何事件你先去掉sleep 只看接受的数据的完整性
      

  7.   

    这个好像跟Sleep没有多大关系,那里加Sleep是为了给程序另起线程创造时间来执行另外的一个执行程序,但是这里我去掉Sleep之后返回的结果还是被裁断了。我现在还不大清楚服务器为什么只发送2K的数据过来,这个结果是怎么造成的。