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
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