📄 chuanganqi.frm
字号:
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 + -