代码如下:
Private Sub cmdFs_Click()
If XZ = 1 Then
    If txtFs.Text = "" Then
       MsgBox "请输入信息......", vbCritical, "提示"
    Else
    On Error Resume Next
       Wsk1.SendData txtFs.Text
       txtJs.Text = vbCrLf & txtJs.Text & "我说:" & txtFs.Text
       txtFs.Text = ""
     If Err Then
      End ' handle the error here
     End If
    End If
Else
    Wsk2.RemoteHost = frmJm.txtIP.Text
    Wsk2.RemotePort = frmJm.txtYDK.Text
    'Wsk2.Bind Wsk2.LocalPort
    If txtFs.Text = "" Then
        MsgBox "请输入信息......", vbCritical, "提示"
    Else
     On Error Resume Next
       Wsk2.SendData txtFs.Text
       txtJs.Text = txtJs.Text + vbCrLf + CStr(Date) + Chr(32) + CStr(Time$()) + vbCrLf & TxtNc & ":" & txtFs.Text
       txtFs.Text = ""
     If Err Then
      End ' handle the error here
     End If
    End If
End If
End Sub
Private Sub Form_Unload(Cancel As Integer)
   If sckconnect.State <> sckClosed Then
     sckconnect.Close
   End If
End SubPrivate Sub FWD_Click()
   XZ = 1
   frmJm.Show
   frmJm.Caption = "服务端连接"
   frmJm.Label1.Caption = "服务端IP"
   frmJm.Label2.Visible = False
   frmJm.txtYDK.Visible = False
   Wsk1.Protocol = sckTCPProtocol
End SubPrivate Sub KHD_Click()
   XZ = 2
    frmJm.Show
    frmJm.Caption = "客户端连接"
    frmJm.Label1.Caption = "服务端IP"
    Wsk2.Protocol = sckUDPProtocol
End SubPrivate Sub TC_Click()
    If Wsk1.State <> sckClosed Then
         Wsk1.Close
         Wsk1.Accept requestID
    End If
    End
End SubPrivate Sub Timer1_Timer()
  Select Case Wsk1.State
         Case 0
            Label1.Caption = "关闭"
         Case 1
            Label1.Caption = "打开"
         Case 2
            Label1.Caption = "侦听"
         Case 5
            Label1.Caption = "以识别主机"
         Case 6
            Label1.Caption = "正在连接 "
         Case 7
            Label1.Caption = "已连接"
         Case 9
            Label1.Caption = "错误"
  End Select
End SubPrivate Sub wsk1_ConnectionRequest(ByVal requestID As Long)
    If Wsk1.State <> sckClosed Then
         Wsk1.Close
         Wsk1.Accept requestID
    End If
End SubPrivate Sub wsk1_DataArrival(ByVal bytesTotal As Long)
   Dim Js As String
   Wsk1.GetData Js, vbString
   txtJs.Text = txtJs.Text & "对方说:" & Js & vbCrLf
End Sub
Private Sub wsk2_DataArrival(ByVal bytesTotal As Long)
   Dim Js As String
   Wsk2.GetData Js, vbString
   txtJs.Text = txtJs.Text & "对方说:" & Js & vbCrLf
End Sub
--------------
程序图片:--------------------------------------------------------------------------------------------------------------
搞不清楚到底是在那里错拉   老是在发送信息那里卡住,连接没有问题   很晕

解决方案 »

  1.   

    代码如下:
    Private Sub cmdFs_Click()
    If XZ = 1 Then
        If txtFs.Text = "" Then
           MsgBox "请输入信息......", vbCritical, "提示"
        Else
           Wsk1.SendData txtFs.Text
           txtJs.Text = txtJs.Text + vbCrLf + CStr(Date) + Chr(32) + CStr(Time$()) + vbCrLf & TxtNc & ":" & txtFs.Text
           txtFs.Text = ""
        End If
    Else
        Wsk2.RemoteHost = frmJm.txtIP.Text
        Wsk2.RemotePort = frmJm.txtYDK.Text
        If txtFs.Text = "" Then
            MsgBox "请输入信息......", vbCritical, "提示"
        Else
           Wsk2.RemoteHost = frmJm.txtIP.Text
           Wsk2.RemotePort = frmJm.txtYDK.Text
           Wsk2.SendData txtFs.Text
           txtJs.Text = txtJs.Text + vbCrLf + CStr(Date) + Chr(32) + CStr(Time$()) + vbCrLf & TxtNc & ":" & txtFs.Text
           txtFs.Text = ""
        End If
    End If
    End Sub
    Private Sub Form_Unload(Cancel As Integer)
       If Wsk1.State <> sckClosed Then
         Wsk1.Close
       End If
       If Wsk2.State <> sckClosed Then
         Wsk2.Close
       End If
    End SubPrivate Sub FWD_Click()
       XZ = 1
       frmJm.Show
       frmJm.Caption = "服务端连接"
       frmJm.Label1.Caption = "服务端IP"
       frmJm.Label2.Visible = False
       frmJm.txtYDK.Visible = False
       Wsk1.Protocol = sckTCPProtocol
    End SubPrivate Sub KHD_Click()
       XZ = 2
        frmJm.Show
        frmJm.Caption = "客户端连接"
        frmJm.Label1.Caption = "服务端IP"
        Wsk2.Protocol = sckUDPProtocol
    End SubPrivate Sub TC_Click()
       If Wsk1.State <> sckClosed Then
         Wsk1.Close
       End If
       If Wsk2.State <> sckClosed Then
         Wsk2.Close
       End If
        End
    End SubPrivate Sub Timer1_Timer()
      Select Case Wsk1.State
             Case 0
                Label1.Caption = "关闭"
             Case 1
                Label1.Caption = "打开"
             Case 2
                Label1.Caption = "侦听"
             Case 5
                Label1.Caption = "以识别主机"
             Case 6
                Label1.Caption = "正在连接 "
             Case 7
                Label1.Caption = "已连接"
             Case 9
                Label1.Caption = "错误"
      End Select
    End Sub
    Private Sub Timer2_Timer()
      Select Case Wsk2.State
             Case 0
                Label1.Caption = "关闭"
             Case 1
                Label1.Caption = "打开"
             Case 2
                Label1.Caption = "侦听"
             Case 5
                Label1.Caption = "以识别主机"
             Case 6
                Label1.Caption = "正在连接 "
             Case 7
                Label1.Caption = "已连接"
             Case 9
                Label1.Caption = "错误"
      End Select
    End SubPrivate Sub wsk1_ConnectionRequest(ByVal requestID As Long)
        If Wsk1.State <> sckClosed Then
             Wsk1.Close
             Wsk1.Accept requestID
        End If
    End SubPrivate Sub wsk1_DataArrival(ByVal bytesTotal As Long)
       Dim Js As String
       Wsk1.GetData Js, vbString
       txtJs.Text = txtJs.Text + vbCrLf + CStr(Date) + Chr(32) + CStr(Time$()) + vbCrLf & "对方:" & Js
    End Sub
    Private Sub wsk2_DataArrival(ByVal bytesTotal As Long)
       Dim Js As String
       Wsk2.GetData Js, vbString
       txtJs.Text = txtJs.Text + vbCrLf + CStr(Date) + Chr(32) + CStr(Time$()) + vbCrLf & "对方:" & Js
    End Sub
    --------------------------------------------
    上面是主窗口的,下面的代码是连接窗口的
    --------------------------------------------
    Private Sub cmdLj_Click()
         If XZ = 1 Then
             If txtIP.Text = "" Then
               MsgBox "请输入服务IP地址......", vbCritical, "提示"
             ElseIf txtBDK.Text = "" Then
               MsgBox "请输入本地端口......", vbCritical, "提示"
             Else
               frmZJM.Wsk1.LocalPort = txtBDK.Text
               frmZJM.Wsk1.Listen
             End If
             frmZJM.Timer1.Enabled = True
             Me.Hide
         Else
            If txtIP.Text = "" Then
               MsgBox "请输入服务IP地址......", vbCritical, "提示"
            ElseIf txtYDK.Text = "" Then
               MsgBox "请输入服务端口......", vbCritical, "提示"
            ElseIf txtBDK.Text = "" Then
               MsgBox "请输入本地端口......", vbCritical, "提示"
            Else
               frmZJM.Wsk2.RemoteHost = txtIP.Text
               frmZJM.Wsk2.RemotePort = txtYDK.Text
               frmZJM.Wsk2.LocalPort = txtBDK.Text
               'frmZJM.Wsk2.Bind frmZJM.Wsk2.LocalPort
               frmZJM.Wsk2.Connect
            End If
            Me.Hide
            frmZJM.Timer2.Enabled = True
            MsgBox (frmZJM.Wsk2.LocalPort)
            MsgBox (frmZJM.Wsk2.RemotePort)
            MsgBox (frmZJM.Wsk2.RemoteHost)
         End If
        cmdLj.Enabled = False
    End SubPrivate Sub Form_Load()
        txtIP.Text = frmZJM.Wsk1.LocalIP
        txtYDK.Text = 2110
        txtBDK.Text = 2110
    End Sub
    ------------------------------------------------
    好像不能发图,晕,希望各位帮我看一下
      

  2.   

    注意你的协议 如果采用tcp 就不要udp  Wsk1.Protocol = sckTCPProtocol  Wsk2.Protocol = sckUDPProtocol
      

  3.   

    楼主代码有问题,我估计你想用UDP协议,但又把用TCP协议时的代码copy 过来了,如果你是想用UDP协议,那么发生10054错误出现在 Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
    里面的这一句
    Winsock.GetData sRecv在前面加上 On Error Resume Next 就好了本来UDP协议是无连接协议,按理说不应该出现“关闭连接”之类的错,但是微软说了,这个一个bug,是因为ICMP导致的