程序分为3方。客户端,中转,终端。
客户端负责收集数据,并逐条发送到中转。大概数据量在100-1000条。
中转负责在接收到数据后将数据转发到终端。
终端是其它公司的接收端,机制不详,只知道终端在每次握手时只能传送一条数据。现有程序是从客户端到中转的发送过程没有问题,问题出现在从中转向终端发送时,终端永远只收一条数据。中转程序中设置了两个Socket,一个用于接收客户端,另一个用于将接收到的数据转发到终端。在第一条发送之后,其余每条的发送会在得到上一条返回值后再发送。通过自己设计的终端测试无论是在内网还是通过公网都能实现。但是在连接实际终端后在得到第一条的反馈信息后,第二条可以发出,但是就在没有恢复信息了。请问这是为什么?相关程序如下:客户端:Option Explicit
Public sendflag As Boolean
Public i As IntegerPrivate Sub Command1_Click()
Call SendToSHA
End SubPrivate Sub Form_Load()
sendflag = True
i = 1
If Winsock1.State = sckClosed Then
Winsock1.Connect
DoEvents
End If
End SubPrivate Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
Dim temp As String
Winsock1.GetData tempIf temp = "1" Then
sendflag = True
i = i + 1
Call SendToSHA
Else
sendflag = False
End If
End SubPrivate Sub SendToSHA()Dim j As Integer
j = i
Do While j <= 5
If sendflag = True Then
Winsock1.SendData CStr(i)
DoEvents
sendflag = False
End If
j = j + 1
LoopEnd Sub中转Option Explicit
Public sendflag As BooleanPrivate Sub Form_Load()
Winsock1.Listen
If Winsock2.State = sckClosed Then
Winsock2.Connect
DoEvents
End If
sendflag = True
End SubPrivate Sub Winsock1_ConnectionRequest(ByVal requestID As Long)
Winsock1.Close
Winsock1.Accept requestID
End SubPrivate Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
Dim temp As String
Winsock1.GetData temp
List1.AddItem temp
If Winsock2.State = sckClosed Then
Winsock2.Connect
DoEvents
End IfIf sendflag = True Then
Call SendToCCB(temp)
sendflag = False
End If
End SubPrivate Sub SendToCCB(temp As String)Winsock2.SendData temp
DoEvents
sendflag = FalseEnd SubPrivate Sub Winsock2_DataArrival(ByVal bytesTotal As Long)
Dim temp As String
Winsock2.GetData temp
List1.AddItem temp
MsgBox temp
Winsock1.SendData "1"
sendflag = True
End Sub
客户端负责收集数据,并逐条发送到中转。大概数据量在100-1000条。
中转负责在接收到数据后将数据转发到终端。
终端是其它公司的接收端,机制不详,只知道终端在每次握手时只能传送一条数据。现有程序是从客户端到中转的发送过程没有问题,问题出现在从中转向终端发送时,终端永远只收一条数据。中转程序中设置了两个Socket,一个用于接收客户端,另一个用于将接收到的数据转发到终端。在第一条发送之后,其余每条的发送会在得到上一条返回值后再发送。通过自己设计的终端测试无论是在内网还是通过公网都能实现。但是在连接实际终端后在得到第一条的反馈信息后,第二条可以发出,但是就在没有恢复信息了。请问这是为什么?相关程序如下:客户端:Option Explicit
Public sendflag As Boolean
Public i As IntegerPrivate Sub Command1_Click()
Call SendToSHA
End SubPrivate Sub Form_Load()
sendflag = True
i = 1
If Winsock1.State = sckClosed Then
Winsock1.Connect
DoEvents
End If
End SubPrivate Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
Dim temp As String
Winsock1.GetData tempIf temp = "1" Then
sendflag = True
i = i + 1
Call SendToSHA
Else
sendflag = False
End If
End SubPrivate Sub SendToSHA()Dim j As Integer
j = i
Do While j <= 5
If sendflag = True Then
Winsock1.SendData CStr(i)
DoEvents
sendflag = False
End If
j = j + 1
LoopEnd Sub中转Option Explicit
Public sendflag As BooleanPrivate Sub Form_Load()
Winsock1.Listen
If Winsock2.State = sckClosed Then
Winsock2.Connect
DoEvents
End If
sendflag = True
End SubPrivate Sub Winsock1_ConnectionRequest(ByVal requestID As Long)
Winsock1.Close
Winsock1.Accept requestID
End SubPrivate Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
Dim temp As String
Winsock1.GetData temp
List1.AddItem temp
If Winsock2.State = sckClosed Then
Winsock2.Connect
DoEvents
End IfIf sendflag = True Then
Call SendToCCB(temp)
sendflag = False
End If
End SubPrivate Sub SendToCCB(temp As String)Winsock2.SendData temp
DoEvents
sendflag = FalseEnd SubPrivate Sub Winsock2_DataArrival(ByVal bytesTotal As Long)
Dim temp As String
Winsock2.GetData temp
List1.AddItem temp
MsgBox temp
Winsock1.SendData "1"
sendflag = True
End Sub
解决方案 »
- 空号检测关键步骤搞定,散分
- 为什么有时候do while循环会有空循环??
- 如何调用EXECL????
- (新手提问)如何使得程序自动保留有效数字?
- 自动安装了XP SP2后,鼠标指针经常“僵死”移不动了,重装后正常,散分了
- 如何知道一个控件是否具有某一属性?
- 如何防止程式被克隆使用?
- VB 语言支持问题
- 仅以此帖收集数据库备份,恢复问题:
- @@@@@数据库编程中高手请进@@@@@@(俺的信誉很好的解决了就给分的!)
- 小弟想放一幅大图片到Picture,因为图太大,无法看全小弟想放一个垂直滚动条,但不知道如何和图片框绑定,请大家指点.
- VBA:在EXCEL中有没有什么方法能实现改变下拉匡内容时触发某事件?
看你这一段:Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
Dim temp As String
Winsock1.GetData temp
List1.AddItem temp
If Winsock2.State = sckClosed Then
Winsock2.Connect
DoEvents
End If
好象在接收的时候再判断发送时的状态?感觉应该是两个并行,有点像FTP
新修改的中转程序如下:
Option Explicit
Public sendflag As Boolean
Public ss As WinsockPrivate Sub Form_Load()
Winsock1.Listen
If Winsock2.State = sckClosed Then
Winsock2.Connect
DoEvents
End If
MsgBox Winsock2.State
sendflag = True
End SubPrivate Sub Winsock1_ConnectionRequest(ByVal requestID As Long)
Winsock1.Close
Winsock1.Accept requestID
End SubPrivate Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
Dim temp As String
Winsock1.GetData temp
List1.AddItem tempIf Winsock2.State = sckClosed Then
Winsock2.Connect
DoEvents
End IfCall SendToCCB(temp)End SubPrivate Sub SendToCCB(temp As String)If Winsock2.State <> 7 Then
Winsock2.Close
Winsock2.Connect
DoEvents
End IfWinsock2.SendData temp
DoEvents
sendflag = FalseEnd SubPrivate Sub Winsock2_DataArrival(ByVal bytesTotal As Long)
Dim temp As String
Winsock2.GetData temp
List1.AddItem tempWinsock1.SendData "1"
sendflag = True
Winsock2.CloseEnd Sub
可以参照MSDN上写一下
而且如果你的数据量不是很大的话,为什么不让中转端一次性发送多条记录呢,这样可以减少握手的次数,每两记录间用特殊符号,如"#"间隔至于客户端可以通过
wskServer(Index).GetData TempStr
Str() = Split(TempStr, "#", -1, vbTextCompare)
然后解析Str()的方式来获取所有记录如果怕通讯误码,可以增加校验包