⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 chuanganqi.frm

📁 自已做的温度传感器WIN服务端
💻 FRM
📖 第 1 页 / 共 2 页
字号:

End With

Exit Sub

ErrorN:
 Select Case Err.Number
 Case 87:
 Call Print_Log("端口不能打开,程序关闭")
 MsgBox "端口不能打开,程序关闭"
 End
 
Case 10048:
Call Print_Log("端口正在使用,程序关闭")
MsgBox "端口正在使用,程序关闭"
End
End Select

 

End Sub


Private Sub Connect_Host(RMaddr As String) '连接客户机

With Form1.Winsock1

    .RemoteHost = RMaddr
    .RemotePort = 10000
End With



'''''''''''''''''''''''''''''''''


End Sub
Private Sub Record_connect()
Dim IPnum As Integer   'IP个数计数器
Dim CompVal As Integer  '用于比较的临时变量
CompVal = 1               '状态: 0相等,>0 左大于右 <0 相反
''''''''''''''''''''''''''''''''''
For IPnum = 0 To ConnectNumber - 1 Step 1 'ConnectNumber全局变量,连接的IP个数

CompVal = StrComp(IPstr(IPnum), Winsock1.RemoteHostIP)  '求出当前连接IP在本地IP数组中的位置
   If CompVal = 0 Then
  
   Exit Sub    ' 如果此IP已经存在,则不记录
   End If
Next
''''''''''''''''''''''''''''''''''
  
For IPnum = 0 To 11 Step 1   '查找为空的字符

   If IPstr(IPnum) = "" Then
      IPstr(IPnum) = Winsock1.RemoteHostIP
      WhichIP = WhichIP + 1
      Call Print_Status(IPstr(IPnum) & "登入")
      Call Print_Log(IPstr(IPnum) & "登入")
      Call Insert_IPColor(IPstr(IPnum))
      
                              
             If IPnum <> 0 Then  '这句话的作用在于画图函数中,当有一个连接落后于其它连接接入时,使X轴相同
                Draw_Flag = 0
                bakX(IPnum) = bakX(IPnum - 1)
                
             End If

      
      Exit For
   End If
Next



'''''''''''''''''''''''''''''''''
'打印到TEXT1里面连接到客户机的个数
Form1.Timer1.Enabled = True
ConnectNumber = ConnectNumber + 1
Form1.Text1.Text = ConnectNumber
If ConnectNumber = 1 Then
Call Init
End If
Call ADD_IPlist

End Sub



Private Sub Send_SOH_TEMP()   ' 发送温度请求信号

Dim IPnum As Integer
SOH = 1 '标题开始
STX = 2 '正文开始
ETX = 3 '正文结束
EOT = 4 '传输结束
ENQ = 5 '请求
ACK = 6 '收到通知

For IPnum = 0 To ConnectNumber Step 1

  If IPstr(IPnum) <> "" Then

    With Form1.Winsock1

      .RemoteHost = IPstr(IPnum)
      .RemotePort = 10000
    End With
            Call Send_ENQ
            Form1.Winsock1.SendData Chr(SOH) & "TEMPER" & Chr(STX) & Chr(EOT) & Chr(EOT)
         
    
    
  End If
Next

End Sub

Private Sub Get_Msg(data As String) '接收字符串

On Error GoTo Errnum
Winsock1.GetData data, vbString

Exit Sub

Errnum:                         '错误处理
If Err.Number = 10054 Then
Call Print_Status("连接被重置,删除" & Winsock1.RemoteHostIP & "此客户机")
Call Print_Log(Winsock1.RemoteHostIP & "连接被重置")
Call RM_IPlist(Winsock1.RemoteHostIP)
Resume Next
End If

End Sub
Private Sub Send_ACK()    '发送连接确认信号

      Winsock1.RemotePort = 10000
             
     Form1.Winsock1.SendData Chr(ACK)
             
      
End Sub
Private Sub ADD_IPlist()  '将连接到主机的IP显示到TEXT2上面


Dim IPnum As Integer
'IPleng = 0

Form1.List1.Clear

''''''''''''''''''''''''''''''''''
For IPnum = 0 To ConnectNumber Step 1


Form1.List1.AddItem (IPstr(IPnum))

'Form1.Text2.SelStart = IPleng
'Form1.Text2.SelText = IPstr(IPnum) & vbCr + vbLf
'IPleng = Len(IPstr(IPnum)) + IPleng
Next

If Form1.List1.ListCount = 0 Then
Form1.List1.ListIndex = Form1.List1.ListCount - 1
Else
Form1.List1.ListIndex = Form1.List1.ListCount - 2
End If

''''''''''''''''''''''''''''''''''
If ConnectNumber < 0 Then
ConnectNumber = 0
End If

Form1.Text1.Text = ConnectNumber

                                            
 
End Sub
Private Sub RM_IPlist(RMIP As String)  '从LIST1中删除退出的客户机

Dim IPnum As Integer, IPnum2 As Integer
Dim Comp As Integer

''''''''''''''''''''''''''''''''''
For IPnum = 0 To ConnectNumber Step 1
    Comp = StrComp(IPstr(IPnum), RMIP)
    
  If Comp = 0 Then
  
        'bakX(IPnum) = 0
       ' bakY(IPnum) = 0
        Call Print_Log(IPstr(IPnum) & "退出")
        For IPnum2 = IPnum To ConnectNumber Step 1
    
             
            IPstr(IPnum2) = IPstr(IPnum2 + 1)
            IPFlag(IPnum2) = IPFlag(IPnum2 + 1)
            DegreeArray(IPnum2) = DegreeArray(IPnum2 + 1)
            bakY(IPnum2) = bakY(IPnum2 + 1)
            bakX(IPnum2) = bakX(IPnum2 + 1)
           ' Color(IPnum2) = Color(IPnum2 + 1)
        Next
        DegreeArray(IPnum2) = ""
        bakY(IPnum2) = ""
        IPFlag(IPnum2) = 0
        bakX(IPnum2) = 0
        
  
  End If

Next


''''''''''''''''''''''''''''''''''
WhichIP = WhichIP - 1
ConnectNumber = ConnectNumber - 1 '一些变量的更新
If ConnectNumber < 0 Then
ConnectNumber = 0
End If
IPleng = 0

Call ADD_IPlist



End Sub
Private Sub Print_Resultlist(RmoteIP As String)   '打印到LIST2中的数值
Dim Svalue As Integer
Form1.List2.AddItem (RmoteIP & Space(1) & ":" & Cgdegree & "·C")

Svalue = Form1.List2.ListCount - Form1.List2.ListIndex
If Svalue = 1 Then                                            '修正点击list item后出错
Form1.List2.ListIndex = Form1.List2.ListCount
Call Print_Status(RmoteIP & Space(1) & ":" & Cgdegree & "·C")
Else
Form1.List2.ListIndex = Form1.List2.ListCount - 1
End If



'Form1.Text3.SelStart = ResultlistLen
'Form1.Text3.SelText = RmoteIP & Space(1) & ":" & Cgdegree & "·C" & vbCr + vbLf
'ResultlistLen = ResultlistLen + Len(RmoteIP & Space(1) & ":" & Cgdegree & "·C" & vbCr + vbLf)

End Sub


Private Function Chg_Get_Msg(GetMsg As String) As Integer      '从接收到的数据中分离出温度值

Dim LikeVal1 As Integer, LikeVal2 As Integer
Dim length As Integer
''''''''''''''''''''''''''''''''''
length = Len(GetMsg)
''''''''''''''''''''''''''''''''''
LikeVal1 = InStr(GetMsg, "QUITED")

If LikeVal1 Then                        '客户机退出信息
     
     Call Print_Status(Winsock1.RemoteHostIP & "已退出")      '打印退出状态
     Call RM_IPlist(Winsock1.RemoteHostIP)       ' 删除IP列表
     Chg_Get_Msg = 0            '客户机退出则函数返回
     
End If
''''''''''''''''''''''''''''''''''

LikeVal2 = InStr(GetMsg, "RESULT")
   
   If LikeVal2 Then

         GetMsg = Right(GetMsg, length - 7)

         Cgdegree = Left(GetMsg, 5)

         Chg_Get_Msg = 1 '数据接收正确则返回1
      
   End If
       
          
End Function
Private Sub Print_Status(stat As String)  '打印信息到状态栏
Form1.Label4.Caption = "状态:" & stat

End Sub
Private Sub Print_Log(Log As String)

Open "Log.txt" For Append As #2
Print #2, Date & Space(2) & Time & Space(5) & Log
Close #2

End Sub

Private Sub Command1_Click()



Call Local_Active
Form1.Command1.Enabled = False
Form1.Timer4.Enabled = True


End Sub

Private Sub Command2_Click()

Unload Me

End Sub





Private Sub Command3_Click()
Form2.Show
End Sub

Private Sub Form_Load()
LoopTimes = 1

''''''''''''''''''''''''''''''''''
Form1.Timer1.Enabled = False '程序开始运行时关闭计时器
Form1.Timer2.Enabled = False
Form1.Timer3.Enabled = False
Form1.Picture1.AutoRedraw = True
Form1.Timer4.Enabled = False


Call Init
''''''''''''''''''''''''''''''''''
Call Print_Log("Success:The program is running successful!")
'If Len(Inet1.OpenURL("http://192.168.252.9/")) Then   '查看本机网络情况,只限于我们学校,移植请改之

'Else
'Form1.Command1.Enabled = False
'MsgBox "本机网络连接不通,请重试"
'Call Print_Status("网络连接不通")

'End If

''''''''''''''''''''''''''''''''''

End Sub


'''''''''''''''''''''''''''''''''''''''''''''''''''''''
Private Function Judge_Signal(Smsg As String) As Integer

Dim Fir_str As String '采集发过来的字符串的第一个字符

''''''''''''''''''''''''''''''''''
SOH = 1 '标题开始
STX = 2 '正文开始
ETX = 3 '正文结束
EOT = 4 '传输结束
ENQ = 5 '请求
ACK = 6 '收到通知
''''''''''''''''''''''''''''''''''
Fir_str = Left(Smsg, 1)  '取得发来信息的第一个字符
''''''''''''''''''''''''''''''''''

If Asc(Fir_str) = ENQ Then       '若为ENQ信号

    Call Record_connect '连接到客户机
    Call Connect_Host(Winsock1.RemoteHostIP)
    Call Send_ACK
    Call delay(0.3)
    Judge_Signal = 3   '接收到ENQ信号的返回值

End If
''''''''''''''''''''''''''''''''''


 If Asc(Fir_str) = SOH Then   '若为SOH 信号


    Judge_Signal = Chg_Get_Msg(Smsg)  'CHG里面的返回值,1为正确的温度信号,0为退出信号
 

 End If
 ''''''''''''''''''''''''''''''''''
  
If Asc(Fir_str) = ACK Then    '若为ACK信号
 
Dim TheIpNum As Integer
TheIpNum = From_IPTO_Num(Winsock1.RemoteHostIP)
     
 IPFlag(TheIpNum) = 1
 Judge_Signal = ACK
  
End If
''''''''''''''''''''''''''''''''''

End Function


Private Sub Form_Unload(Cancel As Integer)
Dim IPnum As Integer

SOH = 1 '标题开始
STX = 2 '正文开始
ETX = 3 '正文结束
EOT = 4 '传输结束
ENQ = 5 '请求
ACK = 6 '收到通知
''''''''''''''''''''''''''''''''''

For IPnum = 0 To ConnectNumber Step 1  '程序退出时向所有的客户机发送退出信号

    If IPstr(IPnum) <> "" Then
        Call Connect_Host(IPstr(IPnum))
         
            Winsock1.SendData Chr(SOH) & "QUITED" & Chr(STX) & Chr(ETX) & Chr(EOT)
           
    End If
Next

Winsock1.Close
Call Print_Log("End:The program is End Successful!")
Call Print_Log("------------------------------------Finish-----------------------------------")
''''''''''''''''''''''''''''''''''
End Sub

Private Sub Picture1_Paint()
Call Draw_ZB(10)
End Sub

Private Sub Timer1_Timer()

If IPstr(0) <> "" Then
Call Send_SOH_TEMP                '计时器过程:Timer1 运行N秒后timer2才开始运行
Call Print_Status("计时器正常")
Form1.Timer2.Enabled = True
Form1.Timer3.Enabled = True

Else
LoopTimes = 1
Print_Status ("空闲")
Form1.Timer2.Enabled = False

End If




End Sub
Private Function From_IPTO_Num(RemoteIP As String) As Integer
Dim IPnum As Integer
Dim CompVal As Integer

For IPnum = 0 To ConnectNumber Step 1

    CompVal = StrComp(IPstr(IPnum), RemoteIP)

        If CompVal = 0 Then
            From_IPTO_Num = IPnum
     
        End If
   
Next



End Function



Private Sub Timer2_Timer()

Call Send_ALL_Msg
Form1.Timer2.Enabled = False



End Sub

Private Sub Timer3_Timer()
Dim For_Num As Integer
 
For For_Num = 0 To ConnectNumber - 1 Step 1

If IPFlag(For_Num) = 0 Then
   Call Rm_IPlist_From_IPnum(For_Num)
   Exit For
 End If

Next

For For_Num = 0 To 11 Step 1
IPFlag(For_Num) = 0
Next

Timer3.Enabled = False


End Sub
Private Sub Rm_IPlist_From_IPnum(IPnum As Integer)
Dim LoopNum As Integer
Call Print_Status(IPstr(IPnum) & "无应答,强制退出")
Call Print_Log("Error:" & IPstr(IPnum) & "无应答,强制退出")
IPstr(IPnum) = ""
 
For LoopNum = IPnum To ConnectNumber - 1 Step 1
IPstr(LoopNum) = IPstr(LoopNum + 1)
IPFlag(LoopNum) = IPFlag(LoopNum + 1)
DegreeArray(LoopNum) = DegreeArray(LoopNum + 1)
bakY(LoopNum) = bakY(LoopNum + 1)
bakX(LoopNum) = bakX(LoopNum + 1)
'Color(IPnum) = Color(IPnum + 1)
Next


IPstr(LoopNum) = ""
IPFlag(LoopNum) = 0
DegreeArray(LoopNum) = ""
bakX(LoopNum) = 0


ConnectNumber = ConnectNumber - 1
Call ADD_IPlist
End Sub
 

Private Sub Timer4_Timer()
Form1.Label5.Caption = Date & Space(2) & Time
End Sub

Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
Dim colornumber As Integer
 Dim Flag_Result As Integer
 Dim Num_In_Array As Integer
 
 

''''''''''''''''''''''''''''''''''
Call Get_Msg(Rdata)  '当事件发生时收取数据

''''''''''''''''''''''''''''''''''
If IPstr(0) = "" Then    '第一台主机连接前刷新
Form1.Refresh
End If




If Rdata <> "" Then '确定是哪个socket接收到数据
 

Flag_Result = Judge_Signal(Rdata)

  If Flag_Result = 1 Then
  
          Num_In_Array = From_IPTO_Num(Winsock1.RemoteHostIP)  '计算远程机在本地IP数据中的位置
          DegreeArray(Num_In_Array) = Cgdegree    '记录温度值
          Call Print_Resultlist(Winsock1.RemoteHostIP)  '把信息打印到TEXT3中
          Rdata = ""
  End If

End If
''''''''''''''''''''''''''''''''''

''''''''''''''''''''''''''''''''''
 

End Sub


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -