在一个窗体上最多可以有几个winsock控件,我编了一个程序,一个窗体上有两个winsock控件,一个用于接收,一个用于发送,但是在发送信息时,能和别人连接上,信息发送不出去?请问这是怎么回事?我想让发送部分自动执行!
这是我的代码,大家帮帮我看一下,在这先谢谢了!
Option Explicit
Dim i As Integer
Dim A() As String
Dim sql As String
Dim rs_deal As New ADODB.Recordset
Dim sql1 As String
Dim B() As String
Dim t1 As Integer
Dim t2 As Integer
Dim rs_fs As New ADODB.Recordset
Dim m As String
Private Sub form_load()
Text2(0).Text = Format(Date, "yyyy-mm-dd")
Winsock1.Protocol = sckTCPProtocol
Winsock1.LocalPort = 3333
Winsock1.Listen
End Sub
Private Sub Winsock1_ConnectionRequest(ByVal requestID As Long)
If Winsock1.State <> sckClosed Then
Winsock1.Close
Winsock1.Accept requestID
End If
End Sub
Private Sub Winsock1_dataarrival(ByVal bytestotal As Long)
On Error Resume Next
Dim clientdata As Variant
Winsock1.GetData clientdata, vbString
inf = clientdata
End Sub
Private Sub Winsock1_close()
Winsock1.Close
If inf = "" Then
Winsock1.Listen
Else
inf_save
inf_fs
End If
End Sub
Private Sub inf_save()
Adodc1.connectionstring = "provider =microsoft.jet.oledb.4.0;data source=bus.mdb;jet oledb:database password ='123'"
Adodc1.RecordSource = "select * from 运行信息"
Adodc1.Refresh
Adodc1.Recordset.AddNew
Text2(0).Text = Format(Date, "yyyy-mm-dd")
A = Split(inf, "/")
For i = 1 To 8
Text2(i).Text = A(i - 1)
Next i
sql = "select 站牌名 from 站牌信息 where 所属路线 = '" & A(0) & "' and 站牌编号= '" & A(7) & "'"
rs_deal.Open sql, conn, adOpenKeyset, adLockPessimistic
Text2(9).Text = rs_deal.Fields(0)
station = Text2(9).Text
rs_deal.Close
Adodc1.Recordset.Update
For i = 1 To 9
Text2(i).Text = ""
Next i
End Sub
Private Sub inf_fs()
B = Split(inf, "/")
If B(7) < 200 Then
sql1 = "select 站牌编号,IP,端口 from 站牌信息 where 站牌编号>= '" & B(7) & "' and 站牌编号 < '104' and 所属路线 = '" & B(0) & "'order by 站牌编号"
rs_fs.Open sql1, conn, adOpenKeyset, adLockPessimistic
Else
sql1 = "select 站牌编号,IP,端口 from 站牌信息 where 站牌编号>= '" & B(7) & "' and 站牌编号 <='300' and 所属路线 = '" & B(0) & "'order by 站牌编号"
rs_fs.Open sql1, conn, adOpenKeyset, adLockPessimistic
End If
Do While Not rs_fs.EOF
t1 = rs_fs.Fields(0) - B(7)
t2 = 5 * t1
m = B(0) & "" & t2 & "" & B(5) & "" & station
Winsock2.Protocol = sckTCPProtocol
Winsock2.RemoteHost = rs_fs.Fields(1)
Winsock2.RemotePort = CLng(rs_fs.Fields(2))
Winsock2.Connect
Do While Not Winsock2.State = sckConnected
DoEvents
Loop
Winsock2.SendData m
Winsock2.Close
m = ""
rs_fs.MoveNext
Loop
rs_fs.Close
Winsock1.Listen
End Sub
这是我的代码,大家帮帮我看一下,在这先谢谢了!
Option Explicit
Dim i As Integer
Dim A() As String
Dim sql As String
Dim rs_deal As New ADODB.Recordset
Dim sql1 As String
Dim B() As String
Dim t1 As Integer
Dim t2 As Integer
Dim rs_fs As New ADODB.Recordset
Dim m As String
Private Sub form_load()
Text2(0).Text = Format(Date, "yyyy-mm-dd")
Winsock1.Protocol = sckTCPProtocol
Winsock1.LocalPort = 3333
Winsock1.Listen
End Sub
Private Sub Winsock1_ConnectionRequest(ByVal requestID As Long)
If Winsock1.State <> sckClosed Then
Winsock1.Close
Winsock1.Accept requestID
End If
End Sub
Private Sub Winsock1_dataarrival(ByVal bytestotal As Long)
On Error Resume Next
Dim clientdata As Variant
Winsock1.GetData clientdata, vbString
inf = clientdata
End Sub
Private Sub Winsock1_close()
Winsock1.Close
If inf = "" Then
Winsock1.Listen
Else
inf_save
inf_fs
End If
End Sub
Private Sub inf_save()
Adodc1.connectionstring = "provider =microsoft.jet.oledb.4.0;data source=bus.mdb;jet oledb:database password ='123'"
Adodc1.RecordSource = "select * from 运行信息"
Adodc1.Refresh
Adodc1.Recordset.AddNew
Text2(0).Text = Format(Date, "yyyy-mm-dd")
A = Split(inf, "/")
For i = 1 To 8
Text2(i).Text = A(i - 1)
Next i
sql = "select 站牌名 from 站牌信息 where 所属路线 = '" & A(0) & "' and 站牌编号= '" & A(7) & "'"
rs_deal.Open sql, conn, adOpenKeyset, adLockPessimistic
Text2(9).Text = rs_deal.Fields(0)
station = Text2(9).Text
rs_deal.Close
Adodc1.Recordset.Update
For i = 1 To 9
Text2(i).Text = ""
Next i
End Sub
Private Sub inf_fs()
B = Split(inf, "/")
If B(7) < 200 Then
sql1 = "select 站牌编号,IP,端口 from 站牌信息 where 站牌编号>= '" & B(7) & "' and 站牌编号 < '104' and 所属路线 = '" & B(0) & "'order by 站牌编号"
rs_fs.Open sql1, conn, adOpenKeyset, adLockPessimistic
Else
sql1 = "select 站牌编号,IP,端口 from 站牌信息 where 站牌编号>= '" & B(7) & "' and 站牌编号 <='300' and 所属路线 = '" & B(0) & "'order by 站牌编号"
rs_fs.Open sql1, conn, adOpenKeyset, adLockPessimistic
End If
Do While Not rs_fs.EOF
t1 = rs_fs.Fields(0) - B(7)
t2 = 5 * t1
m = B(0) & "" & t2 & "" & B(5) & "" & station
Winsock2.Protocol = sckTCPProtocol
Winsock2.RemoteHost = rs_fs.Fields(1)
Winsock2.RemotePort = CLng(rs_fs.Fields(2))
Winsock2.Connect
Do While Not Winsock2.State = sckConnected
DoEvents
Loop
Winsock2.SendData m
Winsock2.Close
m = ""
rs_fs.MoveNext
Loop
rs_fs.Close
Winsock1.Listen
End Sub
一个WinSock与另一个程序的Winsock连接上后是一对一的关系,
也就是说,互相之间又可以发送,又可以接收.
如果你想一个程序用二个Winsock与另一个程序一个Winsock相连
一个接收,一个用于发送,那是行不通的.
这样的话,上述问题请问怎么解决?
Winsock2.RemoteHost = rs_fs.Fields(1)
Winsock2.RemotePort = CLng(rs_fs.Fields(2))
Winsock2.Connect
Do While Not Winsock2.State = sckConnected
DoEvents
Loop
Winsock2.SendData m
Winsock2.Close
这一段直接用
winsock1.senddata m
也不要关闭了.当你不想连接的时候就选择关闭就行了.
Winsock2.SendData m
就是这句,在调试中已经执行,但是没把信息发出去!
'那你就不能用
'Winsock1.Listen
'以下告诉你思路,代码段,我就不贴子.
'正如你所说要用二个Winsock(接收一个Winsock,发送给几个服务器就要用几个Winsock)
'比如你接收一个,要发送至三个不同的服务器,那就要四个winsock
'winsock的分配:
'winsockGetData 接收的Winsock名称
'WinSockSendData 发送的 Winsock名称 设置 Index=0'程序开始:
'初始化for i=1 count(要发送的服务器总数)
load winsockSendData(i)
nextwinsockGetData.Connect 远程服务器地址,远程服务器端口 '此处的是接收服务器的数据for i=1 count(要发送的服务器总数)
winsockSendtData(i).Connect 远程服务器地址(i),远程服务器端口(i) '此处的是每个发送服务器的数据
nextPrivate Sub WinsockGetData_DataArrival(ByVal bytesTotal As Long) '此处在接收服务器的接收事件中
dim StrData as string
winsockGetData.GetData StrData
winsockSendData(标志).StrData '此处通过接收到的数据的标志判断发送至那一个服务器(标志是判断是发送那一台服务器的下标)
End Sub
'初始化
Dim SendDataCount(100) As Boolean '设置可以接收100个客户端的数据
WinsockSendData.LocalPort = 4000 '本地监听端口
WinsockSendData.Listen '监听winsockGetData.Connect 远程服务器地址,远程服务器端口 '此处的是接收服务器的数据Private Sub WinsockGetData_DataArrival(ByVal bytesTotal As Long) '此处在接收服务器的接收事件中
dim StrData as string
winsockGetData.GetData StrData
winsockSendData(标志).StrData '此处通过接收到的数据的标志判断发送至那一个服务器(标志是判断是发送那一台服务器的下标) '分析.返回数据.
'当接收到的数据是接收方发来的返回成功标志
'WinsockSendData(0).Close '关闭
'WinsockSendData(0).Listen '接着进行监听
End Sub
Private Sub WinsockSendData_DataArrival(Index As Integer, ByVal bytesTotal As Long)
If Index = 0 Then
Load WinsockSendData(新的下标) '如果有客户端连接,加载一个Winsock
WinsockSendData(新的下标).LocalPort = 新的端口
WinsockSendData(新的下标).Listen
WinsockSendData(Index).Close
WinsockSendData(Index).Accept requestID
WinsockSendData(Index).SendData 新的端口 '将新的端口发过去,让他采用新的端口进行连接,同时要求接收的服务器再发送一个成功标志
Else
WinsockSendData(Index).Close
WinsockSendData(Index).Accept requestID
End If
End Sub