我用TCP协议编写了一个服务端和一个客户端,但每次客户端和服务端建立联系后,第二次再使用客户端连接服务器时就无法连接,需重新启动服务端后才能够重新连接,请教高手解决,代码如下:
客户端
Private Sub Command1_Click()
Winsock1.Connect
End Sub
Private Sub Command2_Click()
Winsock1.Close
End
End SubPrivate Sub Command3_Click()
Text3.Text = "t1"
Winsock1.SendData Text3.Text
Text3.Text = ""
End SubPrivate Sub Command5_Click()
Text4.Text = "t4"
Winsock1.SendData Text4.Text
Text4.Text = ""
End SubPrivate Sub Form_Load()
Winsock1.RemotePort = 10010
Winsock1.RemoteHost = "192.168.255.194"
End SubPrivate Sub Form_Unload(Cancel As Integer)
Winsock1.Close
End SubPrivate Sub Text1_Change()
Winsock1.RemoteHost = Text1.Text
End SubPrivate Sub Winsock1_Close()
Winsock1.Close
End SubPrivate Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
Dim js As String
Winsock1.GetData js, vbString
Text2.Text = js
End SubPrivate Sub Text2_Change()
Select Case Text2.Text
Case "h1"
Shape1.BackColor = &HFF&
Text2.Text = ""
Case "t1"
Shape2.BackColor = &HFF&
Text2.Text = ""
Case "t2"
Shape3.BackColor = &HFF&
Text2.Text = ""
End Select
End Sub服务端
Private Sub Command1_Click()
Winsock1.SendData Text1.Text
End SubPrivate Sub Command2_Click()
Text2.Text = ""
End SubPrivate Sub Form_Load()
Text1.Visible = False
Text2.Visible = False
Winsock1.LocalPort = 10010
Winsock1.Listen
End SubPrivate Sub Winsock1_Close()
Winsock1.Close
End SubPrivate Sub Winsock1_ConnectionRequest(ByVal requestID As Long)
Text1.Visible = True
Text2.Visible = True
If Winsock1.State <> sckClosed Then Winsock1.Close
Winsock1.Accept requestID
End SubPrivate Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
Dim js As String
Winsock1.GetData js, vbString
Text2.Text = js
End SubPrivate Sub Text2_Change()
If Len(Text2.Text) = 2 Then
Select Case Text2.Text
Case "h1"
Shape1.BackColor = &HFF&
Case "t1"
Shape2.BackColor = &HFF&
Case "t2"
Shape3.BackColor = &HFF&
Case "t3"
Shape1.BackColor = &HFF00&
Case "t4"
Shape2.BackColor = &HFF00&
Case "a8"
Shape4.BackColor = &HFF&
Case "a0"
Shape4.BackColor = &HFF00&
End Select
Text2.Text = ""
End If
End Sub

解决方案 »

  1.   

    即服务端至少要两个 Winsock,一个负责 Listen,一个在 Accept 后负责与客户端通讯。
    否则你将唯一一个做通讯去了,以后的连接请求就侦听不到了。
      

  2.   

    用sock数组解决您的问题鉴定完毕...
      

  3.   

    Tiger_Zhao 我已经明白你的意思,具体实现方法能不能把代码贴出来看看,谢谢!
      

  4.   

    服务器端的主要代码如下:Private Sub Form_Load()
        Me.wskListen.Bind 9999, "127.0.0.1"
        Me.wskListen.Listen
    End SubPrivate Sub Form_Unload(Cancel As Integer)
        For i = 0 To Me.wskServer.UBound
            wskServer(i).Close
        Next
        wskListen.Close
    End SubPrivate Sub wskListen_ConnectionRequest(ByVal requestID As Long)
        For i = 0 To Me.wskServer.UBound
            If Me.wskServer(i).State = sckClosed Then
                Me.wskServer(i).Accept requestID
                MsgBox i
                Exit Sub
            End If
        Next
        Load wskServer(i)
        wskServer(i).Accept requestID
        MsgBox i
    End SubPrivate Sub wskServer_Close(Index As Integer)
        wskServer(Index).Close
    End SubPrivate Sub wskServer_DataArrival(Index As Integer, ByVal bytesTotal As Long)
        '处理数据接收
    End Sub
      

  5.   

    修正后如下:Private Sub Form_Load()
        Me.wskListen.Bind 9999, "127.0.0.1"
        Me.wskListen.Listen
    End SubPrivate Sub Form_Unload(Cancel As Integer)
        For i = Me.wskServer.UBound To 1 Step -1
            wskServer(i).Close
            Unload wskServer(i)
        Next
        wskServer(0).Close
        wskListen.Close
    End SubPrivate Sub wskListen_ConnectionRequest(ByVal requestID As Long)
        For i = 0 To Me.wskServer.UBound
            If Me.wskServer(i).State = sckClosed Then
                Me.wskServer(i).Accept requestID
                Exit Sub
            End If
        Next
        Load wskServer(i)
        wskServer(i).Accept requestID
    End SubPrivate Sub wskServer_Close(Index As Integer)
        wskServer(Index).Close
    End SubPrivate Sub wskServer_DataArrival(Index As Integer, ByVal bytesTotal As Long)
        '处理数据接收
    End Sub
      

  6.   

    wskServer.UBound
    这个数组没有值,找不到方法数据!~~~~~
      

  7.   

    在设计时,设置wskServer的Index属性值为0。