Hi friends
I am new to VB.NET...
Can you please solve the run time error of "
NullReferenceException" in following code which was generated due to object "tcpLsn" in "WatingForClient".
Why "Object reference not set to an instance of an object." ???
==============================================================================
Imports System.Net.Sockets
Imports System.Text
Imports System.Net
Imports System.Threading
Public Class Form1
Dim tcpLsn As TcpListener
Dim sckt As Socket
Dim SocketHolder As New Hashtable()
Dim ThreadHolder As New Hashtable()
Dim UserHolder As New Hashtable()
Dim fThd As Threading.Thread
Dim ConnectID As Integer = 0
Dim KeepUser As Boolean
Dim MaxConnected As Integer = 400
Public Sub New()
InitializeComponent()
Dim ipAddress As IPAddress = Dns.GetHostEntry("localhost").AddressList(0)
Dim tcpLsn = New TcpListener(ipAddress, 8002)
tcpLsn.Start()
MessageBox.Show("Server Started")
Dim tcpThd = New Thread(New ThreadStart(AddressOf WaitingForClient))
ThreadHolder.Add(ConnectID, tcpThd)
tcpThd.Start()
End Sub
Public Sub WaitingForClient()
While (True)
Dim sckt As Socket = tcpLsn.AcceptSocket()
If ConnectID < 10000 Then
ConnectID += 1
Else
ConnectID = 1
End If
If (SocketHolder.Count < MaxConnected) Then
While (SocketHolder.Contains(ConnectID))
Interlocked.Increment(ConnectID)
End While
Dim td = New Thread(New ThreadStart(AddressOf ReadSocket))
SocketHolder.Add(ConnectID, sckt)
ThreadHolder.Add(ConnectID, td)
td.Start()
End If
End While
End Sub
Public Sub ReadSocket()
Dim realId As Integer = ConnectID
Dim Ind As Integer = -1
Dim s As Socket = SocketHolder(realId)
While (True)
If (s.Connected) Then
Dim receive(37) As Byte
Try
Dim ret = s.Receive(receive, receive.Length, 0)
If (ret > 0) Then
Dim tmp As String = Nothing
tmp = System.Text.Encoding.ASCII.GetString(receive)
If (tmp.Length > 0) Then
Dim strArry() = tmp.Split(":")
Dim code As Integer = CheckUserInfo(strArry(0))
If (code = 2) Then
UserHolder.Add(realId, strArry(0))
ElseIf (code = 1) Then
Dim connFail As String = String.Format(":The user {0} is connected already", strArry(0))
Dim byteData() As Byte = System.Text.Encoding.ASCII.GetBytes(connFail.ToCharArray())
s.Send(byteData, byteData.Length, 0)
s.Close()
ElseIf (code = 0) Then
Dim connFail As String = String.Format(":The user {0} is invalidate", strArry(0))
Dim byteData() As Byte = System.Text.Encoding.ASCII.GetBytes(connFail.ToCharArray())
s.Send(byteData, byteData.Length, 0)
s.Close()
End If
End If
Else
KeepUser = False
End If
Catch
If Not (s.Connected) Then
KeepUser = False
End If
End Try
End If
End While
CloseTheThread(realId)
End Sub
Private Function CheckUserInfo(ByVal userID As String)
If (True) Then
If (UserHolder.ContainsValue(userID)) Then
KeepUser = True
Return 1
End If
End If
Return 2
End Function
Private Sub CloseTheThread(ByVal realId)
If Not (KeepUser) Then
UserHolder.Remove(realId)
End If
Dim thd = ThreadHolder(realId)
SocketHolder.Remove(realId)
ThreadHolder.Remove(realId)
If (thd.IsAlive) Then
thd.Abort()
End If
End Sub
Private Sub SendDataToAllClient(ByVal str)
For Each sKey In SocketHolder.Keys
Dim s As Socket = SocketHolder(sKey)
If (s.Connected) Then
Dim byteData() As Byte = System.Text.Encoding.ASCII.GetBytes(str.ToCharArray())
Try
s.Send(byteData, byteData.Length, 0)
Catch
CloseTheThread(sKey)
End Try
End If
Next
End Sub
End Class
[edit]Code block added - OriginalGriff[/edit]