服务端往客户端发送没问题
客户端往服务端发送就出错但是服务端接收解析数据前加一句msgbox(bytesTotal)就不出问题.请问怎么办?下面是源代码
http://ufouser.b155.zgsj.com/vbnet_error.rar
http://ufouser.b155.zgsj.com/vbnet_ok.rar

解决方案 »

  1.   

    服务端接收解析数据前加一句 doevents试试
      

  2.   

    将你的msgbox(bytesTotal)替换成doevents试一下
      

  3.   

    doevents还是出错
    字符串数据小于26时就没问题
    大于100肯定出错
    用msgbox停顿一下就没问题.
    真是搞笑下面是进一步简化的代码
    望各位老大帮忙
    http://ufouser.b155.zgsj.com/VbNet_Error_Simpled.rar
    同时直接贴上代码:VERSION 5.00
    Object = "{248DD890-BB45-11CF-9ABC-0080C7E7B78D}#1.0#0"; "MSWINSCK.OCX"
    Begin VB.Form Form1 
       Caption         =   "VB_Net"
       ClientHeight    =   7440
       ClientLeft      =   60
       ClientTop       =   450
       ClientWidth     =   6120
       LinkTopic       =   "Form1"
       ScaleHeight     =   7440
       ScaleWidth      =   6120
       StartUpPosition =   3  '窗口缺省
       Begin VB.CommandButton cmdCStart 
          Caption         =   "再新开一个此程序启动客户端客户端启动"
          Height          =   1935
          Left            =   4920
          TabIndex        =   4
          Top             =   4440
          Width           =   975
       End
       Begin VB.CommandButton cmdSStart 
          Caption         =   "先启动服务端"
          Height          =   1095
          Left            =   4440
          TabIndex        =   3
          Top             =   3240
          Width           =   1575
       End
       Begin VB.TextBox txtIn 
          Height          =   375
          Left            =   240
          TabIndex        =   1
          Top             =   6840
          Width           =   4215
       End
       Begin MSWinsockLib.Winsock tcpServer 
          Left            =   5640
          Top             =   840
          _ExtentX        =   741
          _ExtentY        =   741
          _Version        =   393216
       End
       Begin VB.CommandButton cmdSend 
          Caption         =   "发送"
          Height          =   615
          Left            =   4920
          TabIndex        =   0
          Top             =   6600
          Width           =   975
       End
       Begin MSWinsockLib.Winsock tcpClient 
          Left            =   5640
          Top             =   240
          _ExtentX        =   741
          _ExtentY        =   741
          _Version        =   393216
       End
       Begin VB.Label lblTcpMode 
          Height          =   495
          Left            =   4680
          TabIndex        =   2
          Top             =   1680
          Width           =   1095
       End
    End
    Attribute VB_Name = "Form1"
    Attribute VB_GlobalNameSpace = False
    Attribute VB_Creatable = False
    Attribute VB_PredeclaredId = True
    Attribute VB_Exposed = False
    Option Explicit'包装的发送结构
    ''''''''''''''''''''''''''''''''''''''''''''''''''''''
    '若chat长度大于100就出错
    Private Type NetMsg
        chat As String * 20 '聊天信息
    End Type
    ''''''''''''''''''''''''''''''''''''''''''''''''''''''Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)Private Sub cmdCStart_Click()
        Print "启动客户端..."
        tcpClient.RemoteHost = "localhost"
        tcpClient.RemotePort = 5000
        Call tcpClient.Connect  '连接
        Print "启动完成"
        
        cmdSend.Enabled = True
        txtIn.Visible = True
        
        cmdSStart.Enabled = False
        cmdCStart.Enabled = False
    End Sub'发送按钮
    Private Sub cmdSend_Click()    Print    Dim msg As NetMsg
        msg.chat = txtIn.Text
        Print "读入聊天信息: " & msg.chat
        
        Dim buffer() As Byte
        ReDim buffer(LenB(msg))
        
        CopyMemory buffer(0), msg, LenB(msg)
        Print "客户端二进制转换完成"
        
        Call tcpClient.SendData(buffer)
        Print "客户端发送完成"
        
    End SubPrivate Sub cmdSStart_Click()    Print "启动服务端..."
        tcpServer.LocalPort = 5000
        Call tcpServer.Listen   '监听
        Print "启动完成"
        
        
        cmdSend.Enabled = False
        cmdSStart.Enabled = False
        cmdCStart.Enabled = False
        txtIn.Visible = False
    End Sub
    '窗体启动
    Private Sub Form_Load()
        cmdSend.Enabled = False
    End Sub'窗体关闭
    Private Sub Form_Terminate()
       tcpClient.Close
       tcpServer.Close
    End Sub'TCP客户端关闭
    Private Sub tcpClient_Close()
        Call tcpClient.Close
    End Sub
    '客户端数据发送完成
    Private Sub tcpClient_SendComplete()
        Print "客户端数据发送完成"
    End Sub
    'TCP服务端关闭
    Private Sub tcpServer_Close()
        Call tcpServer.Close
        Call tcpServer.Listen
    End Sub'TCP服务端连接
    Private Sub tcpServer_ConnectionRequest(ByVal requestID As Long)
        If tcpServer.State <> sckClosed Then
            Call tcpServer.Close
        End If
        Call tcpServer.Accept(requestID)
        
    End Sub'TCP服务端数据到达
    Private Sub tcpServer_DataArrival(ByVal bytesTotal As Long)
        Dim msg As NetMsg
        Print
        Print "服务端收到数据, 正在解析..."
        
        ''''''''''''''''''''''''''''''''''''''''''''''''''
        Dim buffer() As Byte
        ReDim buffer(bytesTotal)
       
        ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
        '此处加这一句那么聊天信息长度超过26也能解决问题
        MsgBox ("共收到:" & bytesTotal & "字节")
        ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
        'DoEvents
        '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
        
        Call tcpServer.GetData(buffer)
        Print "获取二进制数据完成, 共" & bytesTotal & "个字节"
        
        '生成结构体
        CopyMemory msg, buffer(0), LenB(msg)
        Print "转换成信息结构体完成"
        
        '显示收到的信息
        Print "解析完成,信息为:" & msg.chat
        ''''''''''''''''''''''''''''''''''''''''''''''''''
        Print "完成..."
    End Sub'TCP服务端错误
    Private Sub tcpServer_Error(ByVal Number As Integer, Description As String, ByVal Scode As Long, ByVal Source As String, ByVal HelpFile As String, ByVal HelpContext As Long, CancelDisplay As Boolean)
        MsgBox ("TCP Server Error:" & Source & ":" & Description)
    End Sub
      

  4.   

    这样试试:
    Dim buffer() As Byte
        ReDim buffer(bytesTotal)
        
        tcpServer.GetData buffer(), vbArray
      

  5.   

    精确一点应该这样写:ReDim buffer(bytesTotal-1)