如果我在没有客户端连接到服务器的情况下取消监听,TCP / IP就会冻结

时间:2015-08-18 01:46:39

标签: vb.net sockets tcp listener

我有一个可以收听一个或多个客户端的工作TCP / IP服务器,它运行良好!它可以从一个客户端接收和发送数据。

我的问题是每当我点击listen按钮然后un-listen再次点击我的应用freeze按钮时。从freeze释放我的应用程序的唯一方法是在我的系统仍在un-listening的过程中连接另一个客户端。

第二个问题涉及从多个客户端接收数据,是的,它可以监听并允许多个客户端连接到服务器,但它没有收到客户端发送的所有消息,它只接收第一个客户端的消息

以下是我的系统 look 之类的内容。

enter image description here

这是我的 code

Imports System.Net.Sockets
Imports System.Net
Imports System.Threading 'Imports Threading Namespace
Imports System.Text
Imports System.Reflection

Public Class Form1


    Dim stream As NetworkStream
    Dim client As TcpClient
    Dim port As Int32
    Dim localAddr As IPAddress = IPAddress.Any
    Dim server As TcpListener
    Dim tcpClientThread As System.Threading.Thread
    Dim PublicIP = String.Empty 'The IP and Port of the Client that connects to port 7700

    Private Sub Tcpclient()
        port = NUD_Tcp_Port.Value
        ' The statement of TCPClient function
        server = Nothing

        ' Buffer for reading data 
        Dim bytes(1024) As Byte
        Try
            server = New TcpListener(localAddr, port) 'Set the TcpListener on port 13000. 
            server.Start() 'Start listening for client requests.

            writeData(Server_IP_Port) 'Outputs the server's ip and port listening

            'Perform a blocking call to accept requests. 
            'You could also user server.AcceptSocket() here. 
            client = server.AcceptTcpClient()
            writeData("Connected: " & Client_IP_Port())

            Dim data As String = Nothing 'The data we received from client, set the default value to nothing
            stream = client.GetStream() 'Get a stream object for reading and writing 

            Dim i As Int32 = stream.Read(bytes, 0, bytes.Length) 'Loop to receive all the data sent by the client.

            While (i <> 0)
                'Translate data bytes to a ASCII string.
                data = Encoding.ASCII.GetString(bytes, 0, i)
                writeData("Received: " & data)
                'Process the data sent by the client.
                data = data.ToUpper()
                Dim msg As Byte() = Encoding.ASCII.GetBytes(data)
                i = stream.Read(bytes, 0, bytes.Length)
            End While


        Catch haha As SocketException
            Console.WriteLine("SocketException: {0}", haha)
        Finally
            'server.Stop()
        End Try
    End Sub

    Function Client_IP_Port() As String 'Gets the IP and port number of clients who connected to our server
        If PublicIP = String.Empty Then
            Try
                ' Get the clients IP address using Client property            
                Dim ipend As Net.IPEndPoint = client.Client.RemoteEndPoint
                If Not ipend Is Nothing Then
                    PublicIP = ipend.Address.ToString & " : " & ipend.Port.ToString
                End If
            Catch ex As System.ObjectDisposedException
                PublicIP = String.Empty
            Catch ex As SocketException
                PublicIP = String.Empty
            End Try
        End If
        Return PublicIP
    End Function

    Function Server_IP_Port() 'Get the IP and port number of server that it listens
        Dim IPListening = IPAddress.Parse(CType(server.LocalEndpoint, IPEndPoint).Address.ToString()).ToString
        Dim PortListening = CType(server.LocalEndpoint, IPEndPoint).Port.ToString()
        If IPListening = "0.0.0.0" Then
            IPListening = "any IP Address"
        End If
        Return "Listening on " & IPListening & " : " & PortListening
    End Function

    Private Sub Tcp_Send(Msg_Send As String)

        Dim sendBytes As [Byte]() = Encoding.ASCII.GetBytes(Msg_Send)
        stream.Write(sendBytes, 0, sendBytes.Length)
        writeData("Sent: " & Msg_Send)
    End Sub

    Public Sub StopListen() 'Function to telll to the server to stop listening
        Try
            client.Close()
        Catch err As Exception
            Console.WriteLine(err)
        End Try

        tcpClientThread.Abort()

        server.Stop()
        Btn_Listen.Text = "Listen"
    End Sub

    Private Sub Btn_Listen_Click(sender As Object, e As EventArgs) Handles Btn_Listen.Click
        If Btn_Listen.Text = "Listen" Then
            tcpClientThread = New System.Threading.Thread(AddressOf Me.Tcpclient)
            tcpClientThread.Start()
            Btn_Listen.Text = "Close"
        Else
            StopListen()
        End If
    End Sub

    Private Sub writeData(ByVal data As Object)
        If InvokeRequired Then
            Invoke(New Action(Of Object)(AddressOf writeData), data)
        Else
            RichTextBox1.AppendText(Environment.NewLine & data)
        End If
    End Sub

    Private Sub Btn_Send_Click(sender As Object, e As EventArgs) Handles Btn_Send.Click
        Tcp_Send(TB_Tcp_Send.Text)
    End Sub

End Class

0 个答案:

没有答案