现在要做一个程序。 用的WINSOCK控件数组。客户端大概20个左右 客户端通过WINSOCK给服务器端发送消息,服务器接收后将对应的处理结果返回给客户端 现在就是在考虑VB程序一般是单线程的,如果同时接收到多条消息,同时只能处理一个,那剩下后个是怎么处理的? 是不是需要自己将接收的消息进行排序做成一个队列依次交由程序处理?烦请各位前辈指点 另程序中有些结果可能需要通过WINSOCK将服务器端查询数据库的记录集传送到客户端, 想顺一下各位前辈,将记录集转换成BYTE数组的话传输有没有什么问题,或者各位前辈能否指点一下更有效的方式传输! 先谢大家了!
解决方案 »
- 关于 vb 的 ADO 引用问题
- 用VB实现矩阵的计算,满意给100
- 如何得到SHELL被调用程序的句柄?
- MSFlexGrid的内容如何实时刷新
- 怎么用VB做Active控件啊?有没有源代码啊?
- 高手幫忙!50分相送!
- 请各位大虾们进来帮个忙,关于通讯录的问题,
- 请问:怎么实现在MSHFlexGrid或类似功能控件中,将一列数据显示为CheckBox形式?
- 快快,129分求解用UDP做一个服务器,然后有多个用户连接并分别响应!
- 请问如何同时update两个有link关系的表,两个表都有字段要更新!
- checkbox复选框可以打叉吗?
- 是不是所有用3DES加密计算MAC的算法所得出的结果都是一样的呢?
主要是WINSOCK怎么样传输记录集
也就是其余部分被阻塞住了。
所以没有问题。考虑性能,还是用Java、Delphi或者.NET吧
VB6下面可以用Microsoft SOAP Toolkits,非常简单,你可以Google下。
至于事件,可以看成每一个事件的产生都是独立的就可以了。
还有,如果数据量比较大,如超出4K的数据,很可能会分次收到事件,这个即使不是控件数组也是一样的。
所以要做好分步接收数据的处理,如:Type MyWSockReadType
ReadSize As Long
ReadCount As Long
Bytes() As Byte
'... '还可以定义些别的东西来使用
End Type
Dim WSRead() As MyWSockReadType
'...
'这里处理好建立连接和关闭连接什么的过程,注意要处理好数组
'...
Private Sub Winsock1_DataArrival(Index As Integer, ByVal bytesTotal As Long)
Dim RData() As Byte
Dim RDataCound As Long
'读取字节流数据
Winsock1(Index).GetData RData, vbByte, bytesTotal
'判断是否读了数据,主要是区别数组边界的定义过程
If WSRead(Index).ReadCount = 0 Then
ReDim WSRead(Index).Bytes(bytesTotal - 1) '第一次读数据直接定义数组边界
Else
ReDim Preserve WSRead(Index).Bytes(bytesTotal - 1) '多次读数据用扩展方式定义数组范围
End If
'用API函数 CopyMemory 将读到的字节流数据放到要整合数据的数组变量中
CopyMemory WSRead(Index).Bytes(WSRead(Index).ReadCount), RData(0), bytesTotal
'加地质,其实 WSRead(Index).ReadCount 可以不用的,可以直接用 UBound 识别数组范围,但是这样速度会快点。
WSRead(Index).ReadCount = WSRead(Index).ReadCount + bytesTotal
'判断是否已经读完了数据,通过协议里先设置好的 ReadSize 来判断
If WSRead(Index).ReadCount >= WSRead(Index).ReadSize Then
'完成接收任务
WSRead(Index).ReadCount = 0
WSRead(Index).ReadSize = 0
'将数据写到 C 盘上
Dim fs As Integer
fs = FreeFile
Open "C:\Sock" & Index & ".dat" For Binary As #fs
Put #fs, 1, WSRead(Index).Bytes
Close #fs
End If
End Sub
不用,winsock会自动排队,这块会有点操作技巧,自己摸索也用不了多长时间3、另程序中有些结果可能需要通过WINSOCK将服务器端查询数据库的记录集传送到客户端
查询数据库操作不是winsock做的4、将记录集转换成BYTE数组的话传输有没有什么问题
本人都是直接传输的字串,没用过byte
如果由客户机直接连接服务器的数据库那么数据库连接由客户端创建会不会产生安全性的问题?
————————————————
3、另程序中有些结果可能需要通过WINSOCK将服务器端查询数据库的记录集传送到客户端
查询数据库操作不是winsock做的 不是让WINSOCK是操作数据库。只是想让WINSOCK将服务端操作的结果记录集通过WINSOCK传送到客户端。有什么的方法?
如果采用Winsock自己做,那么主要就是逻辑上的问题还有你如何定制你的通讯协议的问题。
如:
1、客户端连接服务器端
2、服务器端接受连接请求,同时创建新的Sock控件组进行侦听
3、C => S COM: SQL 客户端向服务器端发送命令,如"SQL"
4、S => C COM: SIZE 服务器端收到"SQL"命令后向客户端发送"SIZE"命令大小请求
5、C => S Data: 128 客户端将要发送的字符串字节数(128字节)发送给服务器端
6、S => C COM: OK 服务器向客户端发送准备完成的命令,并将得到的将要接收的数据大小存储
7、C => S Bytes: Data 客户端向服务器端发送要查询的SQL语句内容
8、S GET Bytes 服务器收客户端的数据,直到数据达到预定的数据大小,可以参考我8楼说的
9、S => C COM: Count 3 服务器向客户端发送查询到的数据记录数3条
10、C => S COM: SIZE 客户端收到数据记录大小后请求第一条数据的大小
11、S => C Data: 1024 服务器整合纪录里所有的字段到字节数组(待分割符号)然后发送数组大小给C端
12、C => S COM: OK 客户端向服务器发送做好接收准备的命令,等待服务器发送数据
13、C GET Bytes 客户端收服务器的数据,直到数据达到预定的数据大小,可以参考我8楼说的
14、C Execute Process 客户端接收完成后可以将数据结果放到集合中共程序适用.上面知识举例Ado数据集对象的Open方法的过程,还可以在设计 MovNext 方法、Execute 方法...等等过程,这样就可以向ADO一样用了。
没关系,Winsock 不是单线程的,它会进行队列处理。实际上,不可能真正有“同时”发生。在你的网线上,一个时间只能有一个用户的包发过来。关键的问题,是你的服务程序处理的速度如何。
感谢楼上提的意见学习了 晚上另开贴请楼上几位接分 因为程序比较急,所以暂时直接用客户端创建到服务器数据库的连接来进行操作 准备再根据SupermanKing (人类)提供的思路尝试一下用WINSOCK来传输 另外还有个问题想请教一下大家,下面三种方案 1.WEB方式 用ASP做成网站。客户由浏览器查询 2.使用客户端直接连接远程MSSQL数据库操作 3.客户端通过WINSOCK发送消息至服务端。由服务端执行SQL后返回结果给客户端 这三种方案在服务器环境相同的情况下哪一种效率最高?
我现在在学vb.net用多线程来设计C/S程序,很棒!互相无任何干扰,速度快