局域网内有多台电脑,大约200台,一台作服务器,其余客户端,实现功能是,在服务器端上面定时发送给符合条件的客户端发消息。发送消息的代码我在点击事件里面
Winsock1.Close
Winsock1.RemoteHost = Grd数据.TextMatrix(Grd数据.RowSel, 1)
Winsock1.RemotePort = "8888"
Winsock1.SendData "OFF"
Winsock1.Connect这可以实现,但是,同样的代码加到timer里面,想通过循环给多个不同的客户端发消息,就出现了“40006”这样的通信问题,下面是我在服务器端的代码,我想我的代码有问题,但是我不会改下面的代码了,我对Winsock不很熟悉,希望高手指教!
Private Sub Timer1_Timer()
Set AboRS = AdoRecordset("SELECT * FROM 客户端表", "FIDSDATE.mdb")
With AboRS
.MoveFirst
Do Until .EOF If .Fields("状态") = "OFF" And .Fields("IP地址") <> "" Then
Winsock1.Close
' Winsock1.Listen
Winsock1.RemoteHost = .Fields("IP地址")
Winsock1.RemotePort = "8888"
'Winsock1.Connect
Do While Winsock1.State = sckConnecting
DoEvents
Loop Winsock1.SendData "OFF"
.MoveNext
ElseIf .Fields("状态") = "ON" And .Fields("IP地址") <> "" Then
Winsock1.Close
Winsock1.Listen
Winsock1.RemoteHost = .Fields("IP地址") Winsock1.RemotePort = "8888"
Switch = False
Winsock1.Connect
Do While Winsock1.State = sckConnecting
DoEvents
Loop
'If Winsock1.State <> sckConnected Then Exit Sub '此时SockCL.State = 6
'If Winsock1.State <> 0 Then Winsock1.State = 0
'If Winsock1.State <> 0 Then: Winsock1.Close
Winsock1.SendData "ON"
.MoveNext
Else
.MoveNext
End If
Loop
End With
End Sub
Winsock1.Close
Winsock1.RemoteHost = Grd数据.TextMatrix(Grd数据.RowSel, 1)
Winsock1.RemotePort = "8888"
Winsock1.SendData "OFF"
Winsock1.Connect这可以实现,但是,同样的代码加到timer里面,想通过循环给多个不同的客户端发消息,就出现了“40006”这样的通信问题,下面是我在服务器端的代码,我想我的代码有问题,但是我不会改下面的代码了,我对Winsock不很熟悉,希望高手指教!
Private Sub Timer1_Timer()
Set AboRS = AdoRecordset("SELECT * FROM 客户端表", "FIDSDATE.mdb")
With AboRS
.MoveFirst
Do Until .EOF If .Fields("状态") = "OFF" And .Fields("IP地址") <> "" Then
Winsock1.Close
' Winsock1.Listen
Winsock1.RemoteHost = .Fields("IP地址")
Winsock1.RemotePort = "8888"
'Winsock1.Connect
Do While Winsock1.State = sckConnecting
DoEvents
Loop Winsock1.SendData "OFF"
.MoveNext
ElseIf .Fields("状态") = "ON" And .Fields("IP地址") <> "" Then
Winsock1.Close
Winsock1.Listen
Winsock1.RemoteHost = .Fields("IP地址") Winsock1.RemotePort = "8888"
Switch = False
Winsock1.Connect
Do While Winsock1.State = sckConnecting
DoEvents
Loop
'If Winsock1.State <> sckConnected Then Exit Sub '此时SockCL.State = 6
'If Winsock1.State <> 0 Then Winsock1.State = 0
'If Winsock1.State <> 0 Then: Winsock1.Close
Winsock1.SendData "ON"
.MoveNext
Else
.MoveNext
End If
Loop
End With
End Sub
下面这个也许对你有用: http://topic.csdn.net/t/20011212/20/417734.html
DoEvents
Loop 这在代码中添加了,但是任然有问题,我试过了。
Dim intMax As Long
Private Sub Form_Load()
intMax = 0
Winsock1(0).Protocol = sckTCPProtocol
Winsock1(0).LocalPort = 8888
Winsock1(0).Listen
End SubPrivate Sub Winsock1_ConnectionRequest(index As Integer, ByVal requestID As Long)
Dim i As Long
For i = 1 To intMax
If Winsock1(i).State = 0 Then
Exit For
End If
Next i
If i > intMax Then
intMax = intMax + 1
Load Winsock1(intMax)
End If
Winsock1(i).Accept requestID
End Sub
Dim blnCon As BooleanPrivate Sub Form_Load()
Winsock1.Protocol = sckTCPProtocol
Winsock1.RemoteHost = "*.*.*.*"
Winsock1.RemotePort = 1010
End SubPrivate Sub Timer1_Timer()
If blnCon = False Then
If Winsock1.State = 0 Then
Winsock1.Connect
ElseIf Winsock1.State = 7 Then
'发送处理代码
blnCon = True
Else
Winsock1.Close
End If
End If
End Sub
Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
'事件处理代码
End Sub
Private Sub Winsock1_ConnectionRequest(Index As Integer, ByVal requestID As Long)
Dim i As Long
i = Winsock1.UBound + 1
Load Winsock1(i)
Winsock1(i).Accept requestID
Debug.Print "Accept(" & requestID & ") : " & Winsock1(i).RemoteHostIP
End Sub
“我所说的服务器”实际按照Winsock客户端写的代码,只是在循环里面按照数据库中的内容给各个 Winsock服务器端 发消息,这样写主要是为了稳定。现在的问题是Winsock客户端发送消息的部分在'Winsock1.Connect 之后,执行Winsock1.SendData "OFF" 时,出现了问题。我不知道这样的问题怎么处理,我的Winsock客户端的代码怎么处理?
连接成功后,建立的通道是双向的,除了客户端(发起 Connect)的 WinSocket 控件可以 SendData,服务端要反馈信息可以直接用(执行了 Accept 的)WinSocket 控件进行 SendData,不需要反向进行 Connect 请求。
单独一个 WinSocket 不要同时做 Connect 和 Listen,如果程序要同时实现客户端和服务端,就用多个 WinSocket 实现。
Winsock1.Close
Winsock1.LocalPort = PortNumber.Text '设置默认端口号
Winsock1.Listen '监听端口
End SubPrivate Sub Winsock1_ConnectionRequest(ByVal requestID As Long)
Winsock2.Accept requestID '响应Socket连接
End SubPrivate Sub Winsock2_DataArrival(ByVal bytesTotal As Long)
Dim redata As String
Winsock2.GetData redata, vbString '取得指令
SetMonitor redata '根据指令设置显示器
Winsock2.Close '关闭Socket连接
End Sub
你上面那段代码在Winsock2收到客户机的数据后就执行了Winsock2.Close,Close以后客户机与服务器的连接中断,服务器就不能再将任何消息发送至客户机,也不能从客户机接收任何消息。你还是仔细看看5、6、7、10、12楼的回复吧!
Option Explicit
Public LastState As Integer
Private Exitflag As Boolean
'Dim intMax As LongPrivate Sub ExitCmd_Click()
Dim isok
isok = MsgBox("退出后将不能接收服务器消息, 是否要退出程序? ", vbYesNo, "是否退出程序")
If isok = vbYes Then
Exitflag = True
Unload Me
End If
End SubPrivate Sub Form_Load()
Dim 现在时间 As Date
Me.Visible = False '隐藏窗体
PortNumber.Text = 8888 '设置默认端口号
Winsock1.LocalPort = PortNumber.Text '设置默认端口号
Winsock1.Listen '监听端口
If WindowState = vbMinimized Then
LastState = vbNormal
Else
LastState = WindowState
End If
AddToStock Me, sysmenu '添加托盘
SetStockTip "点击可以打开窗体设置连接端口" '添加托盘提示
End SubPrivate Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
If Exitflag Then
RemoveFromStock
Else
Me.Visible = False
Cancel = True
End If
End Sub
Private Sub menuExit_Click()
Call ExitCmd_Click
End Sub
Private Sub setPortCmd_Click()
Winsock1.Close
Winsock1.LocalPort = PortNumber.Text '设置默认端口号
Winsock1.Listen '监听端口
End SubPrivate Sub Winsock1_Close()
Winsock1.Close
End SubPrivate Sub Winsock1_ConnectionRequest(ByVal requestID As Long)
Winsock2.Accept requestID '响应Socket连接
End SubPrivate Sub Winsock2_Close()
Winsock2.Close
End SubPrivate Sub Winsock2_DataArrival(ByVal bytesTotal As Long)
Dim redata As String
Winsock2.GetData redata, vbString '取得指令
SetMonitor redata '根据指令设置
Winsock2.Close '关闭Socket连接
End SubPublic Sub SetMonitor(data As String)
If data = "ON" Then '判断指令
MonitorOn Me
ElseIf data = "OFF" Then '判断指令
MonitorOff Me End If
End Sub