前言:因为希望写一个相对高效率,且不需要用户界面的服务器端,所以准备在无窗体情况下使用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,想说爱你不容易啊~~~~ 哭~~~~~ 暴走中~~~~~

解决方案 »

  1.   

    好象没有窗体的时候winsock不能用数组
    我以前也是想做成无窗体的
    但最后还是加了一个隐藏的窗体,强奸了,郁闷!
      

  2.   

    chewinggum(口香糖·dotnet转型中) 
    bluesky23(乐天(我一直在努力)) 
    如果用加入窗体的方式,我就算Form1.Visible = False、Form1.Enabled = False服务器端也会不响应ConnectionRequest事件了!
      

  3.   

    没有此问题
    问题主要出在你的技术问题上 我给你找个例程 给个email我们现在每天都在用 vb+winsock 
    还是很好用的
      

  4.   

    我也要谢谢  [email protected]
      

  5.   

    楼主的程序我怎么越看越觉得有问题啊
    你在Wsk控件是在窗体上的吗?那么在类中怎么会有控件数组的事件,
      

  6.   

    //而且由于无窗体程序在执行完Sub Main部分后会自动结束,目前也没有什么好的方法。做过C++的Hello World就知道有什么方法解决了...
      

  7.   

    我用.net写了个无窗体的socket后端服务器,是windows service类型程序,365天工作.而我的前端早期是用vb6写的,同样工作的很好。
      

  8.   

    Winsock的非堵塞模式是需要Windows的窗口系统配合的,所以必须要由一个窗口(隐藏的也行)一般意义上的无窗口服务端用的是Winsock的堵塞模式,必须一个连结一个线程。而VB6语法上不支持多线程,所以VB的Winsock控件被设计成只使用非堵塞模式
    你有两个选择:
    A:用一个隐藏的窗口
    B:换其他编程工具写
      

  9.   

    liul17(vb无极) 我的Mail:[email protected]
      

  10.   

    LGYAN(紫衣随想) 
    没有使用窗体!!!
      

  11.   

    楼主既然没有使用窗体,那么我就纳闷了?你在类中怎么会有WinSock控件数组的事件
      

  12.   

    //楼主既然没有使用窗体,那么我就纳闷了?你在类中怎么会有WinSock控件数组的事件他可能是使用了隐藏的窗体。
      

  13.   

    LGYAN(紫衣随想) 
    楼主既然没有使用窗体,那么我就纳闷了?你在类中怎么会有WinSock控件数组的事件Module:
    Option Explicit
    Public Const MaxLinkers = 25
    Public Wsk(25) As New Winsock
    Dim cls As New Class1你们都没看代码吗????
      

  14.   

    这个和VB有什么关系,明明就是楼主的程序有问题啊。
    楼上的说的轻巧话,用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
    就可以自动退出了。还有一些其他的东西,楼主慢慢调试吧,不要一有问题就灰心了,要想办法解决才对。
      

  15.   

    WallesCai(我是老蔡,不是泡菜!) 说的很有道理。
      

  16.   

    服务端接收这里有问题.你应该重新创建一个新的index来实现tcp的握手.
    Wsk(Index).Close
    Wsk(Index).Accept requestID

    i=index+1
    load wsk(i)
    Wsk(i).Accept requestID
    其实winsock控件实际上基本是调用winsock2.0.dll的功能.
    觉得控件不好用,直接用winsock的api吧.
      

  17.   

    VB+Winsock 确实不是好的解决方案。
    对大数据量或实时性要求效高的多客户就显得力不从心了。
      

  18.   

    WallesCai(我是老蔡,不是泡菜!) 说的很有道理。
    说的确是很轻巧的事,如果用VB也用成这样,就算你改用.net,改用VC,改用其他,也不见得你会少哭,一个语言能存在这么长的时间,没必要因为自己不会的一点东西就去否定它吧
      

  19.   

    不用Winsock直接调用dll不行吗?
      

  20.   

    写多任务通讯程序时,不要使用sleep和doevents,否则就会出现无穷的错误隐患。
      

  21.   

    我的 emil :[email protected]
    现在写VB+winsock需要帮助!!!
      

  22.   

    Option ExplicitPrivate Sub Command1_Click()
    '关于窗体
    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
      哪里出错了 请 帮忙解决哦,,