2014-11-05 170 views
-1

我有客户端和服务器应用程序。Tcp客户端/服务器 - 客户端消息问题

我有客户端断开与服务器client.close通过断开按钮。

我发送消息,在服务器上显示。好的很好。

我断开连接然后重新连接。我发了一条消息。它显示消息两次。

我断开另一个时间然后重新连接。我发了一条消息。然后它显示消息三次。

它正在增加消息并在断开连接后多次发送,然后重新连接。

帮助?一直试图弄清楚这一点,一会儿

[SERVER]

Public Class Server 
Dim Listener As TcpListener 
Dim Client As TcpClient 
Dim ListenerThread As System.Threading.Thread 
Dim ClientID As String 
Dim ClientIP As String 
Dim ClientIPandID As String 
Dim ClientIPandPort As String 
Dim TotalItemCount As String 
Dim clientcount As Integer = 0 

Private Sub Server_Load(sender As Object, e As EventArgs) Handles Me.Load 
    CheckForIllegalCrossThreadCalls = False 

End Sub 

Private Sub ButtonStart_Click(sender As System.Object, e As System.EventArgs) Handles ButtonStart.Click 
    If TextBoxPort.Text = "" Then 
     MsgBox("Please Enter Port To Run On.") 
    Else 

     ListenerThread = New System.Threading.Thread(AddressOf Listening) 
     ListenerThread.IsBackground = True 
     ListenerThread.Start(TextBoxPort.Text) 
     ButtonStart.Enabled = False 
     ButtonStop.Enabled = True 
     ListBox1.Items.Add("[SERVER] Running on Port " + TextBoxPort.Text) 
     ListBox1.Items.Add("[SERVER] Waiting For A Connection...") 
    End If 

End Sub 

Private Sub Listening(ByVal Port As Integer) 

    Try 
     Listener = New TcpListener(IPAddress.Any, Port) 
     Listener.Start() 
     Do 
      Client = Listener.AcceptTcpClient 'Accepts Client Trying To Connect 
      If Client.Connected Then 
       MsgBox("Client Connected") 
      End If 
      clientcount += 1 
      GetClientInfo() 'Retrieves The Clients Info 
      AddHandler ReceivedMessage, AddressOf ReceivedMessage1 
     Loop Until False 
    Catch ex As Exception 
    End Try 
End Sub 
'Events 
Public Event ReceivedMessage(ByVal Command As String) 

Private Sub GenerateClientSessionNumber() 
    Dim r As New Random 
    Dim x As String = String.Empty 
    For i = 0 To 7 
     x &= Chr(r.Next(65, 89)) 
    Next 
    ClientID = x 
End Sub 

Private Sub GetClientInfo() 
    GenerateClientSessionNumber() 
    ClientIPandID = Client.Client.RemoteEndPoint.ToString().Remove(Client.Client.RemoteEndPoint.ToString().LastIndexOf(":")) & " - " & ClientID 
    ClientIP = Client.Client.RemoteEndPoint.ToString().Remove(Client.Client.RemoteEndPoint.ToString().LastIndexOf(":")) 
    ClientIPandPort = Client.Client.RemoteEndPoint.ToString() 
    MsgBox(ClientIPandPort) 
    ListBox2.Items.Add(ClientIPandID) 
    Client.GetStream.BeginRead(New Byte() {0}, 0, 0, AddressOf Reading, Nothing) 
End Sub 

Private Sub ButtonStop_Click(sender As System.Object, e As System.EventArgs) Handles ButtonStop.Click 
    Listener.Stop() 
    Client.Close() 
    ButtonStop.Enabled = False 
    ButtonStart.Enabled = True 
    ListBox1.Items.Add("[SERVER] Server Stopped") 
End Sub 


Private Sub Reading() 
    Try 
     Dim Reader As New StreamReader(Client.GetStream) 

     Dim Command As String = Reader.ReadLine 

     Client.GetStream.BeginRead(New Byte() {0}, 0, 0, AddressOf Reading, Nothing) 
      RaiseEvent ReceivedMessage(command) 
    Catch ex As Exception 
    End Try 
End Sub 



Private Sub ReceivedMessage1(ByVal Command As String) 
    Dim Message() As String = Command.Split("|") 
    If Message(0) = "MESSAGE" Then 
     MsgBox("Message Received From Client " + ">" + Message(1)) 
    End If 
end sub 

[客户端]

Public Class Client 
Dim Client As New TcpClient 
Sub Connect(ByVal ServerIP As String, ByVal Port As Integer) 
    'Try To Make Connection With Server 
    If Client.Connected = True Then 
     MsgBox("Already Connected") 
     MsgBox("Connected To " + Client.Client.RemoteEndPoint.ToString) 
    Else 
     MsgBox("Currently Not Connected. Trying To Connect...") 
     Try 
      Client.Connect(ServerIP, Port) 
      MsgBox("Connected") 
      Client.GetStream.BeginRead(New Byte() {0}, 0, 0, AddressOf Reading, Nothing) 
     Catch ex As Exception 
      MsgBox("Could Not Connect To Server. Check Server." + ex.Message.ToString) 
     End Try 
    End If 
End Sub 


Private Sub SendData(ByVal Message As String) 'Sends Data to Server 
    TextBox1.Text = Message 
    Try 
     If Client.Connected = True Then 
      Dim Writer As New StreamWriter(Client.GetStream) 
      Writer.WriteLine(Message) 
      Writer.Flush() 
     Else 
      MsgBox("Cannot Send Message. Connection To Server Is Not Active.") 
     End If 
    Catch ex As Exception 
     MsgBox("You Are Not Connected To The Server." + vbCrLf + ex.Message.ToString) 
    End Try 
End Sub 


Private Sub ButtonConnect_Click(sender As Object, e As EventArgs) Handles ButtonConnect.Click 
    Connect(TextBoxIPAddress.Text, TextBoxPort.Text) 
End Sub 

Private Sub ButtonSendMessage_Click(sender As Object, e As EventArgs) Handles ButtonSendMessage.Click 
    SendData("MESSAGE|" & TextBoxMessage.Text) 
End Sub 

Private Sub Client_Load(sender As Object, e As EventArgs) Handles MyBase.Load 
    CheckForIllegalCrossThreadCalls = False 
End Sub  


Private Sub Button7_Click(sender As Object, e As EventArgs) Handles Button7.Click 
    SendData("DISCONNECT|") 
    Client.Close() 
    Client = New TcpClient 
End Sub 

End Class 

回答

-1

我不知道这个问题,但我可以给你一些hypothesizes,首先你在每个客户端添加处理程序您连接在服务器一侧,这意味着多个指针指向同一地点,其次当您连接到服务器和重新连接你居然不告诉服务器,这两个客户是一样的,所以,他提出两个渠道在客户端和服务器之间,首先是一个没有关闭,他仍然有处理器,服务器不认识到第一个是断开,因为他连接!即使它在客户端的另一个对象。因此,当客户端断开,从服务器断开他太多,或者在每次循环如果客户已经接受做这个测试之前连接测试。

+0

我该怎么做。我曾尝试使用方法断开client.client – 2014-11-05 09:22:53

+0

@CharlesJohnson我认为你应该打电话关闭 看到这个链接http://stackoverflow.com/questions/14159150/disconnect-a-client-from-server-tcp – 2014-11-05 14:00:35

-1

因为我有一个类叫“ConnectedClient”。我能够打电话给特定客户或所有客户,并关闭/销毁连接。