2014-11-05 196 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」。我能夠打電話給特定客戶或所有客戶,並關閉/銷燬連接。