TCP侦听器出现问题 [英] Problem With TCP Listener

查看:122
本文介绍了TCP侦听器出现问题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

你好,
我正在研究一种简化创建聊天客户端的过程的结构.该代码旨在处理侦听连接和建立连接(基本上是服务器和客户端)的过程.该代码包含一些用于测试的Messagebox Show事件.但是,我一直遇到NullReferenceException.有人可以帮忙吗?帮助将不胜感激. :-)

Hello,
I am working on a structure that simplifies the process of creating a chat client. The code is designed to handle both listening for a connection and making a connection (its basically a server and a client). The code contains some Messagebox Show events which were used for testing. However, I keep running into a NullReferenceException. Can anyone help? Help would be very appreciated. :-)

Imports System.Net
Imports System.Net.Sockets

Public Class Form1

    Public Structure StringChat
        Private client As TcpClient
#Region "Listening"
        Private islisten As Boolean
        Private lst As TcpListener
        Dim lt As Timer
        Function Startlistening(ByVal hostip As IPAddress, ByVal portnumber As Integer)
            If Cn = True Or islisten = True Then
                Return False
                Exit Function
            End If
            Try
                lst = New TcpListener(hostip, portnumber)
                lst.Start()
                islisten = True
                MsgBox(lst.Pending())
                lt.Start()
                role = "Listener"

                Return True
            Catch ex As Exception
                Return False
            End Try
        End Function

        Sub Stoplistenin()
            islisten = False
            lt.Enabled = False
            lst.Stop()
        End Sub
        Private Sub lisen(ByVal sender As Object, ByVal e As System.EventArgs)
            islisten = True
            If islisten = True Then

                'Null Reference Exception happens here
                If lst.Pending() = True Then
                    MessageBox.Show("Connecting")
                    client = lst.AcceptTcpClient
                    role = "Listener"
                    client.Client.BeginReceive(msg, 0, 1024, SocketFlags.None, AddressOf BeginRecieve, Nothing)
                End If
              
            End If
        End Sub
#End Region

#Region "Client"
        Sub Disconnect()
            If Cn = True Then
                Writemessage("*(DISCONNECT)*")
                client.Client.Disconnect(True)
                tm.Enabled = False
                RaiseEvent OnDisconnect(DateTime.Now)
            End If

        End Sub

        Function Connect(ByVal hostname As String, ByVal portnumber As Integer, ByVal password As String) As Boolean
            If Cn = True Or islisten = True Then
                Return False
                Exit Function
            End If
            If My.Computer.Network.Ping(hostname) = False Then
                Return False
                Exit Function
            End If
            Try
                client = New TcpClient(hostname, portnumber)

                client.Client.BeginReceive(msg, 0, 1024, SocketFlags.None, AddressOf BeginRecieve, Nothing)
                Return True
                If password = Nothing = False Then

                    Writemessage(password)
                Else
                    Writemessage("ACTIVATE()")
                End If
                role = "Connector"
                tm.Enabled = True
            Catch ex As Exception
                Return False
            End Try

        End Function

#End Region

        Dim tm As Timer

        Sub New(ByVal Listen As Boolean)
            Dim ms(1024) As Byte
            msg = ms
            tm = New Timer()
            AddHandler tm.Tick, AddressOf tm_Tick
            lt = New Timer()
            AddHandler lt.Tick, AddressOf lisen

        End Sub

        Private Sub tm_Tick(ByVal sender As Object, ByVal e As System.EventArgs)
            If msk = Nothing = False Then
                RecieveMessage(msk)
                msk = Nothing
            End If
        End Sub
#Region "MessageHandlers"
        Private msg() As Byte
        Private msk As String
        Private Sub BeginRecieve(ByVal i As IAsyncResult)
            msk = System.Text.Encoding.ASCII.GetString(msg)
            Dim ms(1024) As Byte
            msg = ms
            If Cn = True Then
                client.Client.BeginReceive(msg, 0, 1024, SocketFlags.None, AddressOf BeginRecieve, Nothing)
            End If
        End Sub
        Private Sub RecieveMessage(ByVal ms As String)

            If ms = "*(DISCONNECT)*" Then

                tm.Enabled = False
                If Cn = True Then
                    RaiseEvent OnDisconnect(DateTime.Now)
                End If
                Cn = False
                Exit Sub
            End If
            If ms = "*(ACCEPTED)*" Then
                Cn = True
                tm.Enabled = True
                Exit Sub
            End If
            If role = "Listener" Then
                If ra = True Then
                    If Passcde = ms Then
                        Writemessage("*ACCEPTED)*")
                        Cn = True
                        tm.Enabled = True
                    Else
                        Writemessage("*(DISCONNECT)*")
                        client.Client.Disconnect(True)
                        tm.Enabled = False
                        RaiseEvent OnDisconnect(DateTime.Now)
                    End If
                Else
                    Writemessage("*ACCEPTED)*")
                    Cn = True
                    tm.Enabled = True
                End If
                Exit Sub
            End If
            RaiseEvent RecievedMessage(ms)
        End Sub

        Function Writemessage(ByVal Message As String) As Boolean
            If Cn = True Then
                Try
                    Dim sw As New IO.StreamWriter(client.GetStream())
                    sw.Write(Message)
                    sw.Flush()
                    sw.Dispose()

                    Return True
                Catch ex As Exception

                    Return False
                End Try
            Else

                Return False
            End If

        End Function
#End Region

#Region "Properties"
        Event RecievedMessage(ByVal Message As String)
        Event OnDisconnect(ByVal timestamp As DateTime)
        Private ra As Boolean
        Private Passcde As String
        Private Cn As Boolean
        Private role As String
        Property RequireAuthentication() As Boolean
            Get
                Return ra
            End Get
            Set(ByVal value As Boolean)
                ra = value
            End Set
        End Property
        Property Passcode() As String
            Get
                Return Passcde
            End Get
            Set(ByVal value As String)
                Passcde = value
            End Set
        End Property
        ReadOnly Property Islistening() As Boolean
            Get
                Return islisten
            End Get
        End Property
        Property Connected() As Boolean
            Get
                Return Cn
            End Get
            Set(ByVal value As Boolean)
                Cn = value
            End Set
        End Property
#End Region

    End Structure


    Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        Dim st1 As New StringChat(False)
        Dim st2 As New StringChat(False)
        AddHandler st2.RecievedMessage, AddressOf rmessage
        AddHandler st1.OnDisconnect, AddressOf disconnected
        st2.RequireAuthentication = True
        st2.Passcode = "1234"
        st2.Startlistening(Dns.GetHostEntry(Dns.GetHostName()).AddressList(1), 18000)
      
        If st1.Connect("192.168.1.65", 18000, Nothing) = True Then
            MessageBox.Show("Connected")
        Else
            MessageBox.Show("Failed To Connect")
        End If

    End Sub
    Private Sub rmessage(ByVal msg As String)
        MessageBox.Show("INBOX:" & msg)
    End Sub
    Private Sub disconnected(ByVal ts As DateTime)
        MessageBox.Show("Lost Connection", "Warning")
    End Sub
End Class

推荐答案

NullReferenceException
当您尝试使用为空的对象的属性时,会发生此错误.更多详细信息:此处 [
NullReferenceException
This error happens when you try to use a property of an object that is null. More details: here[^]

A simple use of Visual studio DEBUGGER can tell you the object because of which it is happening. Just look at the stack trace and put a debugger on that line. Check the objects of that line and see if any one is null and you are trying to use that objects property. Handle the same.


这篇关于TCP侦听器出现问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆