首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VB >

实在不明白什么原因,求解!解决办法

2012-01-11 
实在不明白什么原因,求解!这是一个局域网摄像头抓图传输到客服端显示的程序,用的是winsock,不明白为什么程

实在不明白什么原因,求解!
这是一个局域网摄像头抓图传输到客服端显示的程序,用的是winsock,不明白为什么程序运行一段时间(大约40分钟)后会莫名的没了反应,winsock的所有事件都没有触发,找了很久都不明白什么原因,大家帮忙看看!

服务器端:

VB code
Private Sub Timer3_Timer()On Error Resume Next    Timer3.Enabled = False    If Video_Handle <> 0 Then        Dim x As StdPicture        Set x = CapturePicture(Video_Handle)            SavePic Clipboard.GetData, FileName, "jpg"                   ' 压缩为jpg格式以减小图片        Winsock1.SendData "PS"    End IfEnd SubPrivate Sub Winsock1_Close()    If Winsock1.State <> sckClosed Then        Winsock1.Close        Winsock1.Listen    End IfEnd SubPrivate Sub Winsock1_ConnectionRequest(ByVal requestID As Long)    If Winsock1.State <> sckClosed Then        Winsock1.Close    End If    Winsock1.Accept requestID        Timer3.Enabled = True    Timer3.Interval = 1    End SubPrivate Sub Winsock1_DataArrival(ByVal bytesTotal As Long)On Error Resume Next    Static Cur_Pos As Long, FileLen As Long    Dim strData As String, j    Dim Buf() As Byte    Winsock1.GetData strData    Select Case Trim(strData)        Case "Get_Picture"            If Dir$(FileName) <> "" Then                 ' 找到该文件                Open FileName For Binary As #1                FileLen = LOF(1)                ReDim Buf(1 To BlockSize) As Byte                Get #1, , Buf                Winsock1.SendData Buf                Cur_Pos = BlockSize            End If        Case "Next_Block"            If Cur_Pos >= FileLen Then                Winsock1.SendData "EF"                Close #1                Timer3.Enabled = True             ' 数据传输完毕,开始抓图                Timer3.Interval = 10                Exit Sub            End If                        j = Cur_Pos + BlockSize            If j > FileLen Then                j = FileLen - Cur_Pos            Else                j = BlockSize            End If            ReDim Buf(1 To j) As Byte            Get #1, , Buf            Winsock1.SendData Buf            Cur_Pos = Cur_Pos + j    End Select    End Sub


客服端:
VB code
Private Sub wskClientCamera_DataArrival(ByVal bytesTotal As Long)    On Error Resume Next    Static FileNum As Integer, FileLen As Long    Dim Buf() As Byte    Dim j As Integer    ReDim Buf(bytesTotal) As Byte    wskClientCamera.GetData Buf, vbByte    If bytesTotal = 2 And Chr(Buf(0)) = "P" And Chr(Buf(1)) = "S" Then       '  准备接受图片        If Dir$(FileName) <> "" Then Kill FileName           ' 找到该文件,则将其清除        FileNum = FreeFile        Open FileName For Binary Access Write As #FileNum        FileLen = 0        wskClientCamera.SendData "Get_Picture"        '    发送开始接受图片指令        Exit Sub    End If    If bytesTotal = 2 And Chr(Buf(0)) = "E" And Chr(Buf(1)) = "F" Then              '     图片传输完毕        Close #FileNum        Me.picCamera.Picture = LoadPicture(FileName)          ' 显示图片        Exit Sub    End If    Put #FileNum, , Buf    wskClientCamera.SendData "Next_Block"    FileLen = FileLen + bytesTotalEnd Sub


[解决办法]
老是眨眼晴,没有微笑,不好!
[解决办法]
关注下Video_Handle变量,很可能是Timer3中出问题。改一下:

VB code
Private Sub Timer3_Timer()On Error Resume Next    Timer3.Enabled = False    If Video_Handle <> 0 Then        Dim x As StdPicture        Set x = CapturePicture(Video_Handle)            SavePic Clipboard.GetData, FileName, "jpg"                   ' 压缩为jpg格式以减小图片        Winsock1.SendData "PS"    Else        MsgBox "这里出错了,所以没继续触发任何数据到达事件!"    End IfEnd Sub 


[解决办法]
建立一个友好的握手协议,一次性传输数据,比你这按快发送文件要好多了。而且可以避免出现上面所说的第二种情况

热点排行