To gz284596265 关于第一点我首先尝试了如下代码:Winsock1.connect do until winsock1.State=7 sleep(1000)'之前已经API声明 loop结果是一直程序在等待,后来尝试使用timer则成功,具体原因我不明。关于第二点.... 这个方法显然是不行,我不能预知会有多少连接请求,并且按照这种方法,显然对于资源是比较浪费的。而且要使用这个方法不仅需要能够预见客户数量,还需要客户数量比较少。例如已知会有200个客户机,那么这种方法也是不现实去操作的。(一旦需要修改的话,那么工程量也是巨大的)
第一个我已经OK了,实现方法和你的一样,timer里面大致代码如下if winsock.state=7 then timer.enable=false '传输数据 elseif winsock.state=6 then exit sub else '连接服务端 end if第二个么....我百度了很久,也找到一些例子,不过水平有限,实在看不懂..
这是因为这个代码把CPU都耗在了循环上,没有时间处理Window消息,而VB的Winsock是基于Window消息通知的,所以,要把处理权交给Window的消息机制,简单来说就是加上DoEvents. Winsock1.connect do until winsock1.State=7 DoEvents loop
针对你的第二个问题可以在服务器端建立winsock控件数组。不同的客户端对不同的winsock进行独立连接和数据传输。
至于你的第三个问题我理解为你为了防止重复发送连接请求,如果你第二个问题解决了第三个问题就很好解决。你在客户端请求连接的前面加上winsock的状态属性作为条件。如果winsock.satae<>7 则执行连接请求
第四个问题不了解不好意思。
首先很感谢你的答复关于第一点,我觉得你的想法应该是正确的,ActiveX控件的线程与VB本身并不同步,也许是执行好连接动作之后,VB则开始发送数据,此时连接并未建立成功。所以我在connect之后加入了sleep,可我发现结果是一样的(我最长测试的休眠20秒,还是这个结果),既然ActiveX控件不与VB同步执行,那么VB程序休眠长达20连接依旧失败,这是什么原因?(还是我理解上有错误?)
第二点:我查找过一些资料,大致含义是建立一个index=0的winsock数组控件作为种子,当有连接请求到winsock(index=0)时,通过load得到一个winsock(n)的数组控件再与请求的连接沟通,当有下一个请求时,相同的方法load一个winsock(n)(n=n+1),如果上面的我没理解错的话,我也有些问题:
1.当客户1(client1)连接到server(服务端)的winsock(0),winsock(0)收到请求,并且load一个winsock(1),那么此时client1请求的信息假如为:RemoteHost = "127.0.0.1",RemotePort = 2046
那么载入的winsock(1)应该怎么设置属性?(若同样使用LocalPort = 2046,会冲突)并且client1的请求已经被server端的winsock(0)收到,又怎么让client1连接到我载入的winsock(1)上呢?
至于第二个问题我想知道你的客户端数量是不是有限的。或者你可以自己先做个实验。比如自己假设客户端就只有10个 ,你就采用最笨的办法 直接在服务器端放一个winsock1的控件数组 然后为他们设置不同的端口号。记住一定要不同的端口号。然后客户端再根据端口号进行不同的连接请求,这样肯定不会冲突。这时你就会发现每个客户端连接的winsokc(i)都是独立的 他们之间没有联系。连接和断开都是独立的,这样做是很好操作的,但是有个缺点就是必须是客户端是有限的。
关于第一点我首先尝试了如下代码:Winsock1.connect
do until winsock1.State=7
sleep(1000)'之前已经API声明
loop结果是一直程序在等待,后来尝试使用timer则成功,具体原因我不明。关于第二点....
这个方法显然是不行,我不能预知会有多少连接请求,并且按照这种方法,显然对于资源是比较浪费的。而且要使用这个方法不仅需要能够预见客户数量,还需要客户数量比较少。例如已知会有200个客户机,那么这种方法也是不现实去操作的。(一旦需要修改的话,那么工程量也是巨大的)
显然第一点你没有懂我的意思
我的意思你用timer去监控客户端winsock的状态, 你看看你执行连接请求以后看看winsock是否连接成功 而不是连接成功以后再去延时 ,timer主要功能是给出winsokc的状态,让你知道他是否连接成功
如果连接成功以后再执行数据发送代码肯定是不会错的。
第二点你按照你的方法也可以 因为我以前做的都是局域网里面的 能预知用户数量的的 按照你的方法是否需要将服务器端的端口设置成一致我没有研究过。但是我敢肯定的的是设置成不同的端口肯定可以。设置成同一个端口行不行我就没有深究。
timer.enable=false
'传输数据
elseif winsock.state=6 then
exit sub
else
'连接服务端
end if第二个么....我百度了很久,也找到一些例子,不过水平有限,实在看不懂..
这是因为这个代码把CPU都耗在了循环上,没有时间处理Window消息,而VB的Winsock是基于Window消息通知的,所以,要把处理权交给Window的消息机制,简单来说就是加上DoEvents.
Winsock1.connect
do until winsock1.State=7
DoEvents
loop