前言:因为希望写一个相对高效率,且不需要用户界面的服务器端,所以准备在无窗体情况下使用Winsock控制件做一个TCP的服务程序。
Class:
Private Sub Class_Initialize()
Wsk(0).LocalPort = 9000
Wsk(0).Listen
End SubPublic Function GetState(Index As Integer) As Long
GetState = Wsk(Index).State
End FunctionPrivate Sub Wsk_ConnectionRequest(Index As Integer, ByVal requestID As Long)
Wsk(Index).Close
Wsk(Index).Accept requestID
End SubPrivate Sub Wsk_DataArrival(Index As Integer, ByVal bytesTotal As Long)
Dim arrbyt() As Byte
Dim strData As String
Wsk(Index).GetData arrbyt, vbArray + vbByte
strData = StrConv(arrbyt, vbUnicode)
DataArrival = strData
Debug.Print strData
SendData Index, "接收成功"
End SubPrivate Sub SendData(Index As Integer, ByVal vstrData As String)
Dim arrbyt() As Byte
arrbyt = StrConv(vstrData, vbFromUnicode)
Wsk(Index).SendData arrbyt
End SubModule:
Option Explicit
Public Const MaxLinkers = 25
Public Wsk(25) As New Winsock
Dim cls As New Class1Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)Private Sub Main()
Dim i As Long
MsgBox cls.GetState(0)
DoEvents
For i = 0 To 300
Sleep 100
Next i
End Sub
注:因为是实验状态,所以只考虑了一个客户端的连接。
编译后运行,客户端能够连接上来,客户端State返回值为7。
客户端SendData后也能激活SendComplete事件。
但是服务器端就是没有响应。
而且由于无窗体程序在执行完Sub Main部分后会自动结束,目前也没有什么好的方法。如果用加入窗体的方式,我就算Form1.Visible = False、Form1.Enabled = False服务器端也会不响应ConnectionRequest事件了!
郁闷~~~~ 心灰意冷~~~~~~ VB,想说爱你不容易啊~~~~ 哭~~~~~ 暴走中~~~~~
Class:
Private Sub Class_Initialize()
Wsk(0).LocalPort = 9000
Wsk(0).Listen
End SubPublic Function GetState(Index As Integer) As Long
GetState = Wsk(Index).State
End FunctionPrivate Sub Wsk_ConnectionRequest(Index As Integer, ByVal requestID As Long)
Wsk(Index).Close
Wsk(Index).Accept requestID
End SubPrivate Sub Wsk_DataArrival(Index As Integer, ByVal bytesTotal As Long)
Dim arrbyt() As Byte
Dim strData As String
Wsk(Index).GetData arrbyt, vbArray + vbByte
strData = StrConv(arrbyt, vbUnicode)
DataArrival = strData
Debug.Print strData
SendData Index, "接收成功"
End SubPrivate Sub SendData(Index As Integer, ByVal vstrData As String)
Dim arrbyt() As Byte
arrbyt = StrConv(vstrData, vbFromUnicode)
Wsk(Index).SendData arrbyt
End SubModule:
Option Explicit
Public Const MaxLinkers = 25
Public Wsk(25) As New Winsock
Dim cls As New Class1Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)Private Sub Main()
Dim i As Long
MsgBox cls.GetState(0)
DoEvents
For i = 0 To 300
Sleep 100
Next i
End Sub
注:因为是实验状态,所以只考虑了一个客户端的连接。
编译后运行,客户端能够连接上来,客户端State返回值为7。
客户端SendData后也能激活SendComplete事件。
但是服务器端就是没有响应。
而且由于无窗体程序在执行完Sub Main部分后会自动结束,目前也没有什么好的方法。如果用加入窗体的方式,我就算Form1.Visible = False、Form1.Enabled = False服务器端也会不响应ConnectionRequest事件了!
郁闷~~~~ 心灰意冷~~~~~~ VB,想说爱你不容易啊~~~~ 哭~~~~~ 暴走中~~~~~
我以前也是想做成无窗体的
但最后还是加了一个隐藏的窗体,强奸了,郁闷!
bluesky23(乐天(我一直在努力))
如果用加入窗体的方式,我就算Form1.Visible = False、Form1.Enabled = False服务器端也会不响应ConnectionRequest事件了!
问题主要出在你的技术问题上 我给你找个例程 给个email我们现在每天都在用 vb+winsock
还是很好用的
你在Wsk控件是在窗体上的吗?那么在类中怎么会有控件数组的事件,
你有两个选择:
A:用一个隐藏的窗口
B:换其他编程工具写
没有使用窗体!!!
楼主既然没有使用窗体,那么我就纳闷了?你在类中怎么会有WinSock控件数组的事件Module:
Option Explicit
Public Const MaxLinkers = 25
Public Wsk(25) As New Winsock
Dim cls As New Class1你们都没看代码吗????
楼上的说的轻巧话,用VC难道就简单了?无窗体的程序更加接近于以前面向过程的编程方法,
主程序
Private Sub Main()
Dim i As Long
MsgBox cls.GetState(0)
DoEvents
For i = 0 To 300 '这个循环基本就不能接收到外部的事件
Sleep 100
Next i
End Sub
改为:
Private Sub Main()
Dim i As Long
MsgBox cls.GetState(0)
For i = 0 To 300
Sleep 100
DoEvents '响应事件
Next i
End Sub
这是第一个地方。还有一个地方:For i = 0 To 300
这样的话,你的程序最多也就能运行30秒,建议你使用DO循环,假设设置一个全局变量Quit,通过Wsk_DataArrival事件中接收到的内容来控制跳出循环。
比如当接收到“end”字符串的时候就Quit=True,
将DO循环写成:
Do While Not Quit
Sleep 100
DoEvents
loop
就可以自动退出了。还有一些其他的东西,楼主慢慢调试吧,不要一有问题就灰心了,要想办法解决才对。
Wsk(Index).Close
Wsk(Index).Accept requestID
改
i=index+1
load wsk(i)
Wsk(i).Accept requestID
其实winsock控件实际上基本是调用winsock2.0.dll的功能.
觉得控件不好用,直接用winsock的api吧.
对大数据量或实时性要求效高的多客户就显得力不从心了。
说的确是很轻巧的事,如果用VB也用成这样,就算你改用.net,改用VC,改用其他,也不见得你会少哭,一个语言能存在这么长的时间,没必要因为自己不会的一点东西就去否定它吧
现在写VB+winsock需要帮助!!!
'关于窗体
frmAbout.Show
End Sub
Private Sub Command2_Click()
If Winsock1.State = sckConnected Then '连接状态 Winsock1.SendData Trim(Textsend.Text) '发送数据
Textsend.Text = ""
Else
MsgBox "无网络连接"
End If
End SubPrivate Sub Form_Load()
Winsock1.LocalPort = 1002 '指定端口
'开始监听1001端口
Winsock1.Listen
frmclient.Show
End SubPrivate Sub Textsent_Change()
Winsock1.SendData Textsent.Text
End SubPrivate Sub Winsock1_ConnectionRequest(ByVal requestID As Long)
If Winsock1.State <> sckClosed Then '判断关闭状态
Winsock1.Close '关闭winsock控件
End If
'接收客户端连接
Winsock1.Accept requestID
End SubPrivate Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
Dim sdata As String
'收到信息
Winsock1.GetData sdata
'添加数据到数据库
Listshow.Text = sdata
End SubPrivate Sub Winsock1_Error(ByVal Number As Integer, Description As String, ByVal Scode As Long, ByVal Source As String, ByVal HelpFile As String, ByVal HelpContext As Long, CancelDisplay As Boolean)
MsgBox "错误代码:" & CStr(Number) & "错误描述:" & Description
End Sub
哪里出错了 请 帮忙解决哦,,