这个很正常,因为服务器(对方)还没对客户端(本地)做Close动作。还有一个说法是本地端控件的缓存还存在着与服务器对应Handle,只是State属性状态不是sckConnected而已。继续进行测试,你也会发现只要超过60秒通信闲置,也会自动Not sckConnected。
创新互联建站主要从事成都网站建设、网站建设、网页设计、企业做网站、公司建网站等业务。立足成都服务龙岩,十余年网站建设经验,价格优惠、服务专业,欢迎来电咨询建站服务:18980820575
TCP连线,可以使用Load 控件数组进行尝试连线,当控件Close后就Unload,这可以取代必须关闭窗体、重新打开连接的问题。
发送接收的过程都放在Try...Catch里面,一旦连接中断,就会出错,此时可以关闭现有连接,重新连服务端
编写一个宽带连接的批处理脚本:
rasdial entryname [unseranamd 12345678]
编写一个宽带断开的批处理脚本:
rasphone -h entryname
在vb中调用这两个脚本执行就可以了;
tcp
还是
udp?
tcp
的话
try
-
catch
就行了,因为
tcp
要求的是稳定的连接,连接一断开直接就
throw
exception
了。
udp
的话,因为它本身是无连接的协议,所以其实不存在断开不断开的,准确的说应该是超时。可以客户端每隔一段时间向服务端发送个心跳包(随便什么数据都行,只是证明客户端还在线),服务端每隔一段时间检测在线的客户端列表,谁已经很久没发来心跳包了就证明它掉线了。
原代码的问题: 1.计时器每过 [Interval] 毫秒就会自动触发 Timer() 事件,而你在其中又加了一个循环,让人不知所云 2.下面这段代码是始终无法执行到 Close 1 的,因为一旦跳到这段代码,首先执行的便是 Exit Sub ,于是程序就不会关闭这个文件。 E: Exit Sub Close 1 同时,正确的语法应是:Close #1 3.最好不要频繁的打开、关闭文件,这样会影响程序的性能 4.你的变量 i 与 NewFile 的声明有问题。如果在某一事件中使用 Dim ,在其所在的事件结束后,变量就会被销毁。于是 NewFile 便始终只有一个字符。应该使用 Static 创建静态变量,或将这两个变量用 Dim 在(通用)(声明)处将其声明。 你可以在(通用)(声明)处(所有代码的最上面)声明: Dim File As String '文件名 Dim Fid As Integer '文件号 把打开文件的代码放在窗体打开的事件里面: Private Sub Form_Load() Fid = FreeFile File = "F:\test1.txt" Open File For Input As #Fid End Sub 注:此处你最好用 FreeFile 生成一个空闲的文件号。万一 #1 这个文件号被占用,那程序还是会出错的。 然后在定时器里面添加代码: Private Sub Timer1_Timer() Static i '因为 i 是随着定时器的事件一一累加的,所以要声明为静态变量。 Static NewFile As String '因为 NewFile 里的字符是随着定时器的事件一一累加的,所以要声明为静态变量。 Dim Char As String '因为 Char 只是作为临时变量,所以声明为普通变量。 On Error GoTo E i = i + 1 Char = Input(i, #Fid) '你在这里写的代码是 Char = Input(1, #1) ,是不是写错了?我给你改成了 i NewFile = NewFile + Char Text1.Text = NewFile IF i = LOF(Fid) Then Timer1.Enable = Fals