TCP侦听器出现问题 [英] Problem With TCP Listener
本文介绍了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屋!
查看全文