我的编程技巧非常基础。我试图在Visual Basic Express 2008中使用UDP创建客户端/服务器通信程序。 它是我写的另一个应用程序发送的消息的简单接收器。
问题是它从1台计算机接收时工作正常。如果我有两台或更多台计算机发送,它会在Invoke行中定期抛出异常。
以下是代码:
Private Sub MigraReceiver_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
StartListening()
End sub
Private Sub ProcessPacket(ByVal ar As IAsyncResult)
Dim Data As Byte()
SyncLock UDPReadLock
Try
Data = ListenSocket.EndReceive(ar, New System.Net.IPEndPoint(System.Net.IPAddress.Any, 0))
Catch ex As Exception
' Handle any exceptions here
Finally
Try
UDPSyncResult = ListenSocket.BeginReceive(AddressOf ProcessPacket, UDPState)
Catch ex As Exception
' Do nothing
End Try
End Try
End SyncLock
' Only attempt to process if we received data
If Data.Length > 0 Then
Dim Thread As New System.Threading.Thread(AddressOf SetText)
Thread.Start(System.Text.Encoding.Unicode.GetString(Data))
'SetText(System.Text.Encoding.Unicode.GetString(Data))
End If
End Sub
Private Sub StartListening()
Try
ListenSocket = New System.Net.Sockets.UdpClient
ListenSocket.Client.SetSocketOption(Net.Sockets.SocketOptionLevel.Socket, Net.Sockets.SocketOptionName.ReuseAddress, True)
ListenSocket.Client.Bind(New System.Net.IPEndPoint(System.Net.IPAddress.Any, listenPort))
UDPSyncResult = ListenSocket.BeginReceive(AddressOf ProcessPacket, UDPState)
Catch ex As Exception
'Handle an exception
End Try
End Sub
Private Delegate Sub SetTextDelegate(ByVal [text] As String)
Private Sub SetText(ByVal text As String)
Dim espera_ordem As Integer = 0
If Me.TabControl1.InvokeRequired Then
'THIS IS WHERE IT THROWS THE EXCEPTION:
Me.TabControl1.Invoke(New SetTextDelegate(AddressOf SetText), New Object() {text})
Else
'Does GUI updates.
End if
End Sub
它会抛出一个异常'Array out of bounds' Me.TabControl1.Invoke(New SetTextDelegate(AddressOf SetText),New Object(){text}) 线。
我一直在尝试,测试和搜索3天没有成功:( 当我在短时间内收到几个数据包时,似乎会出现问题。
任何帮助将不胜感激。感谢。
此致 麦克
P.S。 - 这是完整的SetText:
Private Sub SetText(ByVal text As String)
Dim espera_ordem As Integer = 0
If Me.InvokeRequired Then
Me.Invoke(New SetTextDelegate(AddressOf SetText), New Object() {text})
Else
Dim partes() As String
Dim subpartes() As String
Dim login, maquina, mensagem As String
partes = text.Split("-")
subpartes = partes(0).Split(" ")
maquina = Trim(subpartes(3))
login = Trim(subpartes(4))
mensagem = Trim(partes(1))
Dim myIndex As Integer = logins.IndexOf(login)
If myIndex = -1 Then
TabControl1.Visible = True
Dim NewTab As New TabPage
NewTab.Name = login + "_tab"
Dim text1 As New TextBox
text1.Name = login + "_txt"
text1.Multiline = True
text1.ScrollBars = ScrollBars.Vertical
text1.Size = New Size(570, 220)
Me.TabControl1.Controls.Add(NewTab)
NewTab.Controls.Add(text1)
Dim but1 As New Button
but1.Name = login + "_btn"
but1.Location = New Point(3, 234)
but1.Text = "Ai"
but1.Visible = False
AddHandler but1.Click, AddressOf Me.but1_Click
NewTab.Controls.Add(but1)
NewTab.Text = maquina + " " + login
logins.Add(login)
text1.Text = Now.ToString("t") + " - " + mensagem
NewTab.Select()
Else
Dim tb1 As TextBox = CType(TabControl1.TabPages.Item(TabControl1.TabPages.Count - 1).Controls.Find(login + "_txt", True)(0), TextBox)
tb1.Text = tb1.Text + Environment.NewLine + Now.ToString("t") + " - " + mensagem
End If
End if
End Sub
答案 0 :(得分:0)
好的,这对评论来说太长了,所以我不得不做出回答。对于其他任何阅读的人来说,这都是关于OP的评论。
我知道你说你检查text
不是空的,或者是空的,但是你在检查它是否有短划线和空格?以下代码;
partes = text.Split("-")
subpartes = partes(0).Split(" ")
maquina = Trim(subpartes(3))
login = Trim(subpartes(4))
mensagem = Trim(partes(1))
假设您有一个破折号和空格来分割数据。如果没有,您将获得Index was outside the bounds of the array
例外。
要测试,试试这个;
Try
partes = text.Split("-")
subpartes = partes(0).Split(" ")
maquina = Trim(subpartes(3))
login = Trim(subpartes(4))
mensagem = Trim(partes(1))
Catch ex As Exception
MessageBox.Show(ex.Message, "SPLITTING FAILED!!")
End Try
这应该会帮助你一路走来!