1)Command1:退出按钮;   (2)textsend:发送数据文本框;   (3)Winsockserver: 服务器Winsock;   (4)textget :接收数据文本框。   服务器程序的界面如图所示。   服务器程序的源代码如下:   Private Sub Command1_Click()    End   End Sub      Private Sub Form_Load()    textsend.Visible = False    textget.Visible = False    Winsockserver.LocalPort = 1001    Winsockserver.Listen   End Sub      Private Sub textsend_Change()    Winsockserver.SendData textsend.Text   End Sub      Private Sub Winsockserver_Close()    Winsockserver.Close    End   End Sub      Private Sub Winsockserver_ConnectionRequest(ByVal requestID As Long)    textsend.Visible = True    textget.Visible = True    If Winsockserver.State <> sckClosed Then Winsockserver.Close    Winsockserver.Accept requestID   End Sub      Private Sub Winsockserver_DataArrival(ByVal bytesTotal As Long)    Dim tmpstr As String    Winsockserver.GetData tmpstr    textget.Text = tmpstr   End Sub   客户机程序使用的控件如下:   (1)Command1:退出按钮;   (2)Command2:连接按钮;   (3)Winsockclient:客户Winsock;   (4)Text1:主机名文本框;   (5)Textsend:发送数据文本框;   (6)Textget:接收数据文本框;   客户机程序的界面如图所示。   客户机程序的源代码如下:   Private Sub Command1_Click()    End   End Sub      Private Sub Command2_Click()    Winsockclient.Connect   End Sub      Private Sub Form_Load()    textsend.Visible = False    textget.Visible = False    Winsockclient.RemotePort = 1001    Winsockclient.RemoteHost = "sccdsz"   End Sub      Private Sub Text1_Change()    Winsockclient.RemoteHost = Text1.Text   End Sub      Private Sub textsend_Change()    Winsockclient.SendData textsend.Text   End Sub      Private Sub Winsockclient_Close()    Winsockclient.Close    End   End Sub      Private Sub winsockclient_Connect()    textsend.Visible = True    textget.Visible = True    Command2.Visible = False   End Sub      Private Sub winsockclient_DataArrival(ByVal bytesTotal As Long)    Dim tmpstr As String    Winsockclient.GetData tmpstr    textget.Text = tmpstr   End Sub

解决方案 »

  1.   

    服务端:添加一个winsock控件(名为:sckserver),一个text控件(名为text1)用来显示接收到的信息。代码如下:
    Private Sub form_Load()
      With Me
        .SckServer(0).LocalPort = 1001  '本地端口
        .SckServer(0).Listen '开始监听
      End With
    End SubPrivate Sub Form_Unload(Cancel As Integer)
    Dim i As Long
    For i = 1 To SckServer.Count - 1
        If SckServer(i).State = 7 Then
            SckServer(i).Close
        End If
    Next
    SckServer(0).CloseEnd SubPrivate Sub SckServer_Close(Index As Integer)
    Me.SckServer(Index).Close
    Me.SckServer(Index).Tag = ""
    End SubPrivate Sub sckServer_ConnectionRequest(Index As Integer, ByVal requestID As Long)
    Dim i As Long, l As Boolean, cou As Long, flag As Long
    cou = 0
    For i = 1 To Me.SckServer.Count - 1
        If Me.SckServer(i).State = 0 And Not l Then
            Me.SckServer(i).Accept (requestID)
            flag = i
            l = True
        Else
            cou = cou + 1
        End If
    Next
    If Not l Then
        i = Me.SckServer.Count
        Load Me.SckServer(i)
        flag = i
        Me.SckServer(i).Accept (requestID)
    End IfEnd Sub
    Private Sub sckServer_DataArrival(Index As Integer, ByVal bytesTotal As Long)
    Dim strData As String
    SckServer(Index).GetData strData
    Text1.Text = strData
    End If
    End SubPrivate Sub SckServer_Error(Index As Integer, 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)
    Call SckServer_Close(Index)
    End Sub
    客户端:添加一个winsock控件(名为sckclient),添加2个text控件(名为text1和text2),text1用来显示是否和服务器连接成功的信息,TEXT2则用来写发送到服务端的信息,2个command按钮控件(名为command1和command2)command1用来发送信息到服务端,command2则为退出.Private Sub form_Load()
      With Me
        .sckClient.RemoteHost = "192.168.0.46" '设置远程IP,本例设为本机。
        .sckClient.RemotePort = 1001 '远程端口,就为server中的设置一样.
      End With
      sckClient.Connect
      Text1.Text = "正在测试连接....."
    End SubPrivate Sub Form_Unload(Cancel As Integer)
    If Me.sckClient.State = 7 Then Me.sckClient.Close
     ' sckClient.SendData "QUIT"
    End Sub
    Private Sub Command1_Click()
    sckclient.sendata text2.text
    End Sub
    Private Sub Command2_Click()
    end
    End SubPrivate Sub sckClient_Close()
    sckClient.Close
    Text1.Text = "服务器未开启"
    End SubPrivate Sub sckClient_Connect()
    Text1.Text = "连接成功"
    End SubPrivate Sub sckClient_ConnectionRequest(ByVal requestID As Long)
      With Me
        If .sckClient.State <> sckClosed Then .sckClient.Close
        .sckClient.Accept (requestID)
    End With
    End SubPrivate Sub sckClient_DataArrival(ByVal bytesTotal As Long)
    On Error Resume Next
    Dim strData As String
    sckClient.GetData strData
    Text1.Text = strData
    End SubPrivate Sub sckClient_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)
    Call sckClient_Close
    End Sub本代码经过测试~~绝对没问题~~
      

  2.   

    msdn中的winsock空间的说明中有1个tcp的离子 服务器只要有固定ip就可以使用在互联网上
      

  3.   

    你没看到我的代码的客户端里的这段代码吗?服务端也有的~~
    Private Sub sckClient_DataArrival(ByVal bytesTotal As Long)
    On Error Resume Next
    Dim strData As String
    sckClient.GetData strData
    Text1.Text = strData
    End Sub
    这段代码就是接收信息的~~
    text1.text=strdata是显示接收到的数据~~接收到信息后具体怎样做就要看你要实现什么功能了~
      

  4.   

    而客户端里的command1按钮就用来发送信息的~~也就是说我的代码里的客户端既可以发信息也可以接收信息~~就是这个机器即使客户机又是服务器
      

  5.   

    服务端这里
    Private Sub sckServer_DataArrival(Index As Integer, ByVal bytesTotal As Long)
    Dim strData As String
    SckServer(Index).GetData strData
    Text1.Text = strData
    End If
    End Sub这里的text1.text=strdata下面你可以加一句
    sckserver.sendata "OK"就是服务端接收到客户端发来的信息后在服务端的TEXT1中显示出来~再向客户端发送"OK"信息
    客户端的TEXT1就会显示"OK"
      

  6.   

    服务端这里
    Private Sub sckServer_DataArrival(Index As Integer, ByVal bytesTotal As Long)
    Dim strData As String
    SckServer(Index).GetData strData
    Text1.Text = strData
    End If
    End Sub
    的end if 这句不要~打多了
      

  7.   

    .SckServer(0).LocalPort = 1001  '本地端口
        .SckServer(0).Listen '开始监听
    好像不太对阿
    Private Sub sckServer_DataArrival(Index As Integer, ByVal bytesTotal As Long)
    Dim strData As String
    SckServer(Index).GetData strData
    Text1.Text = strData
    End If
    End Sub
    这个里面都没有if子句 怎么就end if 呢?
      

  8.   

    又出现一个问题  
    当你关闭服务器端的时候
    Private Sub Form_Unload(Cancel As Integer)
    If Me.sckClient.State = 7 Then Me.sckClient.Close
     ' sckClient.SendData "QUIT"
    End Sub
    Private Sub Command1_Click()
    sckclient.sendata text2.text
    End Sub
    Private Sub Command2_Click()
    end
    End Sub
    会报错  未找到犯方法或数据成员  是不是因为没有定义count
      

  9.   


    我这个是在服务器端编写程序好程序让其运行,运行后什么都不做将其关闭就会报错
    另外我还有一个问题   SckServer(0)中(0)这是什么意思? 不是在服务器端定义了一个winsock控件吗???
      

  10.   

    Dim i As Long
    For i = 1 To SckServer.Count - 1
        If SckServer(i).State = 7 Then
            SckServer(i).Close
        End If
    Next
    这句是什么意思?有这个SckServer.Count方法吗?
    报错的时候说未找到方法或数据成员