问各位高手:如何使用在VB中使用WINSOCKET进行数据传递(大量定时--2s传递一批)

kw123 2005-04-18 09:26:04
问题是这样的,4台电脑连网络,其中一台设定是服务器,其他3台为客户机。采用VB编程序。我想使用WINSOCKET来实现3台客户机向服务器定时发送数据--时间很短(2秒触发一次,可能数据量大)。如何实现啊
我以前是使用DELPHI,可以在那里可以采用serversocket和clientsocket来实现。至于VB是头一次实现,请问有什么好的办法实现或提供参考资料--也许你们会问:为什么不用DELPHI来实现?但现实境况如此,必须服从。希望大家指点迷津。

问题应该有的大侠实现过。希望得到你们的帮助。若问题解决。另重谢!

关于VB中的WINSOCKET的使用方法也希望一并告之。谢谢大家
...全文
514 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
wosirius 2005-07-04
  • 打赏
  • 举报
回复
mm
hwshws123 2005-04-24
  • 打赏
  • 举报
回复
关注
qyii 2005-04-24
  • 打赏
  • 举报
回复
用Winsock控件已经很好了~什么乱七八糟的第三方sock封装.要不用winsock控件的话,我都去用API了!用不着到处找!!!

楼主还没解决,并没找到人帮你的话发信到:qyii@21cn.com 在信里把问题说清楚就行了!要是可以的话,附上你现阶段的原码最好~主要是了解一下你想要的功能
laidon 2005-04-23
  • 打赏
  • 举报
回复
其实还是用raw socket来做比较好一点,只是声明太麻烦了,不过幸好偶有写好的声明,前段时间自己写了一个用来捕获数据包的东东,本来是用VC写的DLL,但是由于有一些是指针类型的参数,所以有数据丢失,后来好好看了看windows2000的网络编程资料,才发现用VB写也不是很难,我是在网吧上网,源码不在,以后再发上来了,也可以联系偶啊,提供技术支持!!!
MAIL:laidon1980@163.com QQ:71451437
kw123 2005-04-22
  • 打赏
  • 举报
回复
8858
kw123 2005-04-21
  • 打赏
  • 举报
回复
是这样的,根据代码
Private Sub Winsock1_ConnectionRequest(index As Integer, ByVal requestID As Long)
On Error Resume Next
If index = 0 Then
Dim i As Integer
Dim temp As Integer
temp = 0
For i = 1 To intMax
If Winsock1(i).State = vbclose Then
temp = i
Exit For
End If
Next
If temp = 0 Then
intMax = intMax + 1
temp = intMax
End If
Load Winsock1(temp)

Winsock1(temp).LocalPort = 0

Winsock1(temp).Accept requestID
End If

End Sub
所测试出来的结果发现问题

我很想知道:当客户端异常退出,触发服务器的是什么事件?
我以前通过DELPHI实现过对于单独发送信息的程序,但是它提供异常退出的代码模块,我根据得到的handle来判断。发送也同样如此

vb中是如何实现的?
鉴于如此:问题现在很清晰
多客户端连接,连接后得到index,退出后取消对应的index.客户端不断连接,连接通后停止,当断开后自动重新连接。服务器端不断的侦听,获得客户端的连接信息,断开后取消连接信息。
意思大意上通的
zyg0 2005-04-21
  • 打赏
  • 举报
回复
哦,我记错了
Private Sub fjmsg(str As String, index As Integer)
For i = 1 To intMax
If Winsock1(i).State = 7 Then
Winsock1(i).SendData str & "#$%@#$%@#&&#@"
DoEvents
End If
Next
End Sub
这个代码是一个广播发送,你要是实现私聊得话就需要一个数据库记录个个客户端,然后找到客户端对应的winsock(index)
那么你就
Private Sub fjmsg(str As String, index As Integer)

If Winsock1(i).State = 7 Then
Winsock1(找到的index).SendData str & "#$%@#$%@#&&#@"
DoEvents
End If

End Sub
kw123 2005-04-21
  • 打赏
  • 举报
回复
没有啊!
Private Sub fjmsg(str As String, index As Integer)
For i = 1 To intMax
If Winsock1(i).State = 7 Then
Winsock1(i).SendData str & "#$%@#$%@#&&#@"
DoEvents
End If
Next
End Sub

是问题转发到所有客户端,我的是服务器指定一个客户端发送信息的。比如第一台客户发送信息。选择一客户发送即可,而其他客户是看不到的,你的程序我没有发现私聊的地方,还望你能够指点迷津
kw123 2005-04-21
  • 打赏
  • 举报
回复
请问: zyg0(影子(我可以很负责任地说:我已经真的很胖了) ( ) 如何实现啊!
我是不懂的,希望得到你的帮助的
zyg0 2005-04-21
  • 打赏
  • 举报
回复
这个非法下线需要手动处理的,你在正常下线的时候执行 winsock.close 会触发服务器的close事件,但是非法下线的话不会有任何提示,因为这个是tcp协议本身的缺陷.
解决办法
:
用一个timmer控件定时和客户端连,客户端回发一个在线的消息.如果出现错误或者没有回应的话就视为断线,(有人把这个说成是心跳程序.不信你测试一下,你上qq把网线拔了,你看他有反映吗.不是程序的问题,只是协议的问题)
这个你自己写吧,也不是很难
zyg0 2005-04-20
  • 打赏
  • 举报
回复
指定一个客户端我已经实现了阿,我的事1个客户端向另一个客户端私聊
kw123 2005-04-20
  • 打赏
  • 举报
回复
简单的就是服务器可以指定的向一个客户端发送信息而其他不能看到,如何实现
可以使用向所有的客户段发送信息,在客户段判断,但是这样做很容易被别人截包,而且大批量的发送数据也可能出错的
zyg0 2005-04-18
  • 打赏
  • 举报
回复
msdn的例子可以参考一下
多客户端的连接可以参考这个
http://community.csdn.net/Expert/topic/3907/3907432.xml?temp=.4553186
这个是聊天的,可以很容易改成泥要的东西
kw123 2005-04-18
  • 打赏
  • 举报
回复
如何使用WINSOCKET控件啊?有这方面的文章吗?
比如:服务器打开后自动侦听,客户端打开后自动连接,当服务器断开后,所有客户端处于不断连接状态,一直到连接成功。每一个客户端断开不影响服务器的连接情况,一直的自动侦听连接状态。当有用户连接后,自动在数据表上增加一条连接记录,有客户端退出时候服务器端自动将上次增加的记录删除,一直这样。(当然,服务器打开后自动清空数据表中的记录)
数据量不大,每隔两秒传递大概几十K的字节
zyg0 2005-04-18
  • 打赏
  • 举报
回复
1数据量有多大 1m?2m还是多少
使用方法只能看msdn遇到的问题可以帮你解决
qyii 2005-04-18
  • 打赏
  • 举报
回复
给你一段,因为是自己写的,所以不敢保证是不是最好方法.但我已经想到没办法好想了:)

'全局声明:
Dim IdxMax() As Boolean '标致着在下标范围内的Winsock控件是否存在

开始监听连接
WsckServer(0).LocalPort = TxtPort.Text
WsckServer(0).Listen
TimeStatus.Enabled = True
'----------------------------------------
Private Sub Form_Load()
ReDim IdxMax(0)
IdxMax(0) = True '第一个的侦听用的.一定存在
End Sub

Private Sub TimeStatus_Timer() '这个Timer控件设得慢点也没关系

Dim i As Integer, n As Integer
Static MaxConnect As Integer

If WsckServer.UBound = 0 Then Exit Sub
On Error Resume Next '前一个控件可能已经Unload了,但这里循环还是会调用到它
For i = 0 To WsckServer.UBound
DoEvents '就算转让控制权也没关系
If WsckServer(i).State = sckError Or WsckServer(i).State = sckClosing _
Or WsckServer(i).State = sckClosed Then '顺便把"关闭"中的都判断了

WsckServer(i).Close
Unload WsckServer(i)
IdxMax(i) = False
Else
n = n + 1
End If
Next

If MaxConnect < UBound(IdxMax) Then MaxConnect = UBound(IdxMax)
Text1(0).Text = CStr(MaxConnect)
Text1(1).Text = CStr(n - 1) '活动连接

On Error GoTo 0
End Sub

Private Sub WsckServer_ConnectionRequest(Index As Integer, ByVal requestID As Long)

Dim i As Integer, AcceptIdx As Integer
AcceptIdx = 0

If Index = 0 Then
For i = 0 To UBound(IdxMax) '寻找标致数组空闲的
If IdxMax(i) = False Then
AcceptIdx = i
Exit For
End If
Next
'注意:当上面循环找到合适的Index以后,下面的判断都会不成立
If WsckServer.UBound = 0 Then '处理第一次连接
AcceptIdx = 1
ReDim IdxMax(AcceptIdx) '在所有客户都断开了连接后,活动连接为:0 时,
IdxMax(0) = True '再有新客户的连接,标致数组复位了

ElseIf AcceptIdx = 0 Then '在标致数据中找不到空闲的
AcceptIdx = UBound(IdxMax) + 1
ReDim Preserve IdxMax(AcceptIdx)
End If

Load WsckServer(AcceptIdx)
WsckServer(AcceptIdx).LocalPort = 0
WsckServer(AcceptIdx).Accept requestID
IdxMax(AcceptIdx) = True '标记,该index在控件数组中存在了
End If
End Sub
zyg0 2005-04-18
  • 打赏
  • 举报
回复
你采用timmer没错
应该这样写 时间最好是4秒
Private Sub Timer1_Timer()
if clientsocket.state<>7 then
clientsocket.close
clientsocket.Connect clientsocket.RemoteHost, clientsocket.RemotePort
end if
end sub

这个 Winsock1(0)你把 Winsock1控件的index属性在属性框设置成0就行了
该死的tab健,老添乱
zyg0 2005-04-18
  • 打赏
  • 举报
回复
你采用timmer没错
应该这样写
Private Sub Timer1_Timer()

clientsocket.Connect clientsocket.RemoteHost, clientsocket.RemotePort
end sub
zyg0 2005-04-18
  • 打赏
  • 举报
回复
你采用timmer没错
应该这样写
Private Sub Timer1_Timer()

clientsocket.Connect clientsocket.RemoteHost, clientsocket.RemotePort
end sub
kw123 2005-04-18
  • 打赏
  • 举报
回复
关于http://community.csdn.net/Expert/topic/3907/3907432.xml?temp=.4553186
影子大哥代码的分解得到
Private intMax As Long 'winsock最大的下标

Private Sub Form_Load()
intMax = 0
Winsock1(0).LocalPort = 7699 '本地监听的端口
Winsock1(0).Listen

在程序当中,服务器端采用的是以上的设置!由于初次使用,不知道你的winsock1的类似数组如何定义,如何定义啊?
将winsock1的index改动成5后在程序运行后出现
run-time error '438'
Object does't support this property or method
对话框提示


是什么原因啊?





当断开的时候(客户端要自动 连接)
我的程序在定时器当中写下
clientsocket=======winsock1
Private Sub Timer1_Timer()
On Error Resume Next
clientsocket.Connect clientsocket.RemoteHost, clientsocket.RemotePort
end sub
当没有连接(服务器没有开启的时候触发clientsocket_Error)
CancelDisplay = False
clientsocket.Close
Timer1.Enabled = True
Label3.Caption = "等待连接"
Comm2.Caption = "连接"
但是提示一个对话框:
connection is forcefull rejectes
如何屏蔽掉啊
加载更多回复(1)

1,502

社区成员

发帖
与我相关
我的任务
社区描述
VB 网络编程
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧