2014-11-05 2 views
-1

У меня есть клиентское и серверное приложение.Tcp Client/Server - выпуск сообщений клиента

У меня клиент отключается от сервера с 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

я не уверен, что об этой проблеме, но я могу дать вам несколько гипотез, во-первых, вам добавьте обработчик на каждый клиент, вы подключаетесь к серверу стороне, и это означает, что указатель на одно и то же место, во-вторых, при подключении к серверу и повторно подключите вы на самом деле не говорите сервера, что два клиент одинаков, так что сделать два каналов между клиентом и сервером, первым является старым один, что не закрывал, и он до сих пор иметь обработчик на нем, сервер не признает, что первый отключен, потому что он подключен! даже если его другой объект у клиента. поэтому, когда клиент отсоединяется, отсоединить его отсервера тоже или каждый цикл тест, если клиенты подключены, прежде чем принимать этот тест.

+0

как это сделать. Я пробовал использовать методы для отключения client.client –

+0

@CharlesJohnson Я думаю, вам стоит позвонить Закрыть см. Эту ссылку http://stackoverflow.com/questions/14159150/disconnect-a-client-from-server-tcp –

-1

Поскольку у меня есть класс, называемый «ConnectedClient». Мне удалось позвонить на этот конкретный клиент или всех клиентов и закрыть/уничтожить соединение.

Смежные вопросы